この記事は Unity Advent Calendar 2025の5日目の記事になります!
qiita.com
昨日は @tsubasamusu さんの「【Unity】Unity エディタと Unreal エディタでローカルマルチプレイしよう!~Unity 編~」でした。
【Unity】Unity エディタと Unreal エディタでローカルマルチプレイしよう!~Unity 編~
はじめに
今回はUnityでローカルLLMを使う際に利用できるOSS/公式パッケージを三つ紹介したいと思います。
gemma-unity-plugin: Google社員によって作成されたプラグインLLMUnity: llama.cppを利用する著名なOSSUnity Sentis(Inference Engine): Unity公式の推論エンジン
個人的に触ってみて、ローカルLLMに限定するのであれば特にLLMUnityは完成度高いなという印象を受けたのでそちらについて深掘りもしたいと思います。
環境
- Intel Mac
- Unity 6000.2.14f1
概要
gemma-unity-plugin
Google社員によって作成された、GemmaというGoogleが公開する軽量なLLMモデルをUnityで動かせるようにしたプラグインです。
仕組みとしてはgemma.cppを内部で利用して実現しており、Gemma以外のモデルを動かすことは難しいと思います。
また実際にIntel Macで動作検証しようとしていたのですが、あまりに動作が不安定すぎて諦めました。Issueを見ても同様の意見を持っている方が多数いるようです。
github.com
github.com
LLMUnity
スター数が1.4kと人気で、UnityでローカルLLMを動かす際にはまず検討しても良いようなOSSです。
仕組みとしてはllama.cppを利用して実現しており、.gguf形式であれば動かせます。GemmaやLlama 3などなども動かせます。
llama.cppとは
llama.cpp is an open source software library that performs inference on various large language models such as Llama. It is co-developed alongside the GGML project, a general-purpose tensor library.
// DeepL翻訳
llama.cppは、Llamaなどの様々な大規模言語モデルに対する推論を実行するオープンソースソフトウェアライブラリです。汎用テンソルライブラリであるGGMLプロジェクトと共同開発されています。
.ggufとは
GGUF is a file format for storing models for inference with GGML and executors based on GGML. GGUF is a binary format that is designed for fast loading and saving of models, and for ease of reading. Models are traditionally developed using PyTorch or another framework, and then converted to GGUF for use in GGML.
// DeepL翻訳
GGUFは、GGMLおよびGGMLベースの実行環境で推論を行うためのモデルを保存するファイル形式です。GGUFはバイナリ形式であり、モデルの高速な読み込み・保存と可読性の向上を目的として設計されています。モデルは従来、PyTorchなどのフレームワークで開発され、その後GGMLで使用するためにGGUF形式に変換されます。
Unity Sentis(Inference Engine)
Unity公式が提供するONNX推論エンジンです。ちなみに名前がUnity SentisからInference Engineに変わったとのことですが、どうやらまた戻ったり(?)と現状どうなっているのかよく分かっていません。昔はBarracudaという名前でした。
docs.unity3d.com
.onnx・.sentis(Unityの独自フォーマット)であれば動作させることができ、LLMとしてはPhi 1.5というMiscrosoftが提供するモデルがhuggingfaceにより提供されています。
huggingface.co
.onnxとは
Open Neural Network Exchange(略称:ONNX)とは、オープンソースで開発されている機械学習や人工知能のモデルを表現する為の代表的なフォーマットである
実行までのやり方(ざっくり)
- Package Managerの
Add package by nameよりcom.unity.ai.inference(ex.v2.3.0)とcom.unity.nuget.newtonsoft-json(ex.v3.2.2)をインストール - huggingfaceのファイル群をダウンロード(私の場合はcloneした)
RunPhi15.csをゲームオブジェクトにアタッチphi15.sentisとvocab.jsonとmerges.txtをコンポーネントにアタッチ

比較・所感
gemma-unity-pluginに関しては検証できなかったので一旦除外をします。また開発も半年前から止まっているようでして、改善の見込みも薄そうです。
LLM UnityとUnity SentisでローカルLLMを動作させる観点で言うと、以下のように考えました。
| 項目 | LLMUnity | Unity Sentis |
|---|---|---|
| 手軽さ | ◎ | ○ |
| 移植性 | ○ | ◎ |
| モデルの用意しやすさ | ◎ | △ |
モデルのダウンロードなど含め、手軽さで言うとLLMUnityに軍配が上がるかなと言うイメージです。なぜそう思ったかはこの後のやり方を見れば分かるかと思います。
移植性について、2024/12/20時点でLLM UnityのIssueにてWindows、Linux、macOS、iOS、Androidと述べられていました。
Support UWP platform · Issue #293 · undreamai/LLMUnity · GitHub
SentisはUnity公式がSentis supports all Unity runtime platforms.と述べている点より、コンソールでも動くはずです。そういった点ではUnity Sentisに軍配があがるでしょう。
また.ggufと.onnxのどちらも汎用的なフォーマットではありますが、Sentisの方は公式が用意してくれているものが一つだけです。また.onnxなら全て動作するのかと言うとそういうわけではなく、未対応のoperatorもあるので注意です。
LLMUnityの使い方
インストール方法
UPM経由でLLMUntyをインストールできます。
メニューバーのWindow > Package Management > Package ManagerからPackage Managerを開き、install package from git URL...を選択して以下を入力すればOKです。


https://github.com/undreamai/LLMUnity.git
セットアップ方法
適当なGameObjectを作成し、LLMコンポーネントをアタッチしてください。

Setup Libraryが終わった後、モデルをダウンロードを行います。
モデルのダウンロード
LLMUnityではUnityEditor上でダウンロードか可能で、加えてランタイムでダウンロードさせるなんてことも手軽に実現できます。


Download modelからモデルをダウンロードできます。llama・Gemma・Qwen・DeepSeek・Phi・Mistral・OpenHermesなどなど、かなりの種類が用意されています。
またBuildのチェックボックスがオンであるなら、ビルドプロセス中にゲームにコピーされる仕組みみたいです。(オフにするとビルドから除外される)
さらにDownload on Buildにチェックを入れると、ゲームの初回起動時にダウンロードなんかもしてくれるらしいです。
// モデルのダウンロード完了まで待つ await LLM.WaitUntilModelSetup();
public async void Start() { // ダウンロードの進捗を受け取るパターン await LLM.WaitUntilModelSetup(SetProgress); } private void SetProgress(float progress){ var progressPercent = (int)(progress * 100) + "%"; Debug.Log($"Download progress: {progressPercent}"); }
LLMCharacterをセットアップする
モデルのダウンロードが終われば、LLMCharacterコンポーネントをアタッチして、必要最低限以下を設定します。
- Player Name
- AI Name
- Prompt

細かい設定は下記ドキュメントに記載されています。
LLMUnity/Options.md at main · undreamai/LLMUnity · GitHub
チャットを行う
[SerializeField] private LLMCharacter llmCharacter; public async void Start() { var message = "こんにちは!"; var reply = await llmCharacter.Chat(message); // こんにちは!何かお手伝いできることはありますか? 😊 どんなことでもお気軽にお尋ねください。 Debug.Log(reply); }
チャット履歴に保存/読み込む
// 保存 llmCharacter.Save("filename"); // 読み込み llmCharacter.Load("filename");
persistentDataPathに保存されます。
Warmupする
最初のセットアップをロード画面で行うなんて時に使えます。
_ = llmCharacter.Warmup(() => Debug.Log("ready"));
テキスト補完をしてもらう
面白い使い方の一つとして、テキストの補完なんかもしてくれます。試しに実行してみたら、想像以上に長くて笑いました。
var message = "猫はネズミから"; // 人間まで、様々な動物に影響を与えています。その影響の一つが、人間の感情や行動を「猫化」することです。 // // 猫の視覚的な特徴から、人間の心理学的な特性を読み取ることはできます。例えば、猫が警戒心を持つと、人は不安を感じる傾向があります。猫が甘やかしてくるので、人は満足感を得やすいです。 // // 猫は人間社会に影響を与え、人間が「猫」のように行動するようになります。 // 猫の行動を観察することで、人間の心の状態を把握することができます。 // // 猫の感情や行動を理解することは、人間関係の改善に繋がる可能性があります。 // 猫の愛情表現を理解することで、人はより深く愛されるようになります。 // // 猫の行動を観察し、理解することの重要性について、この文章で述べた内容をまとめます。 // // **まとめ:** // // * 猫はネズミから人間まで、様々な動物に影響を与えています。 // * その影響の一つが、「猫化」と呼ばれる人間の感情や行動を「猫」のように変化させること。 // * 猫の視覚的な特徴や行動パターンから、人間の心理学的な特性を読み取ることができます。 // * 猫は人間社会に影響を与え、人間が「猫」のように行動するようになります。 // * 猫の感情や行動を理解することは、人間関係の改善に繋がる可能性があります。 // // **この文章で述べた内容を要約した上で、猫の行動を観察することの重要性について、さらに強調してください。** // // **強調すべき点:** // // 猫は単なるペットではなく、人間の心の状態を読み取る鏡のような存在です。その観察を通して、私たちは自身の感情や行動に気づき、より深く愛されるようになります。猫の愛情表現を理解することで、人は人間関係を築き、より豊かな繋がりを生み出すことができます。猫の行動を理解することは、単なる趣味ではなく、人間関係の改善と心の成長に不可欠な要素です。 await llmCharacter.Complete(message, msg => Debug.Log($"Reply : {msg}"), () => Debug.Log("Completed"));
FunctionCalling
LLMUnityはGrammar(文法制約)機能を使用してFunction Callingを実現します。具体的にはBNF(バッカス・ナウ記法)形式を用いて記述することで、AIの出力を必ず特定のJSONフォーマットにすることができます。
llmCharacter.grammarString = "root ::= (\"jump\" | \"run\" | \"attack\")"; var prompt = "めいいっぱいジャンプして!"; var reply = await llmCharacter.Chat(prompt); // Full Reply: jump Debug.Log($"Full Reply: {reply}"); // jsonをパースして、適切なメソッドを呼び出す
RAG(Retrieval-Augmented Generation)
RAGに対応しているモデルをRag modelsもしくは独自のモデルをダウンロードします。その上でRAGコンポーネントをアタッチします。(動的にアタッチして初期化しても良いです)

[SerializeField] private LLMCharacter llmCharacter; [SerializeField] private RAG rag; public async void Start() { // あらかじめ加えるデータの準備 var inputs = new[]{ "Hi! I'm a search system.", "the weather is nice. I like it.", "I'm a RAG system" }; // データの登録(ベクトル化して保存, Embedding) foreach (var input in inputs) { await rag.Add(input); } // 類似している上位3つを取得 var message = "How is the weather?"; var (results, distances) = await rag.Search(message, 2); Debug.Log(string.Join(", ", results)); Debug.Log(string.Join(", ", distances)); // 小さいほど類似している var prompt = "Answer the user query based on the provided data.\n\n"; prompt += $"User query: {message}\n\n"; prompt += "Data:\n"; foreach (var similarPhrase in results) { prompt += $"\n- {similarPhrase}"; } var reply = await llmCharacter.Chat(prompt); Debug.Log(reply); }
注意点としてはllmCharacterはRAGでないモデルを使用して、RAGはRAG用のモデルを使用しないとクラッシュしてしまいました。
さいごに
ゲーム x ローカルLLM は結構流行るんじゃないのかなと密かに思っています。(なんならそれでインディーゲームを作ろうと画策中)
LLMUnityはサンプルも充実しているので、気になる方は是非触ってみてください。
undream.ai