Unity:階移動(ローグライクを自分なりの解釈で作ってみる)
概要
- シーンを切り替えずに階を移動したい.
完成図
レイヤーを切り替える
配列を全く新しいものに切り替えてあげます.もちろんその際過去に前レイヤーのオブジェクトは全て削除します.
削除する際にわざわざ全てのオブジェクトを検索して削除するのは面倒です.なので空オブジェクトの子要素としてオブジェクトを生成し, 削除する際は「空オブジェクトの子要素全て削除!」で済ませるようにします.
qiita.com 上記の記事から引用
public void DeleteStage(){ foreach (Transform n in ParentObj.transform) { Destroy(n.gameObject); } }
もちろんオブジェクトを生成する際は空オブジェクトの子要素に追加していきます
public void CreateStage(){ for (int i = 0; i < sm.stageArray.GetLength(0); i++) { for (int j = 0; j < sm.stageArray.GetLength(1); j++) { if (sm.stageArray[i, j] == 0) { var obj =Instantiate(floorBlock, new Vector3(i, -1, j), Quaternion.identity) as GameObject; obj.transform.parent = ParentObj.transform; } else { var obj = Instantiate(wallBlock, new Vector3(i, 0, j), Quaternion.identity) as GameObject; obj.transform.parent = ParentObj.transform; } } } }
ステージ遷移のタイミング
前章と似た処理になりますが,Playerのpositionと階段のpositionが一致したときにボタンUIを表示しています. ボタンをおすことによってStateManagerの状態を変更することによってレイヤーを切り替えます
ボタンの表示
if(sm.optionArray[playerPositionX,playerPositionY] == 1){ Debug.Log("階段の上に乗った"); stairsUI.SetActive(true); } else{ stairsUI.SetActive(false); sm.nowState = StateManager.GameState.EnemyTurn; }
ボタンによるステートチェンジ
public void nextStage(){ stairsUI.SetActive(false); Debug.Log("次の階へ"); sm.nowState = StateManager.GameState.CreateStageTurn; } public void stayStage(){ stairsUI.SetActive(false); sm.nowState = StateManager.GameState.EnemyTurn; }
階数によって配列を変更しステージを生成する
switch (nowState) { case GameState.CreateStageTurn: // 階数を1つ増やす rank++; switch(rank){ case 1: stageArray = new int[10, 10]{ {1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,1,1,1,1,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,1,1,1,1}, {1,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1} }; break; //2階 case 2: //割愛 break; } Debug.Log("ステージ作成"); mons.DeleteMonster(); mons.CreateMonster(); op.DeleteOption(); op.CreateOption(); stage.DeleteStage(); stage.CreateStage(); } }
csvファイルでMAPのデータを管理できるように後々修正入れます.