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

兵士AIは、状態管理が重要です。待機・移動・攻撃の状態を明確にしましょう。
\あなたにピッタリのシミュレーションゲーム制作講座を見つけよう!/
おすすめ第1位
経営シミュレーション×
農場ゲームの作り方講座
Unity6対応・農場×経営の2ジャンル融合。AIエージェントを独自実装できる唯一の講座。未経験でも完成まで到達できる丁寧な解説が魅力。
本格派・高難易度
UnityシミュレーションRPG
の作り方講座(SRPG)
本格SRPGのAI設計・グリッドシステムを全16回で習得。制作難易度が高いSRPGを作れるスキルは、他と大きく差がつく強みになります。
初心者にもおすすめ
Unity ノンフィールドRPG
+スレスパ風JRPG講座
Slay the Spire風デッキ構築×JRPGをUnityで実装。Unity6・スマホ化対応で、初心者がゲーム開発の第一歩を踏み出すのに最適な講座です。
あなたのオリジナルゲーム、今年こそ完成させませんか?
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が実装できます。
待機・移動・攻撃の状態を管理します。
ターゲット選択のアルゴリズム

ターゲット選択は、戦闘の核心です。
実装方法を紹介します。
最も近い敵を選択
|
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・ユニットタイプを総合評価
自動攻撃システムの実装

自動攻撃は、兵士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() { // アニメーション処理 } } |
このコードで、自動攻撃システムが実装できます。
攻撃範囲内の敵に、自動で攻撃します。
攻撃の種類
- 近接攻撃:攻撃範囲が短い、ダメージが高い
- 遠距離攻撃:攻撃範囲が長い、ダメージが低い
- 範囲攻撃:複数の敵にダメージ

自動攻撃は、クールダウンを設定しましょう。毎フレーム攻撃すると、負荷が高くなります。
実装例:完全な兵士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システムが実装できます。
状態管理、ターゲット選択、自動攻撃を統合しています。
よくある質問(FAQ)

シミュレーションゲームを作りたいなら!Unity入門の森のシミュレーション制作講座で本格ゲーム開発に挑戦しよう
Unity入門の森には、経営・農場・SRPGなど幅広いシミュレーションゲームを作れる講座が揃っています。作りたいジャンルや目標スキルに合わせて選んでみてください。
経営シミュレーション×農場ゲームの作り方講座【Unity6対応!AIエージェント実装まで学べる唯一の講座!】

- 未経験でも完成まで到達できる丁寧な解説
- 農場×経営の2ジャンルを同時に作れる
- 賢く自律行動するAIエージェントを独自実装できる
- 完成後も街づくりゲームに応用可能な高い拡張性
- Unity6対応のモダンな開発手法が身につく
経営シミュレーション×農場ゲームの作り方講座は、シムシティ・牧場物語・どうぶつの森のようなゲームを自分で作れるようになる講座です。
農作物の育成・収穫・販売システムはもちろん、NavMeshを使ったお客さんAIの来店・購入・帰宅の自律行動や、ルールベースAIによる従業員エージェントの実装まで、本格的なゲームAI開発が学べます。
箱庭経営シミュレーションという複合的な題材を通して、Unity中級者・上級者に必要な幅広い開発スキルを一気に習得できる講座です。
Unity6対応・AIエージェント実装まで学べる
農場も経営もコレ1本で完成させよう
→ 経営シミュレーション×農場ゲーム講座を見てみる
応用・拡張性は無限大!自律行動するAIを実装して一歩先のゲーム開発へ!
UnityシミュレーションRPGの作り方講座(SRPG)【全16回!本格タクティクスSRPGをゼロから作れる!】

- ファイアーエムブレム風の本格タクティクスSRPGを0から開発
- 書籍でも情報が少ない戦術シミュレーションを丁寧に解説
- 難解なグリッドシステム・敵AI戦術を完全攻略できる
- 全文コメント入りソースコード付きで初心者でも理解しながら進められる
- Unity入門の森の最高傑作の一つ・解説の丁寧さはトップクラス
UnityシミュレーションRPGの作り方講座(SRPG)は、ファイアーエムブレム・タクティクスオウガ・FFタクティクスのようなターン制ストラテジーシミュレーションゲームを作るための講座です。
移動可能エリアの設定・ターン進行管理・コマンド選択型戦闘・敵AI戦術ストラテジーなど、本格SRPGに必要な機能をすべてゼロから開発します。開発難易度が高いシステムも、全文コメント入りのソースコードと丁寧な解説で確実に理解しながら進められます。
「SRPGを作れる」というスキルは希少価値が高く、Unityエンジニアとして中・上級者を目指す人に強くおすすめの一本です。
本格タクティクスSRPGをゼロから完成させる
難解なグリッドシステムと敵AIを完全攻略しよう
→ UnityシミュレーションRPG(SRPG)講座を見てみる
他では学べない当サイト最高傑作!エンジニアとして頭一つ抜ける希少スキルを今すぐ。
Unity ノンフィールドRPG+スレスパ風JRPG講座【Unity6対応!デッキ構築×JRPGをスマホ向けに作れる!】

- Unity6対応・スマホ化対応で最新環境のゲーム開発が学べる
- Slay the Spire風のデッキ構築システム×JRPGの組み合わせを実装
- 初心者でも取り組みやすい丁寧な解説構成
- ノンフィールドRPGとデッキ構築JRPGの2つを合わせて学ぶのがおすすめ
Unity ノンフィールドRPGの作り方講座+Slay the Spire風デッキ構築JRPGの作り方講座は、今もっともトレンドのデッキ構築型ゲームシステムをJRPGと組み合わせて実装する方法を学べる講座です。
Unity6対応・スマホ化対応の最新カリキュラムで、デッキ構築の核となるシステムをしっかり習得できます。シミュレーション系の設計思想とも親和性が高く、ゲーム開発の幅を広げたい方にもおすすめです。
「Slay the Spireみたいなゲームを自分でも作ってみたい!」という人の最初の一歩として最適な講座です。
Unity6対応・スマホ化対応の最新カリキュラム
トレンドのデッキ構築×JRPGを最速で実装しよう
→ Slay the Spire風デッキ構築JRPG講座を見てみる
SLGの設計思想とも親和性抜群!トレンドシステムを取り入れて開発の幅を広げよう!
まとめ

兵士AIは、状態管理が重要です。
待機・移動・攻撃の状態を明確にしましょう。
✅ 今日から始める3ステップ
- ステップ1:状態管理システムを実装する(所要2時間)
- ステップ2:ターゲット選択システムを実装する(所要2時間)
- ステップ3:自動攻撃システムを実装する(所要2時間)
本格的にUnityを学びたい方は、Unity入門の森で実践的なスキルを身につけましょう。
あなたのペースで、少しずつ進めていけば大丈夫です。
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。





コメント