Cursor + Unity を試す

本記事は [オルトプラス Advent Calendar 2023](https://qiita.com/advent-calendar/2023/altplus2023) の 12/11 の記事です。

# はじめに
 本記事は、[Cursor(カーソル)](https://cursor.sh/)という開発向けのエディタを、Unity/C#の開発エディタとして使ってみたという内容になります。

AIとの連携が強いということで、簡単にいうと、コードを書いてもらったり、実装されている機能を教えてもらったりという感じで、AIとペアプログラミングっぽい事ができます。
ただ、搭載されているAIのChat-GPTが得意とする Python や Web系の話が比較的に多い様です。
因みに、「Cursor Unity」と検索すると、[UnityEngine.Cursor](https://docs.unity3d.com/ja/2019.4/ScriptReference/Cursor.html) の公式マニュアルに飛ばされました・・

# こんな人向け
- Unity+VSCodeで開発している人
- Cursor を実際に使ってみたい人

(画面キャプチャや操作はMacOSのものとなります)



# 前提
こちらのバージョンを使って確認しております
 - Unity 2022.3.13f1
 - Cursor 0.17(フリープラン)

## 準備
Cursorをインストールして、Unityの設定で VSCode -> Cursor をエディターに指定。
日本語化もできました。
ログインが必要ですが、Chat-GPTで使っているアカウントでログインできました。

詳しいセットアップのやCursor自体の使い方については、ここで私が解説するより、私が辿った際に、丁寧で読みやすいと思ったURLを、下記に貼っておりますのでご参考ください。

ネットの資源は、最大限に有効活用していくことも大切ですね。(という言い訳)

#### Cursorのインストール + Unity開発で使う設定
https://zenn.dev/wappaboy/articles/cursor-unity
#### Cursorの日本語化
https://qiita.com/k1mu0419/items/2d903660d1f571abb8f2

# Cursorについて ~ VSCodeの代わりになる?
Cursorは、VSCodeをフォークしており、使い方などは、VSCodeを使っている人なら、移行後も特に違和感は無いと思います。

機能について見てみるとこんな感じのキーワードが出てきます。
- Command K
- Chat *
- @ Symbol *
- Codebase-Answer *
- Docs
- AutoDebug
- Fix Lints

AutoDebug とか機能名だけで夢広がりますが、これだけ見てもよく分からないので、さっそく使っていきます。(本記事では、*印の機能だけ触れます)


# Chat を使う

まずはいつも通り、Unityで新規に空のプロジェクトを作成します。その後、 Cursorでそのプロジェクトフォルダを開いて作業開始。
とりあえず、AIに何かしてもらいたいので <b>Chat機能</b>を使ってみます。

<b>Chat機能</b>は ```Command + L``` でチャット欄を開いて自然言語でAIに質問や書いてほしいコードの概要を書きます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618792/78b0d906-c83e-5b30-4c1e-181b741d3817.png)

「gpt-4」と左下にある通り、フリー版でもGPT PlusのGPT-4が使えます。ただし50回だけ。あとはGPT-3.5がお相手します。

# 無茶をふってみる

とりあえず、どこまでやってくれるのか見たいので、無茶な注文から投げてみるところから。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618792/d2ccb676-ac80-2b16-04ec-92a9120ff6c6.png)
パッケージをいれる必要があったので頼んでみましたが、流石にエディタの範囲を超えた仕事はしてくれない様です。

ただ、代わりにパッケージを入れる手順をGitHubのURL付きで教えてくれました。
ヘルプ的なものは、Chat-GPTのWebアプリなんかで聞いても同じく答えはもらえますが、その場で答えてくれるのば便利。

# コードを書いてもらう

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618792/15f80a36-fc2e-b5bf-ada8-21a73d97ff63.png)

この辺は期待通りにはコード生成してくれています。もう少し注文をつけて、細かいところもお願いして修正案を出してもらいます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618792/d4fbaf65-e82b-01f9-7166-8b3e2e9da7ee.png)

<b>Codebase-Answer 機能</b>で、先ほどプロジェクト追加された UniTaskのコードを理解してその内容を踏襲して実装してくれているのだそうです。
こんな感じで、ローカルにあるコードベース + 言語の公式マニュアル等を取り込んだ知識を優先して、AIが実装方法を考えてくれるので、インターネット上にあるAIが出す答えに起こりがちな [ハルシネーション](https://atmarkit.itmedia.co.jp/ait/articles/2303/30/news027.html) が起こりにくいと言われています。

しかし、この生成コードのクラスのままだと、もう少し補足が必要でした(指示が足りてない為)

:::note
<b>Codebase-Answer</b>
Codebaseで答えを得たいときは、ChatやCommand KからAIにメッセージを送る際、```Command+Enter``` で送信する。
:::

# プロジェクト内のクラスを継承した実装

シングルトンのクラス定義は書いてくれていましたが、今度は、いつも使っているジェネリックなクラスのファイルを他プロジェクトからコピーで流用し、そちらを使うように指示してみます。こういう時は、<b>@ Symbol 機能</b>でファイルを指定しながらAIにメッセージを送ることが出来ます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618792/b814e6c5-2788-3490-5caf-2b8cf8a573d7.png)

:::note
<b>@ Symbol</b>
Chatの入力欄に ```@``` を入力すると、プロジェクト内のソースコードのファイル等のシンボルを指定しながら質問をしたりすることが可能。```@```は、文章に組み込んでもOK。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618792/fafb5c95-d408-ad57-13f7-a2f18ae82af9.png)
:::

継承前に、自前で持っていたシングルトンパターンに関する記述も、不要と判断して削除してくれているので、ちゃんとコードの内容を理解した上で書いてくれている様です。実装上不自然なものについても、分かりやすく指摘してくれています。(この場合は、指定するファイルを間違えていました)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618792/fd5a84d4-ae03-6071-3da3-d702698d3ed3.png)

AIに指摘された部分を @ Symbol で正しいものに再指定。同じチャット内なら、話の流れを理解して通じるのも地味に便利。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618792/51437756-e758-723a-5c7a-a103a5a76fb7.png)

AIが提案したコードの修正は、即座に適応はされません。
チャット欄のAIが返したソースコード案の右上にある再生マークの様なボタンで適用されます。更に変更前の差分を確認しながら反映できるので、AIがいきなりコードを壊すこともありません。人間もここで理解しながらレビューしてコードを安全に適用するとができます。

# Unity特有のコード

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618792/475db6ee-c79e-77a2-2ebe-663e08f2f58a.png)

アプリ実行時に初期化するようにしてもらいます。これには、Unity特有の属性の記述が必要ですが、解説付きで提案をしてくれます。

# 動くのか?
ここまで、コード全く書いてませんが一旦動作チェック。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618792/0528c565-1142-4eae-e795-20eb08c3a851.png)

意図した動作で、インスタンスが作られました。

![リソースのロード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618792/4a752f40-131a-df00-66a9-1005c202e51c.png)

他の実装もいくつか行なって、リソースからPrefabを生成して表示するところまで動いてしまいました。

もっと色々試そうと思ったところで、gpt-4が上限に達してしまいました。gpt-3.5にするとやっぱりちょっと変な動きするので、使うならgpt-4がいいですね。

![スクリーンショット 2023-12-01 10.33.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618792/a0d185b0-3d0a-e793-8765-442b1ce2451e.png)




# 長めの注文をつけてみる(おまけ)

![長めの注文](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618792/8a8027d6-7678-f44f-1bdc-cff92d07e11f.png)

流石に、ちょっと言いすぎたかな・・?

・・・

![長めの注文code](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618792/cd5a54b7-3f28-633e-f8cc-e66946fc6fc7.png)

うあああぁ・・!
本当に自分では書いてませんよ!(汗)


# おわりに

　今回は、CursorのAIにコードを書いてもらいたかったので、あえてシンプルな実装に留めた事もあって、ほぼAIが意図した通りのものを作ってくれました。
 
 実際の利用シーンと比べると、必ずしも合っていないかもしれませんが、シンプルなものだったり、パターンやロジックがはっきりしている場合は、AIに振って、複雑な対応が必要なものを人間が担当する等のシーンは、そこそこ現実味が出てきた感じがします。
 
 実装してくれるエンジニアの方にお願いする際は、大きな仕様になってくるほど言葉だけでは伝え切らないのは同じで、「ざっくり、こんな機能作ってくれ」みたいな丸投げはなかなかできなくて(それでもやり遂げちゃう人はたまにいますが)、結構気を遣って細かな指示を出していくと思います。同じように、部分的な機能の実装作業をしてもらったり、よくあるパターンだけど、どうやって実装してたっけー?って人間が探しているうちにサクッとその場で書いてもらったりという感じの使い方だけでも、利用価値があるんじゃないかなと感じています。

何より、初めてインターネットを体験したときのようなワクワク感がありますね。
Cursorにはまだ、Docsというこれもまた強力な機能がありますし、[Github Copilot](https://docs.github.com/ja/copilot)や、
[Open Interpreter](https://openinterpreter.com/)と合わせて使うという話も面白いです。もし次回があれば、使った感じをお伝えできればと思います。

最後までお読み頂き、ありがとうございました。

- - -
### 参考(その他)

https://cursor.sh/features

https://chatgpt-lab.com/n/n4ee439fcb692

https://zenn.dev/gamuprog/articles/53e7adee04b337

https://www.youtube.com/watch?v=op5LZ0rZ4Ck