Loom Unity SDKのサンプルを動かしてみる

この記事は、[Unityゆるふわサマーアドベントカレンダー 2018](https://qiita.com/splas_boomerang/items/e6619fb1e6dd92fd231f) 20日目の記事です。

最近、ブロックチェーンが流行ってますね！
ブロックチェーンを使ったアプリケーションのことを分散型アプリケーション(DApps)と呼びますが、UnityでもDApps開発ができることをご存知でしたでしょうか。
今回はUnityでDApps開発するための便利なSDKである **[Loom Unity SDK](https://loomx.io/developers/docs/en/unity-sdk.html)** を紹介しようと思います。

※この記事ではブロックチェーンやDAppsについての詳しい説明はしません。

# Loom Unity SDKとは？
Loom Unity SDKは、Loom Networkが提供しているUnity向けのSDKです。

Loom NetworkはEthereumのスケーリング問題を解決したプラットフォームであり、提供されるSDKを用いることで簡単にDAppsを開発することができます。
参考: [Loom Networkについて知っておくべき全てのこと](https://medium.com/loom-network-japanese/loom-network%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8F%E3%81%B9%E3%81%8D%E5%85%A8%E3%81%A6%E3%81%AE%E3%81%93%E3%81%A8-564a83027f0f)

# サンプルを実行してみる
Loom Unity SDKには、サンプルとしてメッセージをsetしてgetするだけの簡単なアプリケーションが用意されています。
以下のドキュメントには、サンプルコードの解説と、実行方法が記載されています。
https://loomx.io/developers/docs/en/unity-sdk.html ([日本語版](https://loomx.io/developers/docs/ja/unity-sdk.html)もあります)

実行方法を順番に見ていきましょう。

## 1. サンプルシーンを起動する
まずLoom Unity SDKのリポジトリをcloneしてきましょう。

```
$ git clone https://github.com/loomnetwork/unity3d-sdk.git
```

サンプルシーンは [unity3d-sdk/UnityProject/Assets/LoomSDK/Samples/QuickStart/](https://github.com/loomnetwork/unity3d-sdk/tree/master/UnityProject/Assets/LoomSDK/Samples/QuickStart) にあります。
(ドキュメント内のサンプルへのリンクはURLが間違っていて開きませんが、↑のリンクが正しいリンクです)

Finderなどで `LoomQuickStartScene.unity` を開きしょう。すると、GameObjectだけのシンプルなシーンが表示されます。
<img width="951" alt="スクリーンショット 2018-08-19 18.10.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/52234/ddf77a0a-67a7-3256-d0cc-661d4e398cce.png">
このGameObjectにアタッチされている `LoomQuickStartSample` というスクリプトに一連の処理が書かれているため、自分でオブジェクトや処理を追加する必要はありません。

この状態ではまだDAppチェーン(サンプルアプリケーション用のブロックチェーン)が起動していないので、実行してもエラーがでてしまいます。

## 2. ブロックチェーンを起動させる
以下のドキュメントの手順通りにセットアップを行い、DAppチェーンを起動させましょう。
https://loomx.io/developers/docs/en/prereqs.html ([日本語版](https://loomx.io/developers/docs/ja/prereqs.html)もあります)

```
$ ../../loom run
I[08-19|10:15:43.609] Using simple log event dispatcher
I[08-19|10:15:44.653] Starting RPC HTTP server on tcp://127.0.0.1:9999 module=query-server
```

## 3.1 サンプルを実行する
Unityエディター上でアプリケーションを実行させましょう。
ゲーム画面はなにも変化はありませんが、以下のような出力を得ることができます。
<img width="1174" alt="スクリーンショット 2018-08-20 0.58.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/52234/f2980922-a2a9-9c93-8b5a-ca1f0948bf4c.png">

`BluePrint`という名前のスマートコントラクトを準備して、nonceを取得し、トランザクションを発行し、キー/バリューのセットをブロックチェーンに保存し、再度とってくる
という流れがRequestとResponseの様子から見て取れます。

これだとインタラクションがなくてつまらないですよね...
このサンプルにボタンをつけたのが、 `Demo` シーンです

## 3.2 デモを実行する
`Demo`シーンを開くと以下のような画面が表示されます。
<img width="661" alt="スクリーンショット 2018-08-20 22.11.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/52234/4a5698ab-992d-3160-d64e-684da93e91f2.png">

先ほどのサンプルでは自動で実行されていた各処理がボタンになっています。
このシーンを実行して、例えば「Sign in」→「Call SetMsg」→「Call GetMsg」の順でボタンを押すと、サンプルと同じ状況になり `{ "key": "123", "value": "hello" }`の値を取得することができます。

<img width="260" alt="スクリーンショット 2018-08-20 22.45.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/52234/f906113b-2362-bd51-31d2-a569bbc8c85c.png">

### 謎なところ
「Transfer」ボタンは押しても `AssetTransfer.TransferAsset` メソッドが読み込まれずにうまく動作しませんでした... :thinking:
原因がわかったらp-r投げてもいいのかもしれません。

さらに、デフォルトではカメラに映ってないのですが、実はひそかにcubeが設置されていることにお気づきでしょうか。
<img width="661" alt="スクリーンショット 2018-08-20 22.11.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/52234/8ec249c9-8e0e-57c8-ac5f-f7a5954a7967.png">
これをカメラに映るように場所を移動させると、、、

![cube.gif](https://qiita-image-store.s3.amazonaws.com/0/52234/c068e012-67da-3e6a-9772-fec6a63847d9.gif)

くるくる回ります。それだけです。ボタンを押してもなにも変わりません。
いったいなんの意味があるのでしょう...

# まとめ
Loom Unity SDKをサンプルを通して試してみました。
ブロックチェーンへの値のsetからgetまでを簡単なスクリプトを書くだけでできるので、すぐにでもゲームに取り入れられそうですね。
[ソースコード](https://github.com/loomnetwork/unity3d-sdk)や[ドキュメント](https://github.com/loomnetwork/loom-sdk-documentation)はGitHubに公開されているので、なにか見つけたらp-rを送ってみるといいかもしれません。