GPTsでマルチプレイ可能なキャバクラゲームを作ってみた(技術解説あり)
はじめに
GPTsが公開されて、色々なカスタムChatGPTが作られるようになった。さらに、GPT4Vが出て、画像生成なんかもできるようになり、それを使ってゲームを作っている人もちらほら見るようになってきた。
というわけで、自分もなんか作ろうかなと思って、今関わっているXANAの看板NFTであるXANA Genesisを使って、作ったゲームが、以下のGenesis Haven(ジェネシス・ヘイブン、注:ヘブンではない)である。
実際のゲームはこちらでプレイ可能。
ChatGPT - Genesis Haven(ジェネシス・ヘイブン) (openai.com)
(現在、2月4日までの期間限定イベント開催中。1位になったら仮想通貨XETAがもらえるので、ぜひご参加頂ければ)
本記事では、このゲームの内容紹介、どのように開発したか、開発の裏話、そして最後に、今回使ったプロンプトやテクニックなどの技術的な解説をしていきたいと思う。
ゲーム開発のきっかけ
このゲームを作ろうと思ったのは、GPTsが登場して、1週間ほど経って、恋愛系のゲームが出てきだしたのを見て、あぁなるほど、そういうのもできるのかと思い、着想を得た。
今回題材となった、XANA Genesisは1万体もいる美しい女性キャラクターをモチーフとしたAIチャット機能付きNFTで、ChatGPTより前にリリースされた先進的な取り組みである。そして、私がXANAに興味を持ったきっかけでもある。
その後、XANA Genesisに個性を持たせたいと思うようになり、実際に提案して、開発の中に入り、実装するところまで関わらせて頂いた。そんなことをやっている間、このGenesis達がバーチャルにお店開いて、色んな人たちのお話を聞けるような空間が作れたら、ウケそうだなぁと思っていた。
それから半年くらいが経ち、GPTsの登場により、これでちょっと作ってみてもいいかもしれない、と思ったのがきっかけである。
ゲームの構想
今回、ゲームを開発するに当たり、とりあえず相談したのがChatGPT。とりえあずのアイディアをインプットして、具体的なゲーム要素やルールなど、色々ディスカッションしながら、ある程度の設計を進めた。
個人的には、1人じゃなくて、色んな人が一緒にプレイできるようにしたいと思い、カスタムAPIを使って、状態を保持できるような構成にする前提で考え、必要なデータベース設計もこの段階である程度固めた。
ただ、あまり色々詰め込みすぎると、開発規模が大きくなってしまい、完成が遠のいてしまうので、今回はかなり必要最小限の構成まで機能を絞っている。
本当は、もっとユーザー同士がリアルタイムに絡めるような機能もアイディアとしてはあったのだが、開発工数の観点から泣く泣く削った。(この辺は後述)
ゲームの主なルール
このゲームの舞台は、Genesisという多様なキャラクターがホステスとして登場する仮想キャバクラ。プレイヤーは、「推し」のGenesisを店内No.1にすべく、Genesisランキングを競うのがメインの目的となる。
Genesisの指名
登録およびログイン後、まずは、Genesisを指名するところから、このゲームは始まる。Genesisは、1万体おり、既にGenesisを所有している人は自分の相棒を選択するもよし、そうでなければ、OpenSeaのリストから適当に選ぶこともできる。(技術的にどうしているかは後述)
ランキングポイント
ランキングを上げるには、以下のアクションが必要となる。
・Genesisの指名
・ドリンクの購入(貢ぐ)
基本的に、値段が高ければ高いほどポイント高であるが、実はそうでない場合もあったりするので、色々と試して頂きたい。なお、最高級レベルのドリンクである、ドンペリやXANAマスタードリンクを注文すると、決め台詞を言ってくれるので、ぜひ狙って頂きたい。
なお、現在のランキングは、ゲーム内で以下のように確認可能。
ゲーム通貨
ドリンクの注文には、通貨XENYが必要になるが、これは以下のアクションで獲得可能。
・初期登録ボーナス:3000 XENY
・毎日のログインボーナス:1000 XENY
・プレイヤーレベルアップ:レベルが高いほど、獲得XENYも向上
プレイヤーレベルをどのようにして上げるかは後述する。
ちなみに、このXENYは、XANAで実際のゲーム通貨として存在しているのだが、それとは全く連動していないので、念のため。
プレイヤーレベル
このゲームには、プレイヤーポイントという経験値的なものがあり、一定数に達するとレベルアップすることができる。ポイントを稼ぐためには、以下のアクションが必要となる。
・毎日のログイン
・ドリンクの購入(値段が高いほど高ポイント)
・Genesisとの対話による親密度UP
Genesisとの親密度については後述するが、対話によって親密度を上げた場合のみ、プレイヤーポイントが獲得できるので、ぜひ色々お話して欲しい。
Genesisとの親密度
Genesisとは指名回数やドリンク注文、会話などを通して、関係を築くことができ、関係が親密になればなるほど、Genesisの話し方も変化するように設計されている。
ちなみに、関係レベルがMAXになったら、デートに誘うこともできる、かもしれないので、ぜひプレイヤーの皆さんにはそれを目指してがんばって頂きたい。というか、実はこれがゲームの隠れゴールでもあったりする。
ゲームのシステム的な構成
ここからは、少し技術的な内容になる。
まず、このゲームは、以下のようなシステム構成となっている。
・フロントエンド(UI):GPTs (ChatGPT)
・バックエンド:Google Apps Script(GAS)
・データベース:Google Sheets
ぶっちゃけ、GASで開発した経験はこれまでになかったのだが、基本JavaScriptと同じなので、言語的にはそれほど苦労しなかったが、開発環境がかなりやっかいだった(後述)。
とはいえ、GASの場合、別途サーバー立てて運用する必要もなく、データベースとしてGoogle Sheetsを使えば、シームレスに連携でき、そっちの構築、運用の手間も省けるので、今回はこの構成で開発を進めることにした。
このゲーム自体、GPTsでどこまでできるかの勉強も兼ねており、そこまで本格運用する気もないのだが、もっとゲームとしてしっかり運用していくなら、他のアーキテクチャを選んだ方がいいと思う。
開発で苦労したこと
今回主に苦労した点としては以下。
・GASでの開発環境
・デバッグ&テスト
・GPTsのプロンプト設計
・OpenAIの規制
・GPTsの挙動変更
以下、順番に説明していく。
GASでの開発環境
上でも述べたが、GASでの開発は初めてということもあり、最初はオンライン上のGASエディタでそのまま開発していたのだが、これがどうにもやりにくい。コード補完機能もないし、Copilotも使えないし、ソースのバージョン管理もできない。
最初はこれでも良かったのだが、開発規模がだんだん大きくなってきて、コード量が増えてくると、さすがにこれだと効率が悪すぎるので、途中からローカルでの開発環境を構築し、そちらに移行した。
具体的的には、claspというツールを導入し、クラウド上のソースコードと同期を取るようにして、実際の開発はローカルのCursorで行い、ソース管理はGitHubで行う。
参考にしたのは以下のサイトあたり。
・GAS用のCLIツール clasp を使ってGASをローカルで開発して実行するの巻。 #GoogleAppsScript - Qiita
・GASのローカル開発環境 ~その2. ローカル環境とGASプロジェクトの連携 (gluegent.com)
これだけでかなりストレスが減ったので、もっと早くやっとけば良かったと後悔した。
デバッグ&テスト
これも非常にやっかい。というのも、ローカル環境ではそのままではGASでのプログラム(単体除く)が実行できないので、一旦クラウドに上げて、テストする必要があるのだが、これが手間で非効率。
おまけに、最終的なGPTsからGASを叩いたときのテストをするとなると、それをGAS上でリリースして、それをGPTsで指定するActionsのフォーマットにして、アップデートしてからようやくテストできる状態になる。それで凡ミスして、また修正して、上記プロセスをやり直すと、たまに心が折れそうになる。。
さらに、GPTsの回数制限がネックで、繰り返しテストしてるとあっという間に回数制限がきて、お預け状態を食らってしまう。他に開発することがあれば、その間別のところを開発していればいいのだが、終盤になると、テストがメインになってくるので、この制限は相当ネックになる。これは、GASと連携云々以前の問題で、GPTs開発者なら、皆苦労している点だと思う。
また、今回のようにActions機能を使って、API連携している場合、GPTsの裏でどのように動いているのかが隠れてしまっているので、エラーになっても、どこが動いていないのか不明確で、デバッグが結構大変だった。(これは後述)
GPTsのプロンプト設計
一通り、バックエンド開発が終わったら、後はGPTsの反応をみつつ、プロンプト調整がメインになってくる。現状、GPTsで設定できるプロンプトのは8000文字まで。ここでトークン数ではないのがミソ。トークン数であれば、プロンプトが英語であれば、結構な量使えるのだが、8000文字だと、英語の方が逆にかさばってしまう。
このゲームのプロンプトは基本的に英語なので、この制限にはかなり頭を悩ませた。こういうゲームを作ろうとすると、それなりに指示する内容が増えてくるので、到底8000文字では収まらない。最後は、もうこの1文削るかどうか、くらいの調整になってくる。
なので、knowledgeファイルをいかにうまく使うかがポイントになってくる。この辺、今回どうやったかは最後のおまけで具体的に説明する。
OpenAIの規制
OpenAIの規約上、今回のゲームの舞台であるキャバクラという設定は、性を連想させるものとして、あまり題材としては適していない。
さらに、GPTs Storeが1月に公開され、GPTs Storeの規約自体も厳しくなり、AI彼女系の恋愛ものは規制対象となり、締め出しをくらっているのが現状である(それでも次から次から湧いて出てきているようだが)
じゃあ、なんでそんな題材選んだんだ、と言われれば、前からやってみたかったから言うしかないのだが、OpenAIがこっち方面にかなりネガティブなのは知っていたので、まぁ、題材的にはちょっと微妙だなーとは思っていたのも事実ではある。
そして、この規制で、一番困るのが、DALL-E3による画像生成である。このゲームでは要所要所で、そのシーンを表現する画像を生成してくれるのだが、テストしていると、結構な確率でNGをくらって失敗してしまう。
そのため、生成のためのプロンプトはかなりマイルドにせざるを得なかった。なるべく規制にひっかかりそうな単語は避けて、マイルドな表現にしたりと、結構苦労した。それでも失敗するときは失敗する。
ゲームの題材上、あまりマイルドにしすぎても、逆に面白くないので、この辺の微調整は、後半結構時間を使った。
GPTsの挙動変更
これは、ゲームをリリースして、イベントをX上で開催している間(さらに、よりによって自分が風邪をひいて寝込んでいる間)に発生したのだが、どうも途中からGPTsの挙動が変わっていまい、うまくゲームが想定通り動かなくなってしまうという問題が発生してしまった。
これにはかなり苦労させられた。というのも、上でも書いたが、GPTsの裏の動きが全部隠れてしまっているので、開発者としてはどこが悪いのかが把握し辛いのである。デバッグ情報もほとんどないので、状況と開発者の勘に頼らざるをえない。
とりあえず、色々テストして、APIの方は問題なく動いていて、プロンプトも全く変更していないので、最終的にはGPTsの動きが変わったと判断し、それでも動くように、プロンプトを調整した。詳細な技術的なことは別途後述するが、GPTsの開発環境はもっと充実させて欲しいと思っているのは自分だけじゃないはず。(実際コミュニティでもそのような声は挙がっている)
本当は実装したかった機能
現状のゲームはかなりシンプルなものになっているが、当初の構想ではもっとゲーム性のあるものを考えていた。ただ、上記で挙げたような問題と時間的制約から、泣く泣く削った機能がいくつかあるので、とりあえず挙げておく。
イベント
実は、今リリースしているゲームでも多少イベント的な要素を盛り込んではあるのだが、プロンプトだけで完結しているため、状態管理がうまくできておらず、自分がテストしている限り、一度も発動していない。
このようなイベントが盛り込めれば、もっとゲーム性が増したと思う。季節的なイベントや、Genesisの誕生日イベント、クラブの記念イベントなど、考えられるイベントは山程ある。しかし、実装が結構大変だなと思って今回、本格的に実装するのは断念した。
ランキング期間とリワード
実はこれは導入したかったのだが、ランキングを毎月とかにして、その都度1位を決めて、1位に貢献した人にはリワードが配布されるみたいなことをやりたかった。しかし、この管理にまた開発とデータベースの拡張が必要だったので、断念。
リアルタイムでのプレイヤー間のやり取り
当初は、プレイヤーが同タイミングでプレイしている場合、同じGenesisは1名のみしか指名できない制限を課して、時間が来たら、他のプレイヤーの席に移動するみたいなことを考えていたのだが、まぁ、そんなに同タイミングでプレイするほどプレイヤーも多くないだろうというのと、同じGenesisを指名することも稀かなと思い、今回は削った。
Genesis間のやり取り
こういう舞台設定では、Genesis(ホステス)間の人間関係も、一つの大きな要素となってくるので、ここをゲーム的に表現できればなと考えていた。具体的には、同一プレイヤーが複数のGenesisを指名した場合、どっちかの関係レベルが上がれば、もう片方は下がるなど。ただ、これも結構、状態管理が面倒なので、今回は見送り。
おわりに
というわけで、今回開発したGenesis Haven(ジェネシス・ヘイブン)というゲームの紹介、およびゲーム開発における裏話などを説明してきた。
今回の開発、思っていたより苦労したので、正直、あまりこの手のゲームGPTsの開発はもうやりたくないなぁと思っている。
ただ、GPTsの魅力は、UIとしてChatGPTが使えること、そして、OpenAIの APIを直接使う場合に発生するコストを、利用者側に押し付けられるということである。
最近になって、ChatGPTから、色んなGPTsがメンションできるようになって、複数のGPTsを組み合わせて使えるようになったので、うまくユースケースを考えて、そこに組み込まれるようなものを作れれば、ヒットする可能性は十分にあるのではないかと思う。なので、もし今後GPTs開発するなら、そういう観点で考えていければなと考えている。
とりえあず、少しでもこのゲームを楽しんでプレイしてくれるプレイヤーがいるだけで、開発したかいがあったと思う。イベントは2月4日までなので、ぜひ奮って参加して頂ければ。一人でも多くの方にこのゲームをプレイして頂ければ幸いである。
おまけ:開発で工夫した点の技術的詳細説明
最後に、今回GPTsでゲーム開発して苦労した点について、自分はこうやった的なポイントを、実際の体験談や、今回利用したプロンプトの内容や、工夫したテクニックなども含めて、もう少し技術的に説明していきたい。
一応かなりの時間をかけてこのゲームを開発したので、ここからは有料とさせて頂くが、GPTs開発していこうと思っている方々にとって、それなりに読み応えのあるボリューム(本文と同じくらい)、およびかなり実践的な内容となっているので、ぜひ最後まで御一読いただければ幸いである。
(有料コンテンツ)
・プロンプトの言語について
・プロンプトの基本構成
・プロンプト8000文字制限の対処方法とその内容
・APIリクエストのユーザー承認を最初の1回だけにする方法
・登録およびログイン後のユーザー管理方法
・プロンプトやknowledgeファイルのバージョン管理
・API(GAS)が参照する開発と本番データベースの切り替え方法
・DALL-E3による画像生成プロンプト
・OpenSeaにある1万体のNFTのリストをどう処理したか
・直近のGPTsの内部的な挙動の変更およびそれについての考察
ここから先は
この記事が参加している募集
よろしければサポートお願いします!すごく励みになります!