UnityのProject Tinyを使ってみた

QualiArts Advent Calendar 2019、13日目の記事になります。
#Project Tinyについて
UnityのProject Tinyはモバイルブラウザ向けのUnityです。小さく、軽く、早いUnityとして設計されており、現行のUnityとはかなり異なったものになっています。現状0.16.1-previewが最新ですが、公開が一時停止されており、普通にPackage Managerからは見つけることができません（現行のダウンロード方法については後述します）。公式で、デモが公開されておりブラウザ上で動作が確認できます。
https://unity3d.com/tiny
起動してみると以下の様なパズルゲームのデモが確認できます。パズルのマスをドラッグ&ドロップで移動させることができ、3マス揃えると崩すことができる単純なゲームです。モバイルブラウザでも軽量に動きました。今後、Project Tinyがリリースされればこのようなブラウザで軽量に動くゲームが作れると思うと楽しみですね。
<img width="1658" alt="スクリーンショット 2019-12-12 10.12.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121360/78b9fd34-7502-aa4a-6d01-734942f466c4.png">

#Project Tinyの情報について
最新の情報については以下のフォーラムで確認することができます。
https://forum.unity.com/forums/project-tiny.151/
今後のProject Tinyについてですが、DOTSランタイム（Data-Oriented Technology Stack）に統合され、現行のUnityとは異なったランタイムとして提供されるようです。サポートされる環境はHTML5、プレイアブル広告、iOS&Android等になる予定です。
![dots_runtime.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121360/a848ae98-c959-2b25-b7a1-928c9635dea0.png)
上記画像の参照元スレッドはこちら https://forum.unity.com/threads/oct-2019-update-on-project-tiny-roadmap.754850/

#実際に使ってみた
次のpreviewで大きく変わってしまう可能性もありますが、現行のProject tinyを触ってみたいよという人のための備忘録です。自分はUnity2019.2.0b3を使いました。これ以降のUnityならば概ね大丈夫だと思います。一部依存関係のためにパッケージマネージャでデグレはする必要あるかもしれません。こちらのUnityでまずプロジェクトを作ります。ベースは2Dを選びました。
プロジェクトを作ったらPackages/manifest.jsonに以下の行を加えます
```
    "com.unity.tiny": "0.15.3-preview",
```
最初、試しに0.16.1-previewを試してみたのですが、シーンを読み込む際に「Open a Project before opening a Scene」というWarningが出て、シーンを開くことができませんでした。依存関係が壊れているらしく、次のpreviewを出すまで修正する予定は無いようです。Q4 2019に次のpreviewを出す予定ですが、これを書いている本日（12/10）時点ではまだ情報は確認できていません。

manifest.jsonを編集したあと、メニューからWindow>Package Managerで以下の画面が確認できます。
<img width="701" alt="スクリーンショット 2019-12-12 1.06.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121360/2381b66b-f3c2-9413-4942-07f26289aada.png">
これでProject Tinyがインストールされていれば大丈夫です。

#サンプルの実行
Package ManagerからいくつかのサンプルがDLできます。
試しに先程の画面からHelloWorldをインポートしてみましょう。インポートを行うと、Assets直下にSamplesというディレクトリができています。Samples/Project Tiny/0.15.3-preview/以下に以下のようなファイルがあるはずです。
<img width="210" alt="スクリーンショット 2019-12-12 1.09.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121360/f13901cd-8f54-e3d8-2968-f544d88fd824.png">
UnityのメニューにDOTSという項目が増えているはずなので、DOTS/Open Projectを実行し、HelloWorld以下のHelloWorld.projectを開きます。これを行うことでUnityがDOTSモードになります。この状態でScenesディレクトリのMainSceneを開くと以下のシーンが開きます。
<img width="628" alt="スクリーンショット 2019-12-12 1.13.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121360/48ac6c76-7dde-33b9-04c1-9f2f35cc4010.png">
初回は、Importの設定が開くかもしれません。その場合は、インポートしたあとに再度Open ProjectしないとMainSceneを開けないことがあります。この辺はまだpreview版なので挙動が不安定かもしれません。

シーンを開いたら環境をWeb（AsmJs）にし、再生するとビルドした後、webブラウザのhttp://localhost:19050/ で実行結果を確認できます。
#ComponentとComponentSystem
Project TinyはECS（Entity Component System）を利用しています。UnityでいうGameObjectにあたるものがEntityです。Entityの定義はIComponentDataを継承します。以下はSprite2DRendererの例です。色の定義、Sprite2DのEntityを含んでいます。

```C#:Sprite2DRenderer
    public struct Sprite2DRenderer : IComponentData
    {
        public static Sprite2DRenderer Default { get; } = new Sprite2DRenderer()
        {
            color = Color.Default
        };
        [EntityWithComponents(typeof(Sprite2D))]
        public Entity sprite;

        public Color color;

        public BlendOp blending;
    }
```
HelloWorldではこれを以下のようなComponentSystemを定義して以下の様なコードを動かしています。

```C#
public class RotateSpriteSystem : ComponentSystem
{
    protected override void OnUpdate()
    {
        var env = World.TinyEnvironment();
        Entities
            .WithAll<Sprite2DRenderer>()
            .ForEach((ref Rotation lclRot) =>
        {
            lclRot.Value = quaternion.RotateZ((float)env.frameTime);
        });
    }
}
```
Sprite2DRendererのEntityを取得し、それぞれを時間経過に応じて回転させるという処理を行っています。ForEachの中でTransformのRotationに当たる部分をとってきてQuaternionと時間経過の情報を使って回転値を計算しています。
また、他のDrag&Drop等のサンプルの実装を参考にすれば簡単なパズルゲームなどは作れそうです。またECSを使えば、多くの小さな計算を並列で高速に走らせることができるので例えばBoidsアルゴリズムのような群体を動かすようなアルゴリズムや小規模なAIを使って大量のキャラクターを動かすようなこともできるのではないでしょうか。
Project tinyのScripting Systemの公式ガイドは少し古いですが、以下のものを参照しました。
https://docs.unity3d.com/Packages/com.unity.tiny@0.13/manual/scripting.html

#最後に
Project Tinyは軽量に動作し、モバイルブラウザ等での動作が期待できる小さなUnityです。次のpreview版ないし、今後のバージョンでは3Dの動作も予定していますし、今はまだ不足感があるライブラリの充実化も楽しみです。今回、触ってみたもののECSの理解の足りなさや、ほしい機能が足りなかったことでなかなか思ったように動かせませんでしたが、デモやサンプルで実際の動作感を見る限り今後のアップデートには期待しています。触ってみて思ったのはECS等、今後のUnityで正式実装される機能を覚えないと性能を活かしきれないことが想定されるので、ECSの理解を深めておく必要があるでしょう。4Q 2019中にはまたフォーラムで動きがあると思うので、楽しみに待ちましょう。もし、興味があれば現行のバージョンも触ってみてください。

以上、QualiArts Advent Calendar 2019の12/13の記事でした。明日はthamminさんによる記事が投稿される予定です。

2019/12/13 追記
3Dがサポートされたようです
http://www.tiny.vision/TinyRacing/TinyRacing.html