実際にゲームにChatGPTを組み込みます。
前回はこちら: www.bioerrorlog.work
はじめに
前回は、過去作をベースにテキストベースのシステムを導入し、架空言語 x ChatGPTという組み合わせのゲームを作る下地を作りました。
今回はそこに、実際にChatGPTを組み込んでいきます。
Devlog
設定画面の実装
ChatGPT APIをcallするためのAPI keyを入力&保存する機能を作る前提として、まずは設定画面を実装します。
- 設定画面を用意する
- 設定画面とメイン画面を切り替えるボタンを用意する
こう書いてみると単純ですが、意外と躓きました。
まず、(簡易的な)設定画面を用意するのは比較的簡単です。 設定画面用のSceneを作成し、そこに背景やらボタンやらを配置します。
面倒だったは、"2. 設定画面とメイン画面を切り替えるボタンを用意する"の方です。
最初は、特定のボタンを押すと実行SceneがMainから設定画面Sceneに切り替わる、のようにしてましたが、これがなかなか上手くいきません。
- 設定画面SceneからMain sceneに戻すと、Scene状況が初期化されている
- それを防ぐために、Scene切り替え時に実行Sceneを一時停止しようとする
- それも上手くいかず..
みたいなことを繰り返していました。
結局、元から設定Sceneも配置しておいて、visibilityをボタンで制御する、という方法にしました。
# 実装イメージ
extends CanvasLayer
onready var settings = $Settings
onready var settings_icon = $SettingsIcon
func go_to_settings() -> void:
settings.visible = true
settings_icon.visible = false
func close_settings() -> void:
settings.visible = false
settings_icon.visible = true
func _on_SettingsIcon_settings_icon_pressed() -> void:
go_to_settings()
func _on_Settings_close_button_pressed() -> void:
close_settings()
よほどシンプルになりました。
ただ、設定画面を開いているときはMain Sceneを停止する、とかしたいのであればもう少し工夫が必要そうです。 が、今は一旦これでよしとします。
API Keyの入力と保存
次は設定画面で、OpenAI API Keyの入力とその保存機能を実装します。
このあたりの話は、以前書いた↓の記事とほぼ同様のことを実装していますので、割愛します。
ChatGPTにセリフを出力させる
OpenAI API Keyを保存させることができたので、いざキャラのセリフをOpenAI API経由で生成させてみます。
今回のコンセプトはChatGPT x 架空言語です。 本来はちゃんとした言語設計とそれをChatGPTに喋らせるためのプロンプト設計が必要ですが、今回は仮でまずChatGPT API経由で何かしらの適当な文字列を出力させます。
その時の動画がこちら↓
架空言語 x ChatGPT その4.
— BioErrorLog (@bioerrorlog) June 17, 2023
- 実際にChatGPTのAPI呼び出して文字生成するようにした.
- 設定画面作ってAPI Keyを入力するようにした.
ChatGPT APIのレスポンスは思ったよりずっと早くて、違和感ないレベルでいけそう.#GodotEngine #gamedev #indiedev #screenshotsaturday https://t.co/TTMO5XTAWO pic.twitter.com/xfMGMjiQnG
最初の2文があらかじめ定義しておいたセリフ、以降の文がChatGPT APIに生成させたセリフです。
思ったよりChatGPT APIからのレスポンスが早くなっていました (以前はもっと遅かった)。
全文をChatGPT APIに生成させても、そこまで違和感ないスピードで表示できるかもしれません。
補足: カメラフォーカスの修正
地味ですが、ズーム時にカメラが他オブジェクト(キャラクター)にフォーカスするようにもしています。
前は単純にオブジェクト接触時にカメラのZoomを上げるようにしていたので、フォーカスはPlayerのままでした。 これを、Zoom時にPlayerとオブジェクトの座標差を取得してカメラオフセットに入れることで、カメラフォーカスをPlayerからオブジェクトにずらすようにしました。
# 実装イメージ func focus_on_other_object(other_object: Node2D, duration: float = 0.2) -> void: var new_offset: Vector2 = other_object.global_position - self.global_position tween.interpolate_property(camera, "offset", camera.offset, new_offset, duration, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT) tween.start()
ただ、なんかカメラ移動とフォーカスの動きが微妙にぎこちないので、その辺りは要改善ですね。
おわりに
以上、今回はOpenAI API Keyの保存周りの諸々と、ChatGPT APIを実際に組み込むところをやりました。
次回は、実際に架空言語を設計してみるあたりでしょうか。 ただ、言語を設計するならそもそもゲームがどう始まってどう終わるのか、というゲームの筋書きも置く必要がありますね。
少しずつやっていきます。
次回はこちら:
[関連記事]