「見た目を作る前に、知能を作れ」。これが今回のプロジェクト、Slime Voxel Worldの核心です。贅沢なアセットを並べる前に、まずはプレースホルダーのキューブに「魂(ローカルLLM)」を吹き込み、自律的に動き回る世界を構築しました。
1. Logic-First:なぜロジックから始めるのか
美しいボクセルアセットを作るのは楽しい作業ですが、一番の難関は「AIがその世界を正しく認識し、意味のある行動をとれるか」です。アセット制作に没頭するあまり、肝心の「自律性」が置き去りになるのを防ぐため、今回はあえて「色付きのキューブ」だけでプロトタイプを完成させる手法をとりました。
この三層構造により、モデルの差し替えやロジックの変更が容易な、柔軟なシステムが誕生しました。
- Brain: Ollama 3.1 (Llama 3.1) - ローカルで動作する思考の核
- Bridge: Python (FastAPI) - 思考と現実(Godot)のデータ橋渡し
- Body: Godot 4.3 - 物理演算、アニメーション、そして世界そのもの
2. ブリッジの設計:AIの気まぐれを制御する
AI(Ollama)との通信にはPythonの FastAPI
を採用しました。Godotが直接LLMを叩くのではなく、中間にブリッジを挟むことで、以下のような「知的な制御」を可能にしています。
- プロンプト・エンジニアリング: スライムの性格(Personality)や空腹度を文脈に組み込み、AIに「スライムとしての自覚」を持たせます。
- バリデーション(Pydantic): AIが不完全なJSONを返したり、方向(target)を答え忘れたりした場合でも、サーバー側でデフォルト値を補完。Godot側のクラッシュを防ぎます。
- レスポンスの正規化:
thought,action,targetといった構造化されたデータを確実にGodotへ届けます。
3. 物理と生命感:GDScriptでの実装
スライムの「体」はGodotの CharacterBody3D
で制御されています。AIから「移動(MOVE)」の指令が届くと、目的地へのベクトルを計算し、move_and_slide() で地形を認識しながら進みます。
もちもちアニメーションの数式
単なるキューブに生命を吹き込むのが、独自実装した「もちもちアニメーション」です。_process 内でサイン波(Sin
Wave)を回し、Meshのスケールをリアルタイムに操作しています。
# squash & stretchの実装イメージ
var s = sin(time * bounce_speed)
mesh.scale.y = 1.0 + s * bounce_power
mesh.scale.x = 1.0 - s * bounce_power * 0.5
mesh.scale.z = 1.0 - s * bounce_power * 0.5
待機中(Idle)はゆったりとした呼吸のような伸縮、移動中(Move)はピッチを上げて躍動感のあるバウンド。この「見た目の変化」が、ユーザーにAIの思考を感じさせる重要なフィードバックとなります。
4. 常にスライムを中心に:追従カメラの実装
自律的にどこまでも歩いていくスライムを見失わないよう、専用の Camera3D
スクリプトも作成しました。lerp(線形補間)を用いることで、スライムの急な動きにも滑らかに反応し、常に心地よい距離から観察できる「見守り視点」を確保しています。
5. 結び:AIとの共生に向けて
現在はプレースホルダーのキューブですが、土台は完成しました。この「知能の器」に、次はMagicaVoxelで愛着の持てるアセットを流し込み、農業や建築といった社会性を構築していく予定です。
AIは単なる自動化のツールではなく、物語を共に紡ぐエージェント。今回のプロトタイプはその可能性を証明する第一歩となりました。
