はじめに
https://t.co/1seClXcvJo
— ようさん (@ayousanz) 2022年5月7日
UnityRoomに公開しました
移動できるだけです pic.twitter.com/lB8jYR9G57
こちらを作った際のいろいろな技術検証メモです
成果物
UniryRoomにも公開しています。
やったこと
- URPを使った ライト表現
- マルチシーン及びDIコンテナを使った際のInputSystemのプレイヤー操作
- sprite shapeを使ったマップ作製
使用したアセット
マップ・キャラクターには以下のアセットを使わせていただいています。
内容
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を変形させても自動的に変更してくれる!
