Utility

UnityでAIを実装する方法|ChatGPT API連携・NavMeshAgent・ML-Agentsで作るゲーム内AI

Unityでゲームに「AI」を組み込む方法は、目的によって大きく3つに分かれます。敵キャラを目的地まで歩かせる経路探索、試行錯誤で賢くなる強化学習、そしてChatGPTのような外部LLMでNPCの会話を生成する連携です。どれも別の技術で、混同すると回り道になります。この記事では、UnityでゲームAIを実装する3つの方法を、サンプルコードとつまずきやすいエラーの対処つきで整理します。エディター上の開発を補助する製品「Unity AI」とは別テーマなので、その点も最初に切り分けます。

まとめ:UnityでのAI実装の要点

  • ゲーム内AIの実装は「経路探索(NavMesh)」「強化学習(ML-Agents)」「外部LLM連携(ChatGPT API)」の3層に分けて考える。
  • 敵やNPCの移動は、Unity組み込みのNavMeshAgentが最短で、SetDestinationだけで目的地へ歩かせられる。
  • 試行錯誤で行動を学習させるならML-Agents。Python側で学習し、学習済みモデルをUnityに戻す。よくあるエラーはBehavior Parametersの設定不一致。
  • NPCの自然な会話生成は外部LLM。UnityWebRequestでOpenAIなどのAPIを叩く。APIキーの直書きは避ける。
  • これらは実行時(ゲーム内)のAI。エディターでのコード・素材生成を助ける製品「Unity AI」とは別物。

UnityのゲームAIを実装する3つの層

「UnityでAIを作りたい」と一口に言っても、実現手段はまったく異なります。まず自分の目的がどの層かを見極めると、無駄な調査を避けられます。

目的 手段 実装の重さ
敵・NPCを動かす(経路探索) NavMesh / NavMeshAgent(組み込み) 軽い
行動を学習させる ML-Agents(Python学習) 重い
NPCに会話させる 外部LLM API(ChatGPT等)連携

多くの場合、最初に必要になるのは経路探索です。敵が主人公を追いかける、味方が拠点へ戻る——こうした「動き」はNavMeshで十分で、機械学習は要りません。逆に、対戦AIの戦術を試行錯誤で強くしたいならML-Agents、NPCに台本のない受け答えをさせたいなら外部LLMというように、目的が具体的なときだけ重い手段を選ぶのが失敗しないコツです。「とりあえずAI」で最初からML-Agentsに手を出すと、学習環境の構築だけで消耗します。

NavMeshAgentによる経路探索の実装

敵やNPCを目的地まで賢く歩かせる経路探索は、Unityに標準搭載された機能で実装できます。手順は、床や障害物を含むシーンを用意し、床側をNavigation StaticにしてNavMeshをBake(焼き込み)し、動かしたいオブジェクトにNavMeshAgentコンポーネントを付けるだけです。あとはスクリプトから目的地を渡します。

using UnityEngine;
using UnityEngine.AI;

public class EnemyChase : MonoBehaviour
{
    public Transform target;
    NavMeshAgent agent;

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
    }

    void Update()
    {
        agent.SetDestination(target.position);
    }
}

SetDestinationに目的地の座標を渡すと、NavMeshAgentが障害物を避ける最短経路を自動で計算して移動します。速度や停止距離はコンポーネントのSpeed・Stopping Distanceで調整します。これは学習を伴わないルールベースのAIですが、追跡・巡回・逃走といったゲームAIの大半はこれで足ります。名前空間がUnityEngine.AIである点に注意してください(using宣言の付け忘れがコンパイルエラーの定番です)。

ML-Agentsによる学習型AIの作り方

試行錯誤を通じて行動を獲得させたい場合は、Unity公式の強化学習フレームワークML-Agentsを使います。仕組みは、Unity側でエージェント(観測・行動・報酬)を定義し、Python側の学習プロセスで方策を訓練して、学習済みモデル(.onnx)をUnityに戻して推論させる、という流れです。Unityパッケージcom.unity.ml-agentsとPython環境の両方を用意する必要があり、学習はmlagents-learn config.yaml --run-id=test01のようにCLIから起動します。3つの中では最も準備が重い方法です。

導入時に最も多いつまずきが、学習済みモデルとBehavior Parametersコンポーネントの設定不一致です。「モデル側とBehavior Parametersでタイプが合っていない」というエラーは、Behavior Name、観測空間のサイズ(Vector Observation)、行動空間(Continuous/Discrete Actions)のいずれかが、学習時とUnity側で食い違っているのが原因です。学習に使った設定と、Inspectorで割り当てたモデル・パラメータが一致しているかを突き合わせて直します。もう一つ多いのが、学習開始時のPyTorchインストール失敗です。ML-Agentsが要求するPythonとPyTorchのバージョン組み合わせは公式のリリースごとに決まっているため、対応表に沿った仮想環境を作るのが確実です。

LLM API連携によるNPC会話生成

NPCに定型でない受け答えをさせたいなら、外部のLLM API(OpenAIなど)を連携します。UnityにはHTTP通信用のUnityWebRequestがあるので、これでAPIへPOSTしてNPCのセリフを生成します。

using UnityEngine;
using UnityEngine.Networking;
using System.Text;
using System.Collections;

public class NpcTalk : MonoBehaviour
{
    const string Endpoint = "https://api.openai.com/v1/chat/completions";
    [SerializeField] string apiKey; // 直書きせず環境変数やサーバ経由で渡す

    // 呼び出しは StartCoroutine(Ask(prompt)); で行う
    IEnumerator Ask(string prompt)
    {
        string body =
            "{\"model\":\"gpt-5.6\",\"messages\":[{\"role\":\"user\",\"content\":\"" + prompt + "\"}]}";
        using (var req = new UnityWebRequest(Endpoint, "POST"))
        {
            req.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(body));
            req.downloadHandler = new DownloadHandlerBuffer();
            req.SetRequestHeader("Content-Type", "application/json");
            req.SetRequestHeader("Authorization", "Bearer " + apiKey);
            yield return req.SendWebRequest();
            if (req.result == UnityWebRequest.Result.Success)
                Debug.Log(req.downloadHandler.text);
            else
                Debug.LogError(req.error);
        }
    }
}

実装で外せないのは、非同期処理・モデルID・APIキー保護です。通信は非同期なのでSendWebRequestをコルーチンで待ちます。モデルIDは更新が速いため、コード例の値をそのまま使わず実装時点でOpenAI公式の最新IDを確認して差し替えます。最重要は、APIキーをクライアント(ビルドしたゲーム)に直書きしないことです。配布バイナリからキーは抽出され得るため、自前のサーバを経由させてキーを隠すのが実運用の前提になります。なお上のコードはリクエストボディを文字列連結で組んでいますが、promptに引用符や改行が入るとJSONが壊れるため、実運用ではJsonUtilityなどのシリアライザでエスケープします。会話履歴を渡せばNPCが文脈を保った応答を返せますが、トークン量と遅延・課金がそのまま増える点も設計時に見込んでおきます。

製品「Unity AI」との違い

混同しやすいのが、Unityが2026年に提供を始めた製品「Unity AI」です。これはエディター上でC#スクリプトや素材の生成を助ける開発支援ツールであり、この記事で扱う実行時(ゲーム内)のAIとは目的が違います。Unity AIがNPCの思考ルーチンを自動で動かすわけではなく、あくまで開発者の作業を速める道具です。Unity AI製品の料金(クレジット制)・使い方・Museからの移行は、Unity AIとは?料金・使い方・Museからの移行にまとめています。実行時AIを自分で実装するのが本記事、開発をAIに手伝わせるのがそちら、と切り分けてください。なお、開発補助をさらにMCPで自動化するならuLoopMCPも選択肢です。

3手法の選び方(実装コスト別)

迷ったら、実装の重さと目的で選びます。敵・味方の移動やパトロールなど「動き」だけならNavMeshで即実装でき、学習も外部通信も不要です。ここで機械学習を持ち出すのは過剰です。対戦相手の戦術を人手のルールで書ききれない、勝ちパターンをデータから獲得させたい——そういう明確な要求があるときだけML-Agentsに投資します。NPCに脚本のない会話をさせたい場合は外部LLM連携が唯一の現実解ですが、サーバ運用とAPI課金というランニングコストを負う判断が必要です。3つは排他ではなく、経路探索でNavMesh、会話でLLM、と組み合わせるのが実際のゲームでは普通です。

よくある質問

Unityでゲームに簡単なAIを組み込むには何から始めればいいですか?

まずNavMeshによる経路探索です。NavMeshをBakeし、動かすオブジェクトにNavMeshAgentを付けてSetDestinationで目的地を渡すだけで、追跡や巡回が実装できます。機械学習は不要です。

NavMeshAgentで敵が動かないときは何を確認しますか?

シーンのNavMeshがBake済みか、対象がNavMesh上にいるか、using UnityEngine.AI;を宣言しているか、Stopping Distanceが大きすぎないかを確認します。目的地がNavMesh外だと経路が作れず動きません。

ML-Agentsで「モデルとBehavior Parametersが合わない」エラーが出ます。

Behavior Name・観測空間のサイズ・行動空間(Continuous/Discrete)のいずれかが、学習時とUnity側で食い違っています。学習に使った設定と、Inspectorで割り当てたモデル・パラメータを突き合わせて一致させてください。

UnityからChatGPTを使うにはどうしますか?

UnityWebRequestでOpenAIのAPIにPOSTします。モデルIDは最新版を公式で確認し、APIキーはクライアントに直書きせず自前サーバ経由で渡します。通信はコルーチンで非同期に待ちます。

ゲーム内AIと製品「Unity AI」は同じものですか?

違います。本記事のゲーム内AIは実行時にゲームを動かす実装で、製品「Unity AI」はエディターでの開発を補助するツールです。製品の詳細はUnity AIの解説記事を参照してください。

関連記事

資料請求

RELATED POSTS 関連記事