AI統合型コードエディタ「Cursor」をUnityゲーム開発に使ってみた話
結論:「Cursorがすごい」と聞いて試したら思ったよりすごかった
Cursorについて
AI統合型IDE(コードエディタ)。
Chat GPTのような対話型エージェントが搭載されたコードエディタです。
Unityのフォルダを開いておくとAIがコードを読んでくれて、プロンプトの指示を元に直接ファイルを書き換えコーディングをしてくれます。
VS Codeをベースにしてるので普通のコードエディタとしても使えます。
やらせてみたタスク
開発中のゲームに、ミニゲームの単体確認シーンを実装する
前提
これが開発中のゲーム内の「クレーンゲーム」というミニゲーム(プリミティブな画面が映ってますが気にせず)。
元々単体で動いていたのですが、冒頭のお金を払うシーケンスを作る過程で、クレーン画面はシーン層から操作する設計になり動かなくなりました。
単体確認は今後も使いたかったので表題の実装が必要に。
1回目のプロンプト
CraneTestSceneというクラスを実装して下さい。 CraneGiftPlacementをInspectorから指定し、それを引数にCrane3dCtrlクラスを初期化、Crane3dCtrlでの1回のプレイサイクルを繰り返すクラスにして下さい。
▼生成されたコード(クリックで展開)
using UnityEngine; using Cysharp.Threading.Tasks; /// <summary> /// クレーンのテストシーン制御 /// </summary> public class CraneTestScene : MonoBehaviour { [SerializeField] private CraneGiftPlacement _giftPlacement; [SerializeField] private Crane3dCtrl _craneCtrl; private void Start() { InitializeCrane(); } private void Update() { _craneCtrl.MyUpdate(); } private void InitializeCrane() { if (_giftPlacement == null || _craneCtrl == null) { Debug.LogError("CraneGiftPlacementまたはCrane3dCtrlが設定されていません。"); return; } _craneCtrl.SetupPlacement(_giftPlacement); _craneCtrl.SetupPlay(); } public async UniTask<ItemInfo> PlayOneCycle() { _craneCtrl.SetupPlay(); // プレイが完了するまで待機 while (true) { if (_craneCtrl.CheckPlayDone(out ItemInfo getGift)) { return getGift; } await UniTask.Yield(); } } }
普通に合っていました。
しかも、Cursor上で「Accept」を押すだけでファイルごと生成されるのでコピペも不要。
Crane3dCtrlがクレーン画面を制御するクラスですが、使い方は説明してません。コードを読んで理解したようです。
理解すれば簡単に扱えるクラスですが行数は多く、コードを正しく読む能力が必要なタスクです。
少なくとも1,2年の実務経験レベルのコーディング能力があると感じました。
2回目のプロンプト
PlayOneCycleは必要ありません。代わりに、Update内でプレイが終了したら再度SetupPlayするようにして下さい。 完了時のGiftは無視して構いません。
▼コード(クリックで展開)
using UnityEngine; using Cysharp.Threading.Tasks; /// <summary> /// クレーンのテストシーン制御 /// </summary> public class CraneTestScene : CacheBehaviour { [SerializeField] private CraneGiftPlacement _giftPlacement; [SerializeField] private Crane3dCtrl _craneCtrl; private void Start() { InitializeCrane(); } private void Update() { _craneCtrl.MyUpdate(); // プレイが完了したら次のプレイを開始 if (_craneCtrl.CheckPlayDone(out _)) { _craneCtrl.SetupPlay(); } } private void InitializeCrane() { if (_giftPlacement == null || _craneCtrl == null) { Debug.LogError("CraneGiftPlacementまたはCrane3dCtrlが設定されていません。"); return; } _craneCtrl.SetupPlacement(_giftPlacement); _craneCtrl.SetupPlay(); } }
動いたものの1回しか遊べなかったので修正を指示。
こちらもやはり指示通り修正してくれました。
以上で完了。↓この通り、テキストメッセージなしでクレーンだけを繰り返し遊ぶテストシーンが作れました!
感想
自分で実装しても簡単なタスクとはいえ15分はかかっていた気がしますし、わざわざエラーハンドリングやコメントは入れなかったと思います。
一方Cursorは5分。慣れたら3分で完了しそうで、コード品質も高かったです。
衝撃が大きかったので、私も プロ驚き屋 デビューしようと思いました!
【Steam】ユーザーがローカルファイルを追加、編集、削除すると、アップデートでどうなるか検証しました
Steamで配信したゲームのローカルファイルにユーザーが加えた変更は、その後ゲームがアップデートがされるとどうなるのか検証してみました!
ユーザーがローカルファイルを・・・
追加した場合
| アップデートでの変更 | どうなるか? |
|---|---|
| 偶然にも同名ファイルが追加された | 開発側のファイルに上書きされる |
| それ以外 | 追加されたまま |
削除した場合
| アップデートでの変更 | どうなるか? |
|---|---|
| 対象ファイルが更新された | 復活する |
| 対象ファイルが削除された | 未検証(多分削除されたまま) |
| 対象ファイルに更新なし | 削除されたまま |
編集した場合
| アップデートでの変更 | どうなるか? |
|---|---|
| 対象ファイルが更新された | 開発側のファイルに上書きされる |
| 対象ファイルが削除された | 削除される |
| 対象ファイルに更新なし | 編集が維持される |
まとめ
アップデートで変更があるファイルは開発側のファイルが優先されますが、それ以外はユーザー側の変更が維持されるようです。
開発中のゲームで指定したローカルフォルダ内に使いたいVRMファイルを入れて、デフォルトアバターも同梱するという設計を考えていましたが、問題なさそうです!
余談ですが、セーブデータのようなユーザー側で開発側と同名別内容になりやすいファイルはうっかり上書きしないように注意が必要ですね。
検証条件
開発側として: 通常通り、SteamworksSdkを使ってビルドをアップロードして、ブラウザからブランチビルドをアップデート配信しました。
ユーザー側として: 一般ユーザーと同様に、Steamクライアントでゲームをインストールしたローカルファイルを操作しました。
ファイルの内容: hogeとかfugaとか書かれたシンプルなテキストファイルで試しました。
OS: Windows10
東京ゲームダンジョン5 展示振り返り
丸ダイスです! 5/4に東京ゲームダンジョン5が開催され、去年の3に引き続き丸ダイスは「マッスルニンジャVR」を展示しました!
明日はいよいよ #東京ゲームダンジョン5 ですね!
— 丸ダイス@密ですビートゲーム作者 (@dice_maru) 2024年5月3日
広々した会場でインディー魂あふれるゲームがたくさん遊べますよ!しかも安い!
私たちが開発中のVRでサ◯ケをやるゲームも体験できます。
自分のアバターで泥に落ちてオイシイ様子を配信しよう!#indiedevhttps://t.co/ZH1NfCkWg3 pic.twitter.com/QhOa2R0KnA
去年に続き大変盛況で、クリア出来なくても目新しいVR体験を楽しんでくれたお客さんが多かったです。
忘れないうちに振り返りを書いてたら、これ隠さなくてもいいなと思ったのでそのまま公開します!
なので割と開発目線の記事です!ご容赦!
チュートリアルを追加した
去年からの変更として、ガイダンスなしでもプレイできるようにゲーム内でチュートリアルを整備しました(もちろんSteamリリースを見据えて)。
結果、説明なしでほとんどの方が基本プレイを始められる様子を確認でき、手応えを感じられました。
一方、道の脇に置かれるとチュートリアル動画に気付かないという問題がありました。
これはシンプルに、絶対に視界に入る道の中央に置けば済む話です。
→要タスク化。
Meta Quest2が充電切れをした
12:00から一般入場がスタートしあまり途切れることなくプレイを続け、15:40頃にQuest 2の充電が空になりプレイ不能になってしまいました。
1時間で19%まで充電出来たので16:40頃、展示時間残り20分だけど再開しました。
去年はそういう記憶はないので、理由は不明です。
まぁ、どのみち空腹+アテンドで喋り疲れてたのでちょうど良い休憩になりました。
1時間くらいですが、休憩も出来て気になった展示をプレイする時間が取れました。
展示をワンオペした
去年は知人1人に手伝ってもらったのですが、今年は完全ワンオペ。
ゲームパッドやキーボードのゲームはちゃんと作れば開発者が離席しても試遊展示が可能ですが、体感型VRゲームは不可能です。
- ヘッドセットの付け方が分からない人が大勢いる
- 全身で遊ぶのでプレイ中のお客さんと周囲の安全監視が必要
- Meta Questは、ルームスペースがズレる、放置でスリープすることがあり、お客さんが対処できない
- Meta Questは簡単に持ち出せる割にそこそこ高価で盗難が怖い
- (終わった後の片付け方まで自動で案内するビルドにする必要があり、大変)
理由はこんなところですね。
意外となんとかなってしまいましたが、知り合いが挨拶に来てもゆっくり話せませんし、前述通りご飯も食べられません・・。
教訓:やはり展示スタッフは2人は欲しいです。
搬入搬出をワンオペした
- 背負子(13kg):デスクトップPCに布をかけて縛り付け
- スーツケース(23kg):PCモニター2台、Quest2一式、動画用iPad、ほか
- ショルダーバッグ:貴重品 去年とほぼ同じこの荷物で単独搬入搬出しました。宅配は使っていません。
自宅から最寄り駅でタクシーやバスを使ったり各停に乗って座ったりしたら楽になりました。夏じゃなくて春でしたし・・。
普通のゲーム展示と比べるとかなりの荷物ですが、運べない重量ではないです。
ぼく自身がマッスルニンジャなので(震え声)。
一点、今回の重要な学びは「混んだ電車内はしゃがんで背負子を降ろすスペースがないので、背負子は駅のホームで降ろしておいて両手に持って入ること」。山手線とか。
HMDのヘッドストラップを買い忘れた・・
Meta Quest 2 Eliteストラップ | VRヘッドストラップ | Meta Quest
後ろをカチカチっと回すと着脱が簡単にできるこういうやつがあります。
標準のバンドはお客さんごとの着脱が結構大変で、存在は去年知ってたのですがボーっと生きてたら普通に買い忘れました…。
UnityのVR開発SDKについて
これは
- OpenXR Plugin
- Steam VR Plugin
大きくこの2つに分かれて、本作は比較検討した上で後者を使っています。
主に作りやすさと安定性で決めたのですが、結果的にMeta Questを使って起動するには
Meta Quest上で Quest Link(=Meta QuestのPCVR接続機能)を起動 → Quest Link上で Steam VRを起動 → ゲームを起動
と、起動手順が多い上にQuestのスタンドアロンアプリには出来ないゲームになってしまいそうです。
一方、本作と近いジャンルの体感型VRゲームをすぐ近くで展示していた Shibuya Emergent Gamesさんの
この作品。Crowbar Climber Demo Gameplay 01
— Shibuya Emergent Games (@PassoncoU) 2024年3月11日
Release in 2024
#Quest2 #Quest3 #PCVR #SteamVR pic.twitter.com/1HciyvYM1G
こちらはMeta Questのスタンドアロンアプリにもなっているし、PCVRとして遊ぶときもQuest Linkのみで起動出来て快適でした。
OpenXR Pluginで作られているそうで、こちらはそういう柔軟なビルドが可能とのことでした。Valveも関わった上でのVR開発の共通基盤という触れ込みですしね。
流石に今からは変えませんが、またVRを作るならこちらもありかもしれません。
ほか、
Hurricane VR - Physics Interaction Toolkit | 物理エンジン | Unity Asset Store Hurricane VRという面白そうなVR物理ツールキットも教えてもらえました。
大変参考になりました。
その他、良かったところ
- アバターについて、昨年は仕込んでおいたものを使いましたが今年は自由なVRMモデルが使えるようにパワーアップしています!ずんだもんとか反応がよかったですね。
- ゲーム中にポーズメニューが使えるので、プレイ中にサッとタイトルへ戻るのが楽になりました
その他、問題があったところ
- 誤操作防止のためにタイトルのボタンは一歩前に出ないと届かない位置にしていたら、ステージ開始後も前に進んだ位置のまま遊ばれてしまった→ホームポジションに対するボタンの位置はたったまま押しやすい位置に統一すべきですね。
特にオチはないですが、ゲームダンジョンの展示は盛況でしたという報告でした!
【Unity Cinemachine】Z Dampingでプレビュー通りにTracked Dolly Bodyが動かなかった
結論だけ
Virtual Camera Bodyの Z Dampingが0になっていないと、実行時のみカメラ位置が遅れます!

これを0にすればOK!
詳しく
カメラを含めたカットシーン演出ではTimeline+Cinemachineが便利です。 Cinemachine、Timelineって何?→ゴメン、ググって!

こんな感じで、Tracked Dolly Body と Dolly CartをTimelineで一緒にアニメーションさせることで、カメラ位置と注視位置を両方動かすカメラが作れます。
ところが、
実行前にTimelineをプレビュー再生するとこうなのに
プレイを押してゲームを再生させると、このようにカメラが右に振れてしまいます。
シーンを見てみると、プレビューに比べてカメラ位置が遅れていることが分かり、最初に書いた通り Z Dampingを0にすると直りました! 何もいじってないのでデフォルトでこうなっている模様。カメラが激しく動きすぎないようにするための機能っぽいですが、カットシーンでは不要なので要注意ですね!
【Unity】Unhandled exception. System.BadImageFormatException: Could not load file or assembly ILPostProcessorRunner.exe の直し方
Editorで開発中、突然「実行前にコンパイルエラーを直す必要があります」と言われ、Editor実行ができなくなった。 コンソールログを見ると以下のエラーが赤アイコンでたくさん並んでいた。
Unhandled exception. System.BadImageFormatException: Could not load file or assembly 'C:/Program Files/Unity/Hub/Editor/2021.3.14f1/Editor/Data/Tools/ILPostProcessorRunner/ILPostProcessorRunner.exe'. Format of the executable (.exe) or library (.dll) is invalid. File name: 'C:/Program Files/Unity/Hub/Editor/2021.3.14f1/Editor/Data/Tools/ILPostProcessorRunner/ILPostProcessorRunner.exe' at System.Runtime.Loader.AssemblyLoadContext.LoadFromPath(IntPtr ptrNativeAssemblyLoadContext, String ilPath, String niPath, ObjectHandleOnStack retAssembly) at System.Runtime.Loader.AssemblyLoadContext.LoadFromAssemblyPath(String assemblyPath) at Program.Main(String[] args)
結論
UnityHubから該当のUnity2021.3.14f1を再インストールすることで直った。
修正までの経緯
・起きる直前の作業は、コードを変更してCtrl+Rでスクリプトをロード
・普通のMonobehaviourコードで、特別なコードは書いていなかった。
・手元の変更がない他のプロジェクトを開いたところ、やはり同じエラーでEditor実行が出来なかった
・PCを再起動したが、治らなかった
・エラー内にあるILPostProcessorRunner.exeのフォルダを見に行ったところ、ファイルサイズが0KBになっており、更新日時がこの時点の1時間ほど前になっていた。
・UnityHubからUnityEditorをアンインストールして、再度インストールした
・無事に正常にEditor実行できるようになった
・再度ILPostProcessorRunner.exeを見たところ、46KBだった。
推測
意図しない何らかのプロセスがILPostProcessorRunner.exeを破損させた(例えばアンチウィルスソフトなど)
直前の作業や手元の変更は関係がないと思われる。
【Unity】VRゲームでCameraを重ねた固定位置UIは基本作れない
SteamVR Pluginに関する技術メモです!
前提
時間制限のような固定位置でのUI要素を作りたい!
- SteamVR PluginでのVR開発
- Unity2021.3.14f1
- Meta Quest 2 (Quest Linkを使用)
- Windows10
分かったこと
結論から言うと、ヘッドセットに描画出来るカメラは1つだけです。
普通のゲームと同じ要領で、Depthを上げたUI用カメラをCanvasの中に入れて通常のカメラの描画結果の上に重ねて・・という方法は、おそらく不可能です。
動作検証の詳細

画像の通りプレビューではUIが表示されていますが、実行するとヘッドセットでは消えてしまいました。 機能している1人称カメラを試しに消したところ、UI用カメラの結果だけが描画されるのでなく、何も描画されない結果になりました。
いろいろ試したところ、UI用カメラに以下の条件が満たされているとUI用カメラのみがヘッドセットで描画されました。
- Projection: PerspectiveはOK。OrthographicはNG
- ClearFlags: Sky boxはOK。Depth OnlyはNG。(おそらくSkybox or Solid Color)
- Depth: -1~1はOK。2はNG(おそらく2以上がNG)
- Target Display: 1はOK。2はNG
- Target Eye: BothがOK。NoneはNG (これは当然)
これらOK条件を全て満たしている場合のみ、Cameraがヘッドセットに描画されました。
そのようなカメラが複数ある場合は、Depthが高いものが優先されるようです。 条件を見れば分かる通り、そもそも複数のカメラで重ねて描画する設定が選択出来ません。
理由は不明ですが、ひとまずUIも含めて1カメラでシーン内に作っていくしかなさそうです。
推測
SteamVR PluginがUnityのカメラと深く結びついていて、マルチカメラが想定されていないまたは意図して制限しているのかもしれません。
一般的にいってカメラが複数あるとゲームのフレームレートは下がりますし、高FPSが必要とされるVRでは頑張って1カメラで作りなさいということなのかもしれませんね。

