EP.02 で を扱いました。本 EP は 6 × Cursor / の開発実例。 は 連動度 ★4 ですが、エコシステムの大きさで を補って余りある選択肢です。
1. なぜ Unity を選ぶか
- 求人最多: ゲーム業界で C# / Unity の経験者を求める案件が多い
- Asset Store の厚み: 何でも揃う、購入価格 < 自前開発時間 のことが多い
- マルチプラットフォーム: モバイル / コンソール (PS / Switch / Xbox) / PC / WebGL の同時対応が一番楽
- 公式の安心感: Unity Technologies 社による継続開発、トレーニング・認定資格あり
2. Cursor のセットアップ
# 1. Cursor をインストール (https://cursor.com/)# 2. Unity の External Tools を Cursor に設定:# Unity → Preferences → External Tools → External Script Editor → Cursor# 3. Cursor 側で C# 拡張をインストール (Unity の OmniSharp / C# Dev Kit)# 4. プロジェクトを開く: File → Open Folder → /path/to/UnityProject
# Claude を統合 (Cursor は GPT/Claude 切替可、設定で Claude Opus を選択)3. Claude / Cursor に書かせる Player.cs
using UnityEngine;
[RequireComponent(typeof(Rigidbody2D))]public class PlayerController : MonoBehaviour{ [SerializeField] private float speed = 5f; [SerializeField] private float jumpForce = 12f; [SerializeField] private LayerMask groundLayer; [SerializeField] private Transform groundCheck;
private Rigidbody2D rb; private Animator animator; private bool isGrounded;
void Awake() { rb = GetComponent<Rigidbody2D>(); animator = GetComponent<Animator>(); }
void Update() { // 接地判定 isGrounded = Physics2D.OverlapCircle(groundCheck.position, 0.2f, groundLayer);
// 横移動 float horizontal = Input.GetAxisRaw("Horizontal"); rb.linearVelocity = new Vector2(horizontal * speed, rb.linearVelocity.y);
if (horizontal != 0) { transform.localScale = new Vector3(Mathf.Sign(horizontal), 1, 1); animator.SetBool("Running", true); } else { animator.SetBool("Running", false); }
// ジャンプ if (Input.GetButtonDown("Jump") && isGrounded) { rb.linearVelocity = new Vector2(rb.linearVelocity.x, jumpForce); } }}Unity 6 (2024 LTS) で Rigidbody2D.velocity が linearVelocity に rename された。Claude が velocity と書いてきたら deprecate warning が出る。プロンプトに「Unity 6 で」と入れると正しい名前を選ぶようになる。
4. ScriptableObject でデータを外出し (LLM 連動の鍵)
MonoBehaviour に直書きされたパラメータは prefab に保存され、LLM が読みづらい。ScriptableObject にデータを外出しすれば、JSON 風アセット (.asset) として読み書きできる。
using UnityEngine;
[CreateAssetMenu(fileName = "Enemy", menuName = "GameData/Enemy")]public class EnemyData : ScriptableObject{ public string enemyName; public int maxHp; public float moveSpeed; public int attackPower; public Sprite icon; public AudioClip deathSound;}
// 使い方: Editor で右クリック → Create → GameData → Enemy// 生成された .asset は YAML テキストなので Claude が読み書きできる5. Cursor でやる典型ワークフロー
- 1仕様を Cursor のチャットに書く: 「敵 AI を作って。プレイヤーを見つけたら追跡、距離 5 以内で攻撃」
- 2コード生成 → 受入れ: Tab で 1 行ずつ accept、または Cmd+I でファイル全体生成
- 3Unity Editor 側でコンポーネントを Attach + パラメータ調整: ここは人手
- 4動作確認 → エラーがあれば Console を Cursor チャットに貼ってデバッグ
- 5型エラーを Cursor が自動修正: C# は型情報が豊富なので LLM が直しやすい
6. Muse の現実
| 機能 | 用途 | 実用度 |
|---|---|---|
| Muse Chat | Unity API の質問 | 中 (Cursor + Claude で代替可) |
| Muse Texture | PBR テクスチャ生成 | 高 (Substance より手軽) |
| Muse Animate | ヒューマノイドモーション生成 | 高 (Mixamo の代替候補) |
| Muse Sprite | 2D スプライト生成 | 中 (Stable Diffusion XL の方が自由度高) |
| Muse Behavior | AI 行動ツリー生成 | 発展途上 |
7. Asset Store の付き合い方
- 買ってもよいもの: Dialog system / Inventory / Save system / UI Tween / Editor 拡張
- 自前で書くべき: ゲームの核 (戦闘 / メインループ / 物語システム)
- 警戒: メンテ停止アセット (最終更新が 2 年前以上) は買わない
- LLM 視点: アセットの API を Claude に説明して使い方を書かせるのは普通に成立する
8. Unity 固有のハマりどころ
| 問題 | 対処 |
|---|---|
| prefab のマージコンフリクト | Smart Merge (UnityYAMLMerge) を Git に設定 |
| Meta ファイル | GUID が変わると参照切れ、.meta も必ずコミット |
| Editor で動くが Build で動かない | Stripping Level 設定、AOT 制約 (IL2CPP) |
| Coroutine の罠 | Object 破棄時に Coroutine が走り続けて NRE |
| Awake / Start / OnEnable 順序 | 明示的に依存関係を書く (DI コンテナ or Service Locator) |
9. Build 自動化
using UnityEditor;using UnityEngine;
public class Build{ [MenuItem("Build/Build All")] public static void BuildAll() { var scenes = new[] { "Assets/Scenes/Main.unity" }; BuildPipeline.BuildPlayer(scenes, "Build/Game.app", BuildTarget.StandaloneOSX, BuildOptions.None); }}
// CLI: Unity -batchmode -quit -projectPath . -executeMethod Build.BuildAll10. 次の話
EP.04 は Unreal Engine 5 × LLM ── C++ コード生成と、Blueprint (ビジュアルスクリプト) を LLM でどう扱うか。MetaHuman / Nanite / Lumen といった Unreal 固有の強みと LLM の組合せ。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。