【ruleファイルあり】Cursorでウォーターフォールをやってみたらほぼ全工程をAIが担当してくれた話

## はじめに

Cursorを使ったゲーム開発で、ウォーターフォールをAI主導で実践してみたら捗りました。

端的に言うと、要求定義だけAIに入れればあとは基本自動で、ただし聞くべきところは聞いてくる、みたいな開発体験ができました。

rulesファイルだけ見たい方は [こちら](https://qiita.com/yheihei/items/1555c2a24a2b8b0f4d70#%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9Frule%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)。

## 開発環境

- Unity 2021.03.06 (古い...)
- Cursor+gemini-2.5-pro-preview-05-06
- 作ってるゲーム [VLCNP物語](https://vlcnpstory.y-game.tech/)

![CleanShot 2025-05-25 at 15.27.08@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946267/7f7571d9-5a0b-468d-87d1-a20f33f0be8c.png)

## 開発プロセスの変化

### 昔の開発プロセス（全部俺）

- 要求定義：俺
- 要件定義：俺  
- 基本設計：俺
- プログラミング：俺
- テスト：俺
- レビュー：俺

### AI時代の開発プロセス（Cursor導入後）

- 要求定義：俺（唯一の生き残り工程）
- 要件定義：Cursor
- 基本設計：Cursor  
- プログラミング：Cursor
- テスト：俺（動作確認のみ）
- レビュー：CodeRabbit + GitHub Copilot

## 実際の開発フロー

### 0. 前提

これから説明するフローは後述のrulesファイルに全て書かれています。
そのため、要求定義だけインプットすれば、あとは自動でやるように組んであります。

rulesファイルだけ見たい方は [こちら](https://qiita.com/yheihei/items/1555c2a24a2b8b0f4d70#%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9Frule%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)。(2回目)

では実際のフローに入っていきます。

### 1. 要求定義（俺の仕事）

「こんなことしたいな〜」レベルの要求を書く。

```md
# 目的

- プレイヤーがダメージを受けた時、プレイヤーに毒を付与したい
- 毒を受けている間、プレイヤーの移動速度が50%になる
- 毒は毒の治癒時間を持つ。デフォルトでは5sで治る
- プレイヤー切り替えを行った時、次のキャラクターに毒は引き継がれない
- 毒を受けたキャラがプレイヤー切り替えで非表示になった時、毒の治癒時間もストップする
- 再度毒を受けたキャラクターが切り替えて表示状態になった時、毒の治癒時間のカウントが再開

# 技術的制約
- 単一責任の原則を守りつつより良いクラス設計にすること
- @PoisonAttacher と @PoisonStatus を使うこと

# 開発ガイドライン(参考)

- プレイヤーの移動は `Assets/Scripts/Movement/Mover.cs`
- プレイヤーの切り替えは `Assets/Scripts/Control/PartyCongroller.cs`
```

ポイント:

- > @PoisonAttacher と @PoisonStatus を使うこと
  - あらかじめ作るだろうクラスのスケルトンだけ作っておき、そこをいじってと明示するとスムーズ
- 「開発ガイドライン」の項目で、多分この辺見ないとヤバそうみたいなのを教えておく
- 要求を作るのがめんどくさい場合、要求定義をAIと一緒に作っても良い

完成イメージは下記の通りです。

https://x.com/yhei_hei/status/1925097623364710883

次に、この要求をもとに、要件定義+基本設計をCursorにやらせます。

### 2. 要件定義＋基本設計（Cursorが担当）

- 要求メモをCursorに見せて、どんな要件を書けばいいか相談
- 要件定義（基本設計も含む）をmdファイルで保存させる

ルールファイルでフローを定義済みなので、下記の指示を行って開始させます。

![1.開発開始.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946267/a9ce1690-cbed-4b12-86fd-5522272b2a05.png)

出力された要件定義(ほぼ基本設計)をもとに、認識齟齬がある部分を修正させていきます。

![2.要件定義の修正.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946267/d7a723c7-ec06-411d-bdc7-43a9a7a97db5.png)

ここで、要求に変更が出た場合は、要求定義自体も直させます。

最終的な要件定義(+基本設計):

```md
# PoisonStatus 機能開発プラン

1.  **`PoisonStatus.cs` の実装**:
    *   キャラクターの毒状態（毒にかかっているか、治癒までの残り時間など）を管理します。
    *   毒にかかっている間、キャラクターの移動速度を50%に低下させる機能（`Mover`クラスとの連携）。
    *   毒の治癒時間をカウントダウンし、0になったら毒状態を解除し、移動速度を元に戻す機能。
    *   キャラクターが非表示になった際に治癒時間のカウントを一時停止し、再表示された際にカウントを再開する機能。
2.  **`PoisonAttacher.cs` の実装**:
    *   キャラクターがダメージを受けた際に、そのキャラクターの`PoisonStatus`コンポーネントを取得または追加し、毒状態を開始させる責務を持ちます。
3.  **`Mover.cs` の修正**:
    *   `PoisonStatus` クラスと連携し、毒による移動速度の低下を反映できるようにします。
    *   外部から現在の移動速度補正値（例: 0.5f など）を設定できるようなインターフェースを追加することを検討します。
4.  **`PartyController.cs` の修正**:
    *   キャラクター切り替え (`SwitchCharacter`) 時に、非アクティブになるキャラクターの `PoisonStatus` に対して治癒時間カウントの一時停止を指示します。
    *   アクティブになるキャラクターの `PoisonStatus` に対して治癒時間カウントの再開を指示します。
    *   毒状態がキャラクター間で引き継がれないことを保証します。 
```

### 3. プログラミング（Cursorが実装）

要件定義を承認すると、Cursorが実装を開始します。

![3.プログラミング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946267/af79323f-2974-43be-b711-211fa00cd5de.png)

2分ぐらい待つと実装が終わったので確認します。

毒の機能自体は完璧でしたが、毒を付与する契機がなかったため、さらに指示を与えます。

![4.追加指示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946267/2fd5b78a-4635-4821-8dad-b0873c1e45cb.png)

「UnityのEventのやつ」と言う非常にざっくりとした指示をしたにも関わらず、意図を理解して実装してくれます。ちゃんとプランを出してこちらに確認をしてくるので承認して続けます。(勝手に実装しない)

![CleanShot 2025-05-25 at 11.39.44@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946267/b841f995-1ef2-421a-9b22-98afbe5b3075.png)

実装が完了しました。ざっくりテストして問題なかったため承認します。
最後に、コードから逆生成で設計書を出力してもらいます。今後この辺りに手を加える場合に、最初からこの設計書を渡しておくとスムーズになるためです。

![CleanShot 2025-05-25 at 11.42.57@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946267/76888e2f-8326-4b70-acc6-f7711cece710.png)

生成された設計書:

```
# 毒ステータス機能 設計書

## 1. 目的

プレイヤーキャラクターがダメージを受けた際に毒状態を付与し、一定時間移動速度を低下させる機能を実装する。また、キャラクター切り替え時の毒状態の挙動を管理する。

## 2. 主要コンポーネントと役割

### 2.1. `PoisonStatus.cs` (`VLCNP.Stats`)
-   キャラクターの毒状態（毒にかかっているか、治癒までの残り時間）を管理する。

...省略

## 4. Unity Editorでの設定

-   攻撃時に毒を付与したい `GameObject` にアタッチされている `DirectAttack` コンポーネントのインスペクターを開く。
-   `On Attack Success (GameObject)` イベントスロットに、`PoisonAttacher` コンポーネントを持つ `GameObject` (例えば、攻撃を仕掛けるキャラクター自身や、シーン内の専用マネージャーなど) をドラッグ＆ドロップする。
-   ドロップダウンメニューから `PoisonAttacher` -> `AttachPoison (GameObject)` を選択する。
```

驚いたのが、Unity Editor上での設定方法まで言及している点。メリットは後述します。

### 4. レビュー（AIが実施）

- できたコードをcommitし、プルリクエストを出す
- CodeRabbitとGitHub Copilotがコードレビュー

![CleanShot 2025-05-21 at 18.53.44@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946267/5d9b567c-d012-4723-b819-9a6f68650a1b.png)

- AIの指摘でもっともそうなものだけCursorに伝えて議論

![CleanShot 2025-05-21 at 19.00.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946267/5507c0e0-a262-4991-90b3-1298c3344c27.png)

意図は理解したので率直にやりたいことを伝える。

![CleanShot 2025-05-21 at 19.01.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946267/fb88a738-795d-41c3-99a3-be945ab9f707.png)

これで完成。

## AI驚き屋ポイント

### メイン作業は要求フェーズのみ

実際に手を動かしたのは要求定義だけ。

その他は成果物の確認のみで、ドキュメントもコードも1行も書いていない。

### 設計書の再利用性

- Unity Editor上での操作方法まで記載された説明書にもなる
- Cursorに質問すれば設定方法を教えてくれるようになる
- NotebookLMに入れればプロジェクト専用チャットボット完成

## その他感想

### 技術スキル

- プランを見ても「ああ、そうだよね。そこいじるよね」という実用的なスキル感
- 少なくともジュニアレベルではなく、むしろUnityの知識は筆者以上
- gemini2.5Proでやったが、Claude4.0だとそれ以上になりそう

### コミュニケーション体験

- 実在のエンジニアと会話している感覚
- PMになったような感覚（ずっとテキストを書いている）

## 使用したruleファイル

開発フェーズを意識させ、停止すべきところで停止する、みたいなルールファイルになってます。停止条件を定義し、適切に暴走を止める仕組みになっていると思います。

是非使ってみて。

※ ちなみにこのルールファイル自体もo3にほとんど作らせています。何もやることねえ

- `.cursor/rules/01-governance.mdc`
```md
---
description: 
globs: 
alwaysApply: true
---
# ✅ 基本方針
- **Autonomy: Medium**  # Plan と Imp と Debug フェーズ後に確認
- PRDを受け取ったら、PRDを確認し、不明点がないか確認する。確認の結果 PRD に変更があればPRDを更新する
- その後、PRD の各項目を Planに落とし込む
- Planができたらユーザーに確認する。ユーザー確認が終わったら、Planを保存する
- Impする
- ユーザーに Imp の確認をお願いする
- 適宜、Planフェーズ or Impフェーズに戻る
- irreversible / high-risk 操作（削除・本番 DB 変更・外部 API 決定）は必ず停止する

# 制約
## 技術的制約
- Unity 2021.3.16
- C#

# 🚦 停止条件
- PRDを確認し、不明点があった時
- Planが終わりPlan全文をmdファイルに書き込んだとき
- Impが終わった時
- 1ファイル当たり変更行数 > 300 行  
- 「複数案が等価」「重大な設計選択」など Fork in the road が発生
- 下記のgit操作をしたいとき
  - rebase
  - revert
  - その他破壊的な操作

# 📝 人間への質問フォーマット

❓ QUESTION
<要約>

OPTIONS:
1. <案 A>
2. <案 B>

/answer <番号> で回答してください。
```

- `.cursor/rules/02-plan-exporter.mdc`
```md
---
description: 
globs: 
alwaysApply: true
---
# 📝 Plan Exporter
- **Trigger**: Plan フェーズが完了した直後
- **Action**:
  1. 生成した Plan 全文を `Assets/DocsForAI/Plan/${タスクの概要}.md` に **上書き**

- **Confirmation**:  
  - ファイル作成に失敗したら停止
```


## おわりに

Cursorを使ったウォーターフォール開発により、開発プロセスの大部分をAIが担当する体験ができました。

人間の役割は要求定義と最終確認に集約され、開発の効率化と品質向上を両立できる可能性を感じています。

特にゲーム開発の場合はゲームそのものに集中するため、プログラミングに割くリソースは最低限にしたい思いがあります。Cursorがその大部分をやってくれたため、ゲームそのものに集中できる時間が増えました。

最後に、Cursorと共に作ってる2Dアクションゲームの体験版を公開中です！ 是非やってみて〜！

[VLCNP物語](https://vlcnpstory.y-game.tech/)

![CleanShot 2025-05-25 at 15.27.08@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946267/7f7571d9-5a0b-468d-87d1-a20f33f0be8c.png)

操作方法:

- ← → ... 移動
- ↑ ... しらべる
- スペース ... ジャンプ
- X ... こうげき
- Z ... キャラ切り替え

推奨環境:
- PCのみ
- Chrome


## 参考資料

- [自律的要件駆動方法](https://chatgpt.com/share/6832888d-cb18-800e-a255-9796c57ffcdb)
- [LLMのプロンプトエンジニアリング](https://amzn.to/3FwziwF)