実現したいこと
Unityで2Dプロジェクトを作成し、横スクロールアクションゲームを制作したい。その際に敵キャラの動きを作成したのだがコードの添削をお願いしたいです。
前提
敵キャラの動きをC#で作成しました。
発生している問題・エラーメッセージ
なし
該当のソースコード
C#
1using UnityEngine;2 3public class FloatTest : MonoBehaviour 4{5 public enum MonsterMode6 {7 WALK, // 歩く8 BACK, // 戻る(初期位置へ)9 CHASE, // 追跡10 ATTACK, // 攻撃11 12 PLAYER_DIE, // プレイヤーが倒れたとき13 14 MAX 15 }16 17 // 現在のモード18 MonsterMode curMode;19 20 // 初期位置取得用21 private Vector3 initPos;22 23 // 歩く範囲(ゲーム開始時のスポーン位置を起点)24 private float walkRange = 2.0f;25 26 // プレイヤーを視認する範囲27 private float visualRange = 5.0f;28 29 public GameObject playerObj;30 31 // プレイヤーの座標取得用32 Player player;33 34 // 向いている方向35 [SerializeField] private float dir;36 37 Transform thistrans;38 39 [SerializeField] private Vector3 newDir;40 41 42 Rigidbody2D rb;43 44 Vector3 pos;45 Quaternion rot;46 47 void Start()48 {49 rb = GetComponent<Rigidbody2D>();50 51 // 初期モード取得52 curMode = MonsterMode.WALK;53 54 // 初期位置取得55 initPos = this.transform.position;56 57 player = playerObj.GetComponent<Player>();58 59 dir = 1;60 transform.rotation = Quaternion.LookRotation(new Vector3(dir, 0, 0));61 }62 63 void Update()64 {65 // 座標取得66 thistrans = this.transform;67 pos = thistrans.position;68 rot = thistrans.rotation;69 70 rot.y = 0;71 72 // プレイヤーが倒れたら歩きモードへ73 if (playerObj.GetComponent<PlayerStatus>().GetCurHp() <= 0 &&74 curMode != MonsterMode.WALK)75 {76 curMode = MonsterMode.PLAYER_DIE;77 }78 79 // モードごとに行動パターンを変える80 switch (curMode)81 {82 case MonsterMode.WALK:83 // 右端に行ったら左へ方向転換84 if (thistrans.position.x > initPos.x + walkRange)85 {86 dir = -1;87 }88 // 左端に行ったら右へ方向転換89 if (thistrans.position.x < initPos.x - walkRange)90 {91 dir = 1;92 }93 transform.rotation = Quaternion.LookRotation(new Vector3(dir, 0, 0));94 95 // プレイヤーが視認範囲にいるか96 ObakeSearch(dir);97 98 pos.x += dir * Time.deltaTime;99 100 break;101 102 103 case MonsterMode.BACK:104 // 初期位置へ戻る方向を取得105 newDir = new Vector3((initPos.x - thistrans.position.x), (initPos.y - thistrans.position.y), 0).normalized;106 transform.rotation = Quaternion.LookRotation(new Vector3(newDir.x, 0, 0));107 108 // プレイヤーが視認範囲にいるか109 ObakeSearch(newDir.x);110 111 // 方向を保持させる112 dir = newDir.x;113 114 // 初期位置へ1.0f以内まで近づいたら115 if (Mathf.Abs(initPos.x - thistrans.position.x) < 1.0f)116 {117 // 歩きモードへ118 curMode = MonsterMode.WALK;119 }120 121 pos.x += newDir.x * Time.deltaTime;122 pos.y += newDir.y * Time.deltaTime;123 124 break;125 126 case MonsterMode.CHASE:127 // 方向を決定128 newDir = new Vector3(129 (player.transform.position.x - thistrans.position.x),130 (player.transform.position.y + 3.0f - thistrans.position.y), 0).normalized;131 transform.rotation = Quaternion.LookRotation(new Vector3(newDir.x, 0, 0));132 133 // 攻撃へ移る134 if (Mathf.Abs(player.transform.position.x - thistrans.position.x) < 0.1f)135 {136 thistrans.position = new Vector3(player.transform.position.x, 0, 0);137 curMode = MonsterMode.ATTACK;138 }139 140 141 // 見失う条件142 // プレイヤーが視認距離より遠くに行くか突進している敵の後ろに行ったとき143 if (thistrans.position.x + visualRange < player.transform.position.x ||144 thistrans.position.x - visualRange > player.transform.position.x)145 {146 Debug.Log("逃げ切った");147 // Attackを終了148 // 初期位置へ戻るモードへ149 curMode = MonsterMode.BACK;150 }151 152 pos.x += newDir.x * Time.deltaTime * 2.0f;153 if (pos.y < initPos.y + 10.0f)154 {155 pos.y += newDir.y * Time.deltaTime;156 }157 158 break;159 160 case MonsterMode.ATTACK:161 newDir = new Vector3(0, player.transform.position.y - thistrans.position.y, 0);162 163 if (Mathf.Abs(initPos.y - thistrans.position.y) > 0.01f)164 {165 pos.y += newDir.y * Time.deltaTime * 10;166 }167 168 // 範囲外169 if (thistrans.position.x + visualRange < player.transform.position.x ||170 thistrans.position.x - visualRange > player.transform.position.x)171 {172 curMode = MonsterMode.WALK;173 }174 else175 {176 curMode = MonsterMode.CHASE;177 }178 179 break;180 181 case MonsterMode.PLAYER_DIE:182 // 初期位置へ戻る方向を取得183 newDir = new Vector3((initPos.x - thistrans.position.x), (initPos.y - thistrans.position.y), 0).normalized;184 transform.rotation = Quaternion.LookRotation(new Vector3(newDir.x, 0, 0));185 186 // 方向を保持させる187 dir = newDir.x;188 189 // 初期位置へ1.0f以内まで近づいたら190 if (Mathf.Abs(initPos.x - thistrans.position.x) < 1.0f)191 {192 // 歩きモードへ193 curMode = MonsterMode.WALK;194 }195 196 pos.x += newDir.x * Time.deltaTime;197 pos.y += newDir.y * Time.deltaTime;198 199 break;200 }201 202 // 座標更新203 thistrans.position = pos;204 thistrans.rotation = rot;205 }206 207 208 209 210 public void ObakeSearch(float Dir)211 {212 if (playerObj.GetComponent<PlayerStatus>().GetCurHp() > 0)213 {214 // プレイヤーを発見したら215 // 右向いているとき216 if (Dir == 1.0f &&217 thistrans.position.x + Dir * visualRange > player.transform.position.x &&218 thistrans.position.x < player.transform.position.x)219 {220 // 突進(攻撃)モードへ221 curMode = MonsterMode.CHASE;222 }223 // 左向いているとき224 if (Dir == -1.0f &&225 thistrans.position.x + Dir * visualRange < player.transform.position.x &&226 thistrans.position.x > player.transform.position.x)227 {228 curMode = MonsterMode.CHASE;229 }230 }231 }232 233 private void OnCollisionStay2D(Collision2D collision)234 {235 // プレイヤー236 if (collision.gameObject.tag == "Player")237 {238 // 初期位置へ戻るモードへ239 curMode = MonsterMode.BACK;240 }241 }242}
試したこと
自分の今のプログラミングスキルで敵キャラをそれっぽく見せるをやってみました。
状況の整理
現在の敵キャラの動きは、空中で往復移動、プレイヤーの上にくると降りてきてダメージを与えて来ます。
補足情報(FW/ツールのバージョンなど)
VSCode2019
Unityバージョン
2021.3.16f1

0 コメント