サイドビューゲームでのURPでのライト表現とマルチシーン・DIコンテナを使ったInputSytemの実装【Unity,URP】

はじめに

こちらを作った際のいろいろな技術検証メモです

成果物

youtu.be

UniryRoomにも公開しています。

unityroom.com

やったこと

  • URPを使った ライト表現
  • マルチシーン及びDIコンテナを使った際のInputSystemのプレイヤー操作
  • sprite shapeを使ったマップ作製

使用したアセット

マップ・キャラクターには以下のアセットを使わせていただいています。

assetstore.unity.com

assetstore.unity.com

内容

URPを使ったライト表現

こちらのライト表現の実装方法です。

以下のように Unity URP 2DのSpot Lightを使っています。

マルチシーン及びDIコンテナを使った際のInputSystemのプレイヤー操作

シーン構成は、以下のようになっています。

また以下のような流れでシーンをロードしています。 1. Playerシーンをロード 2. Townシーンをロード 3. ワープポイントに移動すると Caveシーンをロード 4. 2 ~3のループ

シーンのロードはマルチシーンを導入しているため、 LoadSceneMode.Additive で行っています。 また自然な位置での遷移移動を実現したかったので、各シーンのワープポイントは以下ようにほぼ同じ位置に設定しています

このときに各シーンので InputSytemのAction Mapa及びシーン遷移は以下のように実装しました。

        public static void SwitchStage(SideGameInputActions sideGameInputActions)
        {
            var currentStageCount = SceneManager.sceneCount;
            for (var sceneIndex = 0; sceneIndex < currentStageCount; sceneIndex++)
            {
                var currentStage = SceneManager.GetSceneAt(sceneIndex);
                switch (currentStage.name)
                {
                    case "Town":
                        SceneManager.LoadSceneAsync("Cave", LoadSceneMode.Additive);
                        SceneManager.UnloadSceneAsync("Town");
                        sideGameInputActions.Cave.Enable();
                        sideGameInputActions.Town.Disable();
                        break;
                    case "Cave":
                        SceneManager.LoadSceneAsync("Town", LoadSceneMode.Additive);
                        SceneManager.UnloadSceneAsync("Cave");
                        sideGameInputActions.Town.Enable();
                        sideGameInputActions.Cave.Disable();
                        break;
                }
            }
        }

またワープポイントが同じ位置にあり、加算シーンロードを行っています。そのため同一シーンの多重ロードが起きる問題が起きたため、ロード処理は UniRxの ThrottleFirst を使用して一定秒間シーン処理をされないように制限をかけています。

            _playerMove.Collider2D.OnTriggerEnter2DAsObservable()
                .Where(tag => tag.CompareTag("Respawn"))
                .ThrottleFirst(TimeSpan.FromSeconds(5f))
                .Subscribe(_ => { LoadScene.SwitchStage(_inputActions); }).AddTo(_disposables);

sprite shapeを使ったマップ作製

マップにおける変形した画像の実装には、Sprite Shapeを使っています。

当たり判定は、Colliderの追加と以下の設定でやってくれるみたいです。
しかも、コライダー追加後に Spriteを変形させても自動的に変更してくれる!

blog.unity.com

gamedev65535.com