はじめに
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を変形させても自動的に変更してくれる!