Unityの2Dシューティングゲーム向け、実装しやすくゲーム性が豊かになる敵の動きパターン
お疲れ様です!!
今作っているシューティングゲーム向けに敵の動きをどんなものにしようか考えていたのですが、ChatGPTさんに聞いてみたらすぐに使えそうなパターンをいくつか教えてくれたので、皆さんにも共有してみたいと思います!!
目次
基本的な動きパターン
① 直線移動(上→下)
- 特徴:まっすぐ下に降りてくるだけ
- 難易度:★☆☆☆☆
- 使いどころ:チュートリアル・序盤
transform.Translate(Vector2.down * speed * Time.deltaTime);
② 左右に揺れながら下へ進む(波状移動)
- 特徴:ジグザグに動いて弾を避けにくくする
- 難易度:★★☆☆☆
- 使いどころ:中盤以降のザコ
float x = Mathf.Sin(Time.time * frequency) * amplitude;
transform.position += new Vector3(x, -speed * Time.deltaTime, 0);
③プレイヤーをゆっくり追尾
- 特徴:プレイヤーの方向にじわじわ寄ってくる
- 難易度:★★★☆☆
- 使いどころ:緊張感を出す敵
Vector3 dir = (player.position - transform.position).normalized;
transform.position += dir * speed * Time.deltaTime;
④ ランダムに方向転換(予測不能)
- 特徴:一定時間ごとに移動方向が変わる
- 難易度:★★★☆☆
- 使いどころ:奇襲タイプの敵
// 一定時間ごとに
randomDir = new Vector2(Random.Range(-1f, 1f), -1f).normalized;
transform.position += (Vector3)randomDir * speed * Time.deltaTime;
アクションパターン付き
①接近 → 爆発
- 特徴:プレイヤーに近づいて自爆
- 難易度:★★★★☆
- 使いどころ:高リスクな突進型
public float speed = 2f;
public float explodeRange = 1.5f;
public GameObject explosionEffect;
private Transform player;
void Start()
{
player = GameObject.FindWithTag("Player").transform;
}
void Update()
{
if (!player) return;
Vector3 direction = (player.position - transform.position).normalized;
transform.position += direction * speed * Time.deltaTime;
if (Vector3.Distance(transform.position, player.position) < explodeRange)
{
// 爆発処理
Instantiate(explosionEffect, transform.position, Quaternion.identity);
// プレイヤーにダメージを与えたい場合はここで
Destroy(gameObject);
}
}
②後ろから出現 → プレイヤーの進行を妨害
- 特徴:カメラの上ではなく後方から出現して追撃
- 使いどころ:中ボス的な緊張感
public float speed = 2f;
private Transform player;
void Start()
{
player = GameObject.FindWithTag("Player").transform;
}
void Update()
{
if (!player) return;
Vector3 direction = (player.position - transform.position).normalized;
transform.position += direction * speed * Time.deltaTime;
}
③編隊で飛んでくる(隊列型)
- 特徴:複数の敵がまとまってフォーメーションで登場
- 例:V字・縦列・横列・円形
- 使いどころ:見栄えが良く、ボーナスステージ的にも◎
public float speed = 2f;
public Vector3 offsetFromLeader;
private Transform formationCenter;
void Start()
{
formationCenter = GameObject.Find("FormationLeader").transform;
}
void Update()
{
if (!formationCenter) return;
Vector3 targetPos = formationCenter.position + offsetFromLeader;
transform.position = Vector3.Lerp(transform.position, targetPos, Time.deltaTime * speed);
}
ボス向け特殊パターン
① 一定距離ごとに止まって弾をばら撒く
- 特徴:止まりながら連射 → 移動 → 連射
- 使いどころ:ミニボス、ボス戦
public float moveSpeed = 2f;
public float moveDuration = 2f;
public float stopDuration = 1f;
public GameObject bulletPrefab;
private float timer;
private bool isMoving = true;
void Update()
{
timer += Time.deltaTime;
if (isMoving)
{
transform.Translate(Vector2.down * moveSpeed * Time.deltaTime);
if (timer >= moveDuration)
{
isMoving = false;
timer = 0;
InvokeRepeating(nameof(Shoot), 0f, 0.2f); // 弾をばら撒く
}
}
else
{
if (timer >= stopDuration)
{
isMoving = true;
timer = 0;
CancelInvoke(nameof(Shoot));
}
}
}
void Shoot()
{
Instantiate(bulletPrefab, transform.position, Quaternion.identity);
}
②複数フェーズで移動パターンが変わる
例:
- 第1フェーズ:直線移動 + 弾1発
- 第2フェーズ:波状移動 + 拡散弾
- 第3フェーズ:追尾移動 + 連射
public enum Phase { Phase1, Phase2, Phase3 }
public Phase currentPhase = Phase.Phase1;
public float hp = 100;
public GameObject bulletPrefab;
public Transform player;
void Update()
{
switch (currentPhase)
{
case Phase.Phase1:
MoveStraight();
if (hp < 70) ChangePhase(Phase.Phase2);
break;
case Phase.Phase2:
MoveWave();
if (hp < 30) ChangePhase(Phase.Phase3);
break;
case Phase.Phase3:
MoveChase();
break;
}
}
void MoveStraight()
{
transform.Translate(Vector2.down * Time.deltaTime * 2f);
// 弾をゆっくり撃つ
}
void MoveWave()
{
float x = Mathf.Sin(Time.time * 2f) * 3f;
transform.position += new Vector3(x, -1f, 0f) * Time.deltaTime;
// 拡散弾を撃つ
}
void MoveChase()
{
Vector3 dir = (player.position - transform.position).normalized;
transform.position += dir * Time.deltaTime * 3f;
// 連射攻撃
}
void ChangePhase(Phase next)
{
currentPhase = next;
Debug.Log("フェーズ切り替え:" + next);
}
public void Damage(float damage)
{
hp -= damage;
}
補足
- 敵の移動処理は Update でも Rigidbody2D の velocity でも可です。
- パターンは ScriptableObject や Enum で管理すると拡張しやすくなります。
- 弾を出す
bulletPrefab
は別スクリプトで挙動(直進・拡散など)を設定しましょう。
まとめ
今回はUnityの2Dシューティングゲーム向け、実装しやすくゲーム性が豊かになる敵の動きパターンを共有させていただきました!!
こんなにたくさんのパターンを一瞬で提案してくれるChatGPTさん、本当にすごいです!!
いつも助かってます!!ゲーム制作のお供ですね(笑)
2025-06-22
0件のコメント
コメントはまだありません。最初の一人になりましょう!