Unity Entitiesが正式リリースされたのでマルチプレイチュートリアルを弄ってみる(その2)

前回の記事ではNetCode for Entitiesを触り、シンクライアントの挙動を実装する所までコードを書きました。 前回のプロジェクトに引き続き改造を加えてみます。

ビルドして実行してみる

前回、シンクライアントの挙動を実装しましたが、実際にマルチプレイが動作するか確認したい為、ビルドを行います。

サーバーのビルドは、ビルドプラットフォームをDedicated Serverにする事で可能です。

ただし、クライアント向けビルドに関しては、そのままWindowsプラットフォーム等でビルド実行するとサーバー機能を内包したホストクライアントとしてビルドされてしまうようです。

これを回避し、簡単に動作確認したいのであればScripting Define SymbolsにUNITY_CLIENTを定義すると完全なクライアントとしてビルドすることができます。

より細かく制御したい場合は、ClientServerBootstrapを継承しているGame.csをカスタマイズし、手動でCreateClientWorld()CreateServerWorld()を呼び出す事でサーバー/クライアントの処理分岐が実装可能です。

サンプルの実装ではデフォルトで同じPC上にあるサーバープログラムに接続しに行くので、サーバービルドとクライアントビルドを並べて起動することで簡単にマルチプレイの動作確認が行えます。

他のコンピュータに接続したい場合も、Game.csをカスタマイズしてDefaultConnectAddress を指定してやれば制御可能です。

キューブが移動方向を向くように変更してみる

これで最低限のマルチプレイが動作する事は確認できたので、ここから色々書き換えて少しづつゲームっぽくしていきます。

PlayerMovementSystemOnUpdateの中に、以下のように、何かしらの移動入力がされていたらその向きを向くようにコードを追加してみます。

[BurstCompile]
public void OnUpdate(ref SystemState state)
{
    var speed = SystemAPI.Time.DeltaTime * 4;
    var rotateSpeed = SystemAPI.Time.DeltaTime * 720;
    foreach (var (input, trans)
             in SystemAPI.Query<RefRO<PlayerInput>, RefRW<LocalTransform>>().WithAll<Simulate>())
    {
        var moveInput = new float2(input.ValueRO.Horizontal, input.ValueRO.Vertical);
        moveInput = math.normalizesafe(moveInput) * speed;
        trans.ValueRW.Position += new float3(moveInput.x, 0, moveInput.y);
        
        if (math.lengthsq(moveInput) > 0)
        {
            trans.ValueRW.Rotation =
                Quaternion.RotateTowards(
                    trans.ValueRO.Rotation,
                    quaternion.LookRotationSafe(new float3(moveInput.x, 0, moveInput.y), math.up()),
                    rotateSpeed);
        }
    }
}

Transformの制御周りのAPIはかなり充実しており、普通のUnityに近いノリで書ける印象です。

キューブをキャラクターに変更してみる

キューブのままでは味気ないので、見た目をSpace Robot Kyleに変更してみました。 こちらはUnity AssetStoreよりダウンロードできます。

assetstore.unity.com

Entities Graphicsパッケージの最新版は、実験的機能ながらSkinned Meshにも対応しているため、キューブと同様の手順で簡単にセットアップできます。

今のところHumanoid Animationには対応していないので棒立ちのままですが、マルチプレイで複数のキャラクターが移動する絵が出来ました。

今回はここまで

次回はキャラクターアニメーションの実装にチャレンジする予定です。

ただし、きちんとした実装は以下の様なアセットが既にあるので、テックブログの内容としてはアニメーションを動かす為のボーンや階層構造の話が主になるかと思います。

assetstore.unity.com

正式リリースされたEntitiesは、数々の強力なAPIにより最適化された複雑な処理を簡単に書けるようになってきていますが、一方で公式からサポートされている範囲はまだ狭く、その外側に踏み込むには覚悟が必要です。

勉強の為にもこれからいくつかの機能実装に挑戦してブログに載せていきたいと考えていますが、実プロダクトの観点では、Entitiesを導入する前に、今のEntitiesで目的となる表現が実現出来るかどうかをきちんと見極める必要がありそうです。