UnityとchatGPTで脱出ゲー作らせてみた【ひたすら楽してAI創作】
今月9月からUnityの勉強をはじめて、chatGPTに色々聞きながらゲームクリアするところまでを作った。
↓実際に動くビルドプログラムと、プレイ動画。良かったら遊んでね
http://sukidukinn.blog/wp-content/uploads/2024/09/20240915_EscapeTheSlotRoom.zip
2週間はUnityの勉強、このゲームは昨日と今日の10時間ちょっとで作成。
ほとんどはAIに聞いて9割は出力されたコードを丸々貼り付けで動いた。
chatGPT4o(オムニ)で作ったから、Unity初心者で無料ユーザーでも作れる。
https://chatgpt.com/share/e/66e6d1c3-3008-8013-abce-3ee498479d7f
↑実際にゲーム作りの最初からAI回答集を全部残した(14万文字)
①スロットゲームがある部屋から脱出するゲームをUnityで作りたいです。ゲームタイトルを考えてください。 → Escape the Slot Room
②ゲーム管理マネージャークラスをシングルトンで作って → はいコード
③自キャラぴょんぴょん動かしたい → はいPlayerController
③触れたりマウスでアイテム選んだら取得したい → はいItemHoverEffect
④食べ物取ったら満腹度を上げて、時間経過で満腹度0になったらゲームオーバーにして → はい改良
⑤うまくうごかねぇーんだけど!(怒)エラーコードこれ! → 修正っす
⑥メダル獲得したら床が開いて脱出してゲームクリアにして → ほい
⑦音とかBGMつけたい → はいSoundManager
右往左往したけど、chatGPTのコードを張り付けると8割はうまく動いた。
想定通りでなかったり、そもそもコンパイルエラーだったりした場合は、そのままchatGPTにコードを渡したり事象を伝えればOK!
唯一AIに頼らなかった部分は、ゲームのバランス調整のところ。
この脱出ゲーム、というかスコアを競うゲームは脱出までは短いけど階層(RoomNumber)が大きくなるごとに難易度が上がっていつか終わるようにしている。
階層が上がるほど、時間経過による満腹度の減少が増え、アイテムの出現頻度が増え、脱出するために必要なメダル数が飛躍的に増える。
この数値のバランスいじりは、AIには難しいのでこちらの感覚で修正した。
// 満腹度を減少させる処理を別メソッドに分ける
private void HandleHungerDecrease()
{
hungerDecreaseTimer += Time.deltaTime;
if (hungerDecreaseTimer >= hungerDecreaseInterval )
{
// キャラクターが動かず、マウスが動いておらず、かつキャラクターが地面にいる場合
if (isGrounded && !isCharacterMoving && !mouseMovedOrClicked)
{
// hungerDecreaseIdleで計算
currentHunger = Mathf.Max(currentHunger - hungerDecreaseIdle - Mathf.FloorToInt(roomNumber/2), 0);
}
else
{
// hungerDecreaseActiveで計算
currentHunger = Mathf.Max(currentHunger - hungerDecreaseActive - roomNumber, 0);
}
hungerDecreaseTimer = 0f; // タイマーをリセット
isCharacterMoving = false;
mouseMovedOrClicked = false;
// 着地かつ満腹度が0になったらゲームオーバー
if (currentHunger <= 0 && isGrounded)
{
GameOver();
}
// 満腹度をUIに反映
UpdateUI();
}
}
// 部屋クリア後の設定更新処理
private void UpdateRoomSettings()
{
roomNumber++;
itemSpawner.SetSpawnInterval(spawnInterval - (0.5f * roomNumber) ); //アイテムスポーンを5秒ごとに設定
itemSpawner.SetSpawnLimit(Mathf.Max(spawnLimitBase, roomNumber)); //スポーン上限数を増やす。最低5
}
↓満腹度は1秒ごとに、動かない場合は (1+部屋番号/2)、動いた場合は(3+部屋番号)が減る
currentHunger = Mathf.Max(currentHunger - hungerDecreaseIdle - Mathf.FloorToInt(roomNumber/2), 0);
currentHunger = Mathf.Max(currentHunger - hungerDecreaseActive - roomNumber, 0);
↓脱出時に部屋番号を増やして、アイテム出現タイミングを(5-0.5×部屋番号)に変更し、出現上限数を部屋番号(最低は5)に変更する
roomNumber++;
itemSpawner.SetSpawnInterval(spawnInterval - (0.5f * roomNumber)); itemSpawner.SetSpawnLimit(Mathf.Max(spawnLimitBase, roomNumber));
脱出するのに必要なメダル数は、部屋番号の二乗×100枚だから、
100→400→900→1600→2500→… と指数関数的に増えていく。
なので、いづれ空腹度の減少で息切れすることになる。
ただアイテムをとるだけだと戦略性がないので、
同じアイテムを連続でとるとコンボが発生して、メダルはコンボ分を掛け算で増やすように調整した。
private void getItemEvent(ItemRotate item)
{
// 前回のアイテムと同じ名前かどうかをチェック
if (lastItemName == item.gameObject.name)
{
// 同じ名前ならコンボ数を増やす
comboCount++;
}
else
{
// 違う名前ならコンボをリセット
comboCount = 1;
}
// 最後に取得したアイテムの名前を更新
lastItemName = item.gameObject.name;
// メダルをコンボ数で掛け算して増やす
totalMedals += item.medalIncrease * comboCount;
// アイテムの情報を取得してメダルと満腹度を更新
totalMedals += item.medalIncrease;
currentHunger = Mathf.Min(currentHunger + item.hungerIncrease, maxHunger);
// アイテムを破壊
Destroy(item.gameObject);
//音を鳴らす
FindObjectOfType<SoundManager>().PlayItemPickupSE();
// UIを更新
UpdateUI();
}
デバッグとして色々いじったけど、バグあったらコメントや匿名マシュマロで教えてくれると嬉しい。
①Ctrl屈伸だけは動いたことにならない(省エネ扱い)
②空腹になってもジャンプ中なら死なないのでワンチャンゴールに飛べ
③コンテニューしてもメダルは維持するから限界に挑戦して
yomoaruにマシュマロを投げる | マシュマロ (marshmallow-qa.com)
20階層を超えると移動だけで大量獲得プレイができてインフレを楽しめるかもしれない
え? スロット部屋から脱出ってタイトルなのにスロットが置きもの?
まずは動くゲームの全体を作ってから、本格的なスロット機能を追加して脱出ゲームにするんだよ!!
コードやプロジェクト素材全部はこちら: http://sukidukinn.blog/wp-content/uploads/2024/09/Unity_EscapeTheSlotRoom.zip
この記事が気に入ったらサポートをしてみませんか?