UnityからローカルLLMを扱えるライブラリ LLMUnity を触ってみたので、
導入からサンプル実行、いくつかの機能検証までまとめてみます。
今回使用したリポジトリはこちらです。
https://github.com/undreamai/LLMUnity
Asset Store
LLMUnityとは
LLMUnityは Unity内でローカルLLMを動かすためのフレームワークです。
内部的には以下のような構造になっています。
Unity
↓
LLMUnity
↓
llama.cpp
↓
GGUFモデル
特徴としては次のような点があります。
- ローカルLLMが動く
- APIキー不要
- オフラインでも使用可能
- NPC会話などゲーム用途に使える
UnityでAIキャラクターを作る用途にはかなり相性が良さそうです。
インストール
LLMUnityは以下の2つの方法で導入できます。
- Asset Store
- GitHub(Package Manager)
今回はまず Asset Store版を試しました。
方法① Asset Storeから導入
Unityの Package Manager を開きます。
Window > Package Manager
左上の
Packages: My Assets
を選択し
LLM for Unity
をインポートします。
依存関係エラーが発生
Asset Storeからインポート後、
Unityがスクリプトをコンパイルするタイミングで以下のエラーが表示されました。
現在のコンテキストに 'JObject' が存在しません
現在のコンテキストに 'JArray' が存在しません
型または名前空間の名前 'Newtonsoft' が見つかりません
一見すると大量のエラーが出ているため
「パッケージが壊れているのでは?」と思ってしまいますが、
実際には 本体の問題ではなく依存関係が不足している状態でした。
エラーの原因
エラーを見ると
Newtonsoft
JObject
JArray
というキーワードが共通しています。
LLMUnityではJSON処理のために
Newtonsoft.Json
というライブラリが使用されています。
コード内でも次のような名前空間が使われています。
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
このライブラリがプロジェクトに含まれていない場合、
JObject
JArray
などのJSON操作クラスが解決できずコンパイルエラーになります。
なぜ依存関係エラーが起きたのか
LLMUnityのGitHubのリリースノートを見ると、
以下の変更が記載されています。
v3.0.1
add Unity.Nuget.Newtonsoft-Json in the assembly definition
つまり
Unity.Nuget.Newtonsoft-Json
現在の最新リリースは
v3.0.3 (2026-03-08)
です。
Asset Store版では
- パッケージが古い
- 依存関係が自動解決されていない
などの理由で
Newtonsoft.Json が見つからない
という状態になる可能性があります。
解決方法
Package Managerから以下のパッケージを追加します。
com.unity.nuget.newtonsoft-json
追加後、Unityが再コンパイルされてエラーは解消しました。
エラー発生の流れ
今回の状況を整理すると次のようになります。
Asset StoreからLLMUnityをインポート
↓
Unityがスクリプトをコンパイル
↓
Newtonsoft.Json が見つからない
↓
JObject / JArray エラーが発生
↓
com.unity.nuget.newtonsoft-json を追加
↓
エラー解消
方法② GitHubから導入
Package Managerの
Add package from git URL
から
https://github.com/undreamai/LLMUnity.git
を指定すると導入できます。
GitHub版の方が依存関係の問題が起きにくい場合もあるため、
新規プロジェクトではこちらの方法も選択肢になると思います。
サンプルを動かす
LLMUnityにはいくつかのサンプルが用意されています。
例えば以下のようなものがあります。
ChatBot
FunctionCalling
MultipleCharacters
KnowledgeBaseGame
RAG
SimpleInteraction
まずは ChatBot を実行して動作を確認しました。
モデルをダウンロード
LLMUnityにはモデルダウンロード機能があります。
LLM コンポーネントの
Download model
からモデルを選択します。
今回は以下のモデルを使用しました。
Qwen 3.5 2B
Playするとモデルのダウンロードが始まり、
ダウンロード完了後にチャットができるようになります。
LLMUnityでできること
LLMUnityにはいくつかの基本機能があります。
簡単なサンプルコードで試してみました。
チャットを行う
一番基本の機能です。
using UnityEngine;
using LLMUnity;
public class ChatSample : MonoBehaviour
{
public LLMAgent agent;
async void Start()
{
string reply = "";
await agent.Chat(
"Unityとは何か日本語で説明してください。",
r => reply = r,
() => Debug.Log("AI: " + reply)
);
}
}
チャット履歴の保存 / 読み込み
会話履歴を保存することができます。
using UnityEngine;
using LLMUnity;
public class HistorySample : MonoBehaviour
{
public LLMAgent agent;
async void Start()
{
agent.save = "chat_history.json";
await agent.Chat("こんにちは");
await agent.SaveHistory();
Debug.Log("履歴を保存しました");
await agent.LoadHistory();
}
}
Warmup
初回推論を高速化するための機能です。
using UnityEngine;
using LLMUnity;
public class WarmupSample : MonoBehaviour
{
public LLMAgent agent;
void Start()
{
_ = agent.Warmup(OnWarmupCompleted);
}
void OnWarmupCompleted()
{
Debug.Log("LLM Warmup 完了");
}
}
テキスト補完
文章生成もできます。
using UnityEngine;
using LLMUnity;
public class Sample_Completion : MonoBehaviour
{
public LLMAgent agent;
async void Start()
{
string result = "";
await agent.Completion(
"昔々、ある山奥に小さな村がありました。その村には",
r => { Debug.Log($"Reply : {r}"); result = r; },
() => Debug.Log("Completion: " + result)
);
}
}
※注意
私の環境だけなのか、プログラムの書き方七の文章補完が永久におわらないふぐあいがありました。
何度も同じ文章をくりかえすんですよね。
Function Calling
AIの出力をゲームロジックに使うこともできます。
using UnityEngine;
using LLMUnity;
public class Sample_FunctionLike : MonoBehaviour
{
public LLMAgent agent;
public Renderer targetRenderer;
async void Start()
{
agent.grammar = @"
root ::= ""ChangeRed"" | ""ChangeBlue""
";
string output = "";
await agent.Chat(
"赤にしてください。返答は ChangeRed か ChangeBlue のどちらかだけにしてください。",
r => output = r,
() =>
{
Debug.Log("AI Output: " + output);
if (output.Contains("ChangeRed"))
targetRenderer.material.color = Color.red;
else if (output.Contains("ChangeBlue"))
targetRenderer.material.color = Color.blue;
}
);
}
}
RAG(Retrieval Augmented Generation)
知識を与えて回答させることもできます。
using UnityEngine;
using LLMUnity;
public class RagSample : MonoBehaviour
{
public LLMAgent agent;
private List<string> docs = new List<string>()
{
"王都アルメリアは北の山脈に囲まれた城塞都市です。",
"騎士団長レオンは火竜討伐で名を上げました。",
"魔法学院は王都の西区にあります。"
};
async void Start()
{
// 本格RAGではEmbeddingで近い文書を選ぶが、
// まずは固定で1件だけ渡して「知識を与えて答えさせる」触感を見る
string context = docs[1];
string reply = "";
await agent.Chat(
$"以下の知識だけを参考に答えてください。\n知識: {context}\n\n質問: 火竜討伐で有名なのは誰ですか?",
r => { Debug.Log("RAG-like (intermediate): " + r); reply = r; },
() => Debug.Log("RAG-like: " + reply)
);
}
}
Grammar
LLMの出力形式を制限することもできます。
using UnityEngine;
using LLMUnity;
public class GrammarSample : MonoBehaviour
{
public LLMAgent agent;
async void Start()
{
agent.grammar = @"
root ::= ""attack"" | ""run"" | ""hide""
";
string reply = "";
await agent.Chat(
"敵が近くにいます。attack / run / hide のどれかだけ答えてください。",
r => reply = r,
() => Debug.Log(reply)
);
}
}
Embeddings
文章の意味ベクトルを取得することもできます。
using UnityEngine;
using LLMUnity;
using System.Collections.Generic;
public class EmbeddingSample : MonoBehaviour
{
public LLMAgent agent;
async void Start()
{
List<float> vec = await agent.Embeddings("こんにちは");
Debug.Log("vector size: " + vec.Count);
}
}
触ってみた感想
LLMUnityは
- UnityからローカルLLMを簡単に呼べる
- NPC会話に向いている
- Function CallingやGrammarでゲームロジックに組み込みやすい
という印象でした。
ローカルLLMなので
- API料金不要
- オフラインでも動く
という点も魅力です。
まとめ
LLMUnityを使うことで
- NPC会話
- AIキャラクター
- ゲームAI
- 知識ベースAI
などをUnity上で簡単に作ることができます。
UnityでAIを使ったゲームやアプリを作る場合、
かなり面白い選択肢になるライブラリだと思いました。











