BioErrorLog Tech Blog

試行錯誤の記録

Devlog #2 ゲームにChatGPTを組み込む

実際にゲームにChatGPTを組み込みます。

前回はこちら: www.bioerrorlog.work

はじめに

前回は、過去作をベースにテキストベースのシステムを導入し、架空言語 x ChatGPTという組み合わせのゲームを作る下地を作りました。

今回はそこに、実際にChatGPTを組み込んでいきます。

Devlog

設定画面の実装

ChatGPT APIをcallするためのAPI keyを入力&保存する機能を作る前提として、まずは設定画面を実装します。

  1. 設定画面を用意する
  2. 設定画面とメイン画面を切り替えるボタンを用意する

こう書いてみると単純ですが、意外と躓きました。

まず、(簡易的な)設定画面を用意するのは比較的簡単です。 設定画面用の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の入力とその保存機能を実装します。

このあたりの話は、以前書いた↓の記事とほぼ同様のことを実装していますので、割愛します。

www.bioerrorlog.work

ChatGPTにセリフを出力させる

OpenAI API Keyを保存させることができたので、いざキャラのセリフをOpenAI API経由で生成させてみます。

今回のコンセプトはChatGPT x 架空言語です。 本来はちゃんとした言語設計とそれをChatGPTに喋らせるためのプロンプト設計が必要ですが、今回は仮でまずChatGPT API経由で何かしらの適当な文字列を出力させます。

その時の動画がこちら↓

最初の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()

Zoom時のカメラフォーカスをPlayerではなくオブジェクトにする

ただ、なんかカメラ移動とフォーカスの動きが微妙にぎこちないので、その辺りは要改善ですね。

おわりに

以上、今回はOpenAI API Keyの保存周りの諸々と、ChatGPT APIを実際に組み込むところをやりました。

次回は、実際に架空言語を設計してみるあたりでしょうか。 ただ、言語を設計するならそもそもゲームがどう始まってどう終わるのか、というゲームの筋書きも置く必要がありますね。

少しずつやっていきます。

次回はこちら:

www.bioerrorlog.work

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work