1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UnityでローカルLLMを動かす「LLMUnity」を試してみた

1
Posted at

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から導入

image.png

Unityの Package Manager を開きます。

Window > Package Manager

左上の

Packages: My Assets

を選択し

LLM for Unity

をインポートします。


依存関係エラーが発生

Asset Storeからインポート後、
Unityがスクリプトをコンパイルするタイミングで以下のエラーが表示されました。

image.png

現在のコンテキストに '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

依存関係として追加する修正が行われています。
image.png

現在の最新リリースは

v3.0.3 (2026-03-08)

です。

Asset Store版では

  • パッケージが古い
  • 依存関係が自動解決されていない

などの理由で

Newtonsoft.Json が見つからない

という状態になる可能性があります。


解決方法

Package Managerから以下のパッケージを追加します。

com.unity.nuget.newtonsoft-json

image.png

追加後、Unityが再コンパイルされてエラーは解消しました。


エラー発生の流れ

今回の状況を整理すると次のようになります。

Asset StoreからLLMUnityをインポート
↓
Unityがスクリプトをコンパイル
↓
Newtonsoft.Json が見つからない
↓
JObject / JArray エラーが発生
↓
com.unity.nuget.newtonsoft-json を追加
↓
エラー解消

方法② GitHubから導入

GitHubから直接インストールすることもできます。
image.png

Package Managerの

Add package from git URL

から

https://github.com/undreamai/LLMUnity.git

image.png

を指定すると導入できます。

GitHub版の方が依存関係の問題が起きにくい場合もあるため、
新規プロジェクトではこちらの方法も選択肢になると思います。


サンプルを動かす

LLMUnityにはいくつかのサンプルが用意されています。

例えば以下のようなものがあります。

ChatBot
FunctionCalling
MultipleCharacters
KnowledgeBaseGame
RAG
SimpleInteraction

image.png

まずは ChatBot を実行して動作を確認しました。


モデルをダウンロード

LLMUnityにはモデルダウンロード機能があります。

image.png

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)
		);
	}
}




※注意
私の環境だけなのか、プログラムの書き方七の文章補完が永久におわらないふぐあいがありました。
何度も同じ文章をくりかえすんですよね。

image.png

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;
			}
		);
	}
}


red.gif

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)
		);
	}
}

image.png


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)
        );
    }
}

image.png


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を使ったゲームやアプリを作る場合、
かなり面白い選択肢になるライブラリだと思いました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?