どうも、萬朶櫻(@wanduoying)、187朶目の記事です。
前囘ではプレイヤーの動きを實裝しました。

今囘は敵キャラの移動です。
今まで敵キャラはランダムに動くだけでしたので、プレイヤーに向かつてくるやうにします。
開發日記のバックナンバーはこちら。
敵の動き
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
public class EnemyController : MonoBehaviour { //キャラクターの向き public enum ENEMY_DIRECTION { INVALID, UP, RIGHT_UP, RIGHT, RIGHT_DOWN, DOWN, LEFT_DOWN, LEFT, LEFT_UP } ENEMY_DIRECTION direction = ENEMY_DIRECTION.DOWN; private GameObject player; private int enemyPosX; private int enemyPosZ; void Start () { //~~~(省略)~~~ //dungeonGenerator.mapChara[enemyPosX,enemyPosZ]の座標とワールド座標を一致させる float enemyPosXFloat = this.gameObject.transform.position.x; enemyPosX = (int)enemyPosXFloat; float enemyPosZFloat = this.gameObject.transform.position.z; enemyPosZ = (int)enemyPosZFloat; player = GameObject.Find("Player0Prefab(Clone)"); } void Update () { //~~~(省略)~~~ } public void EnemyMove() { float dx = player.transform.position.x - this.gameObject.transform.position.x; float dz = player.transform.position.z - this.gameObject.transform.position.z; if (Mathf.Abs(dx) > Mathf.Abs(dz)) { if (dx < 0)//左 { if (dungeonGenerator.map[enemyPosX - 1, enemyPosZ] != 0 && 2 <= dungeonGenerator.mapChara[enemyPosX - 1,enemyPosZ] && dungeonGenerator.mapChara[enemyPosX - 1, enemyPosZ]<= 99 )//移動先に壁や他キャラが無い場合 { dungeonGenerator.mapChara[enemyPosX, enemyPosZ] = 99; enemyPosX--; dungeonGenerator.mapChara[enemyPosX, enemyPosZ] = 1; this.transform.Translate(-1, 0, 0, Space.World); direction = ENEMY_DIRECTION.LEFT; this.transform.rotation = Quaternion.Euler(0.0f, 90.0f, 0.0f); } else { this.transform.rotation = Quaternion.Euler(0.0f, 90.0f, 0.0f); direction = ENEMY_DIRECTION.LEFT; } } else//右 { //左の場合と同樣に(向き等が違ふことに注意) } } else { if (dz < 0)//下 { //左の場合と同樣に(向き等が違ふことに注意) } else//上 { //左の場合と同樣に(向き等が違ふことに注意) } } } } |
プレイヤーと違つて、敵キャラの動作はTurnManager.csで呼び出すのでpublic void EnemyMove()に書きました。
15~19行目で前囘のプレイヤーと同樣に座標を一致させます。
EnemyMove()内の處理
自分の座標とプレイヤーの座標との位置關係に應じて動く向きを變へます。
このサイトを參考にしました。
33行目で自分のX座標とプレイヤーのX座標との差を、34行目で自分のZ座標とプレイヤーのZ座標との差を變數に代入します。
36行目でdxの絶對値とdzの絶對値とを比較。
38行目のif文で左に行くか右に行くかの判定。
40行目以下の記述はプレイヤーと同じ、移動先に壁等が無いことを判定して進むか止まるかを判斷し、移動處理をします。
これでとりあへずはプレイヤーに向かつて動くやうになりました。
上の參考サイトでも「この移動法はあまり良くない」といつた説明がありますので、將來的にはもつと賢いAIを實裝することになると思ひます。
ですが暫くはこのままで放置しておくとします。
コメントを残す