どうも、萬朶櫻(@wanduoying)、185朶目の記事です。
目次
ターンを制禦するスクリプトTurnManager.csを作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TurnManager : MonoBehaviour { public bool turn = false; private DungeonGenerator dungeonGenerator; //行動状態 private enum State { // プレイヤー Player_Turn, // キー入力待ち。もしくは待機中 // 敵 Enemy_Turn, // 実行中 }; private State StateNumber = State.Player_Turn; void Start() { dungeonGenerator = GameObject.Find("FieldGeneratorObj").GetComponent<DungeonGenerator>(); } void Update () { if (turn) { switch (StateNumber) { case State.Player_Turn: StateNumber = State.Enemy_Turn; break; case State.Enemy_Turn: for (int i = 0; i < dungeonGenerator.enemyCtrlList.Count; i++) { dungeonGenerator.enemyCtrlList[i].EnemyMove(); } StateNumber = State.Player_Turn; turn = false; break; } } } } |
サイトでは
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
enum eAct { KeyInput, // キー入力待ち。もしくは待機中 // アクション ActBegin, // 開始 Act, // 實行中 ActEnd, // 終了 // 移動 MoveBegin, // 開始 Move, // 移動中 MoveEnd, // 完了 TurnEnd, // ターン終了 }; |
このやうにenum eActのパラメーターを神經質なほど細かく規定してゐるみたいですが、なぜここまで細かくしなければならないのか、理解できませんでした。
1 2 3 4 5 6 7 |
private enum State { // プレイヤー Player_Turn, // キー入力待ち。もしくは待機中 // 敵 Enemy_Turn, // 実行中 }; |
このやうに、「プレイヤーのターン」「敵のターン」の2つのみでいいんぢやないかと思ふんですが、どうなんでせう?
まあそれはそれとして、29行目のif文内で處理してゐます。
- プレイヤーが何らかの行動をするとturnがtrueになる
- 37行目のfor文でList(後述)内の敵スクリプトを順番通りに實行する
- 處理が全て終了したらturnがfalseになる
これが僕が理解できる範圍内での實裝です。
他のスクリプトにおける追記
PlayerController.csにTurnManager.csのturnを操作する爲の記述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
TurnManager turnM; void Start () { turnManager = GameObject.Find("TurnManaherObj"); turnM = turnManager.GetComponent(); //他記述省略 } void Update () { if (Input.GetKeyDown(KeyCode.LeftArrow)) { this.transform.Translate(-1, 0, 0, Space.World); this.transform.rotation = Quaternion.Euler(0.0f, 90.0f, 0.0f); turnM.turn = true; //追記 } if (Input.GetKeyDown(KeyCode.RightArrow)) { this.transform.Translate(1, 0, 0, Space.World); this.transform.rotation = Quaternion.Euler(0.0f, -90.0f, 0.0f); turnM.turn = true; //追記 } if (Input.GetKeyDown(KeyCode.UpArrow)) { this.transform.Translate(0, 0, 1, Space.World); this.transform.rotation = Quaternion.Euler(0.0f, 180.0f, 0.0f); turnM.turn = true; //追記 } if (Input.GetKeyDown(KeyCode.DownArrow)) { this.transform.Translate(0, 0, -1, Space.World); this.transform.rotation = Quaternion.Euler(0.0f, 0.0f, 0.0f); turnM.turn = true; //追記 } } |
DungeonGenerator.csのCharacterGenerator()の敵生成のところ追記
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
void CharacterGenerator() { //2次元の配列にする mapChara = new int[mapWidth, mapHeight]; //for文を用ゐて各インデックスにランダム値を代入 for (int i = 0; i < mapChara.GetLength(0); i++) { //省略 } //各インデックスに代入された値を基に、生成、不生成を判別 for (int i = 0; i < mapChara.GetLength(0); i++) { for (int j = 0; j < mapChara.GetLength(1); j++) { //インデックスの値が規定値以下の時、EnemyPrefabを生成 if (mapChara[i, j] < 2) { //生成 GameObject enemGo = Instantiate(EnemyPrefab); enemGo.transform.position = new Vector3(i, 0, j); //生成したEnemyPrefabにアタッチしてあるスクリプトを取得 EnemyController ctrl = enemGo.GetComponent<EnemyController>(); //ctrlをリストに追加=enemyListにスクリプトEnemyControllerを追加 enemyCtrlList.Add(ctrl); } } } //プレイヤーを生成 //省略 } |
- 22行目 敵の生成
- 25行目 生成した敵のコンポーネント(スクリプト)を取得
- 28行目 取得したコンポーネントをListに追加
いまいち理解しきれてゐない所がありますが、現状では上手く動いてくれてゐるので、とりあへずこのままで行かうと思ひます。
將來的に何か問題が出たらどうにかします。
コメントを残す