RTSの兵士AIは、自動で敵を探して攻撃します。
命令がないときは、待機します。
この記事では、実装方法を詳しく解説します。
✨ この記事でわかること
- 基本的な兵士AIの実装
- ターゲット選択のアルゴリズム
- 状態管理システムの実装
- 自動攻撃システムの実装
- 実装例とコード

兵士AIは、状態管理が重要です。待機・移動・攻撃の状態を明確にしましょう。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
基本的な兵士AIの実装

兵士AIは、状態に応じて行動を決定します。
実装方法を紹介します。
状態管理システム
|
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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
using UnityEngine; using System.Collections.Generic; public enum UnitState { Idle, // 待機 Moving, // 移動中 Attacking, // 攻撃中 Following // 追従中 } public class SoldierAI : MonoBehaviour { public UnitState currentState = UnitState.Idle; public float detectionRange = 10f; public float attackRange = 2f; public float moveSpeed = 5f; private Transform target = null; private Vector3 commandPosition; private bool hasCommand = false; void Update() { switch (currentState) { case UnitState.Idle: UpdateIdle(); break; case UnitState.Moving: UpdateMoving(); break; case UnitState.Attacking: UpdateAttacking(); break; } } void UpdateIdle() { // 敵を探す target = FindNearestEnemy(); if (target != null) { float distance = Vector3.Distance(transform.position, target.position); if (distance <= attackRange) { currentState = UnitState.Attacking; } else if (distance <= detectionRange) { currentState = UnitState.Moving; } } else if (hasCommand) { currentState = UnitState.Moving; } } void UpdateMoving() { if (target != null) { // 敵に向かって移動 MoveTowardsTarget(); float distance = Vector3.Distance(transform.position, target.position); if (distance <= attackRange) { currentState = UnitState.Attacking; } } else if (hasCommand) { // 命令位置に向かって移動 MoveToCommandPosition(); } else { currentState = UnitState.Idle; } } void UpdateAttacking() { if (target == null) { currentState = UnitState.Idle; return; } float distance = Vector3.Distance(transform.position, target.position); if (distance > attackRange) { currentState = UnitState.Moving; } else { // 攻撃処理 Attack(); } } Transform FindNearestEnemy() { // 最も近い敵を探す // 実装は省略 return null; } void MoveTowardsTarget() { Vector3 direction = (target.position - transform.position).normalized; transform.position += direction * moveSpeed * Time.deltaTime; } void MoveToCommandPosition() { Vector3 direction = (commandPosition - transform.position).normalized; transform.position += direction * moveSpeed * Time.deltaTime; if (Vector3.Distance(transform.position, commandPosition) < 0.5f) { hasCommand = false; currentState = UnitState.Idle; } } void Attack() { // 攻撃処理 } public void SetCommand(Vector3 position) { commandPosition = position; hasCommand = true; target = null; // 命令が優先 } } |
このコードで、基本的な兵士AIが実装できます。
待機・移動・攻撃の状態を管理します。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
ターゲット選択のアルゴリズム

ターゲット選択は、戦闘の核心です。
実装方法を紹介します。
最も近い敵を選択
|
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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
using UnityEngine; using System.Collections.Generic; using System.Linq; public class TargetSelector : MonoBehaviour { public LayerMask enemyLayer; public float detectionRange = 10f; public Transform FindNearestEnemy(Transform unit) { Collider[] enemies = Physics.OverlapSphere(unit.position, detectionRange, enemyLayer); if (enemies.Length == 0) { return null; } Transform nearest = null; float minDistance = float.MaxValue; foreach (var enemy in enemies) { float distance = Vector3.Distance(unit.position, enemy.transform.position); if (distance < minDistance) { minDistance = distance; nearest = enemy.transform; } } return nearest; } public Transform FindWeakestEnemy(Transform unit) { Collider[] enemies = Physics.OverlapSphere(unit.position, detectionRange, enemyLayer); if (enemies.Length == 0) { return null; } Transform weakest = null; float minHP = float.MaxValue; foreach (var enemy in enemies) { Unit enemyUnit = enemy.GetComponent<Unit>(); if (enemyUnit != null && enemyUnit.stats.currentHP < minHP) { minHP = enemyUnit.stats.currentHP; weakest = enemy.transform; } } return weakest; } public Transform FindHighestPriorityEnemy(Transform unit) { Collider[] enemies = Physics.OverlapSphere(unit.position, detectionRange, enemyLayer); if (enemies.Length == 0) { return null; } // 優先度でソート List<Transform> sortedEnemies = enemies .Select(e => e.transform) .OrderByDescending(e => GetPriority(e)) .ToList(); return sortedEnemies.Count > 0 ? sortedEnemies[0] : null; } float GetPriority(Transform enemy) { // 優先度を計算(距離、HP、ユニットタイプなど) Unit enemyUnit = enemy.GetComponent<Unit>(); if (enemyUnit == null) return 0f; float priority = 100f / (Vector3.Distance(transform.position, enemy.position) + 1f); priority += (1f - (float)enemyUnit.stats.currentHP / enemyUnit.stats.maxHP) * 50f; return priority; } } |
このコードで、ターゲット選択が実装できます。
最も近い敵、最も弱い敵、優先度の高い敵を選択できます。
✅ ターゲット選択の基準
- 距離:最も近い敵を優先
- HP:最も弱い敵を優先(倒しやすい)
- 優先度:距離・HP・ユニットタイプを総合評価
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
自動攻撃システムの実装

自動攻撃は、兵士AIの核心です。
実装方法を紹介します。
攻撃システムの実装
|
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 |
using UnityEngine; using System.Collections; public class AutoAttack : MonoBehaviour { public float attackRange = 2f; public float attackCooldown = 1f; public int attackDamage = 10; private Transform target; private float lastAttackTime = 0f; public void SetTarget(Transform newTarget) { target = newTarget; } void Update() { if (target == null) return; float distance = Vector3.Distance(transform.position, target.position); if (distance <= attackRange) { if (Time.time - lastAttackTime >= attackCooldown) { PerformAttack(); lastAttackTime = Time.time; } } } void PerformAttack() { Unit targetUnit = target.GetComponent<Unit>(); if (targetUnit != null) { targetUnit.TakeDamage(attackDamage); // 攻撃アニメーション PlayAttackAnimation(); } } void PlayAttackAnimation() { // アニメーション処理 } } |
このコードで、自動攻撃システムが実装できます。
攻撃範囲内の敵に、自動で攻撃します。
攻撃の種類
- 近接攻撃:攻撃範囲が短い、ダメージが高い
- 遠距離攻撃:攻撃範囲が長い、ダメージが低い
- 範囲攻撃:複数の敵にダメージ

自動攻撃は、クールダウンを設定しましょう。毎フレーム攻撃すると、負荷が高くなります。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
実装例:完全な兵士AIシステム

実際に使える、完全な兵士AIシステムの実装例を紹介します。
|
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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
using UnityEngine; public class CompleteSoldierAI : MonoBehaviour { [Header("AI設定")] public float detectionRange = 10f; public float attackRange = 2f; public float moveSpeed = 5f; [Header("コンポーネント")] public TargetSelector targetSelector; public AutoAttack autoAttack; public UnitMovement unitMovement; private UnitState currentState = UnitState.Idle; private Transform target = null; private Vector3 commandPosition; private bool hasCommand = false; void Update() { UpdateState(); } void UpdateState() { switch (currentState) { case UnitState.Idle: HandleIdle(); break; case UnitState.Moving: HandleMoving(); break; case UnitState.Attacking: HandleAttacking(); break; } } void HandleIdle() { // 敵を探す target = targetSelector.FindNearestEnemy(transform); if (target != null) { float distance = Vector3.Distance(transform.position, target.position); if (distance <= attackRange) { currentState = UnitState.Attacking; autoAttack.SetTarget(target); } else if (distance <= detectionRange) { currentState = UnitState.Moving; } } else if (hasCommand) { currentState = UnitState.Moving; } } void HandleMoving() { if (target != null) { unitMovement.MoveTo(target.position); float distance = Vector3.Distance(transform.position, target.position); if (distance <= attackRange) { currentState = UnitState.Attacking; autoAttack.SetTarget(target); } } else if (hasCommand) { unitMovement.MoveTo(commandPosition); if (Vector3.Distance(transform.position, commandPosition) < 0.5f) { hasCommand = false; currentState = UnitState.Idle; } } else { currentState = UnitState.Idle; } } void HandleAttacking() { if (target == null) { currentState = UnitState.Idle; return; } float distance = Vector3.Distance(transform.position, target.position); if (distance > attackRange) { currentState = UnitState.Moving; autoAttack.SetTarget(null); } } public void SetCommand(Vector3 position) { commandPosition = position; hasCommand = true; target = null; } } |
このコードで、完全な兵士AIシステムが実装できます。
状態管理、ターゲット選択、自動攻撃を統合しています。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
よくある質問(FAQ)

Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
まとめ

兵士AIは、状態管理が重要です。
待機・移動・攻撃の状態を明確にしましょう。
✅ 今日から始める3ステップ
- ステップ1:状態管理システムを実装する(所要2時間)
- ステップ2:ターゲット選択システムを実装する(所要2時間)
- ステップ3:自動攻撃システムを実装する(所要2時間)
本格的にUnityを学びたい方は、Unity入門の森で実践的なスキルを身につけましょう。
あなたのペースで、少しずつ進めていけば大丈夫です。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる



コメント