2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Hamster OutputAdvent Calendar 2024

Day 2

【Unity】ChatGPTを利用したゲーム実装で悩んだこと

Last updated at Posted at 2024-12-01

はじめに

この記事はHamster Output Advent Calendar 2024の2日目の記事です!
数ヵ月前にChatGPTで会話テキストを生成する機能を実装しました。実装方法としては参考にしたリンクを見れば直ぐに実装出来ますので、本記事では実装中に悩んだことや解決方法を書いて行きたいと思います。

作成したソースコード

参考にしたリンク

実装中に困ったこと

・命名規則による変数名の制限

今回、ゲーム制作をしていたチームでは命名規則のルールがあったことから、ChatGPTに送るJson関連の変数名が全て合わなくなるといった問題がありました。そして、Json用の名前と変数名を分けることができるNewtonsoft.JsonのJsonプロパティという機能を見つけました。

今回の実装ではJsonプロパティを利用して、命名規則を守ったままJson形式の名前に変換するということができました。

[JsonProperty("id")]
public string Id;

[JsonProperty("@object")]
public string @Object;

[JsonProperty("created")]
public int Created;

・文字を特定の文字に変換したい

開発中にGPTのバージョンを変更したいことがあったので、enumを作成してChatGPTのバージョン名を変更できるように列挙しました。ですが、名称に-が使えないことから、代替えで_を入れることにしました。

public enum ModelList
{
    gpt_4o,
    gpt_4o_mini,
    gpt_3_5_turbo,
}

ですが、ChatGPTにバージョン名称を送る時はgpt-4o、gpt-3.5-turboの形式で送る必要がありました。stringkからif文で判定することを考えましたが、Unity文字変換...というワードで検索をしていたらStringBuilderを利用している記事を見つけました。

このStringBuilderが便利なことに、文字列関連の操作が物凄く簡単に出来ます。内容としては以下の通りです。
・後ろに文字列を追加
・途中に文字列を追加
・文字列の一部を削除
・文字列の一部を変換

この文字列の一部を変換という機能のおかげで、2~3行で文字列変換ができました。

StringBuilder stringBuilder = new StringBuilder();
        stringBuilder
            .Append(modelList.ToString())
            .Replace("_", "-")
            .Replace("3_5", "3.5");

・テキスト生成による料金について

正直に言うと、コスト面に関しては実装時間が限られていたので、今回は触れていません。ただ、多少文章生成の文字数を制限できるように最大トークン数などは設定できるようにしています。

image.png

画像生成に関しては、GPTがバグっていたのか?分かりませんがGPT-4o-miniで画像を送ると、GPT-4oよりも送信コストが10倍になるバグがありました。ネット記事で、GPT-4o-miniで画像を送るとコストが高くなるという記事があったのでOpenAI側に何かあったんだと思います。

・画像解析の実装

正直、ここが一番苦戦しました。基本的に調べても情報が出てこず...OpenAIのドキュメントを読みながら悩んでいましたが、タイムリーなことに画像解析をしている記事が投稿され、それを元に実装しました。

ChatGPTでもテキスト生成の記事は沢山あるんですが、カメラ撮影や画像送信などの部分はまだあまり情報が見つからなかったので結構ニッチな部分だったのかなと思いました。

今回実装した画像読み取りのコードは、上の記事を参考にしつつ、AIに教えて貰いながら作成しました。未だに内容を全て分かってはいないですが...

画像を送るための鍵となっている部分がimage_urlurl = $"data:image/png;base64,{base64Image}" の部分です。正直...神エボの制作期間が本当に短かったので実装できたのは奇跡だと思っています。

 type = "image_url",
 image_url = new
 {
    url = $"data:image/png;base64,{base64Image}"
 }

・写真撮影

写真撮影も上に続いた内容です。カメラの起動処理も正直、かなり苦戦しました。といっても、今までインゲームのプレイヤー実装を主に行っていたので、今回システム面...?といっていいか分かりませんが、普段触らない部分に挑戦できたので良かったです。

Unityで写真撮影機能も正直ニッチな部分で、ここも調べて情報がかなり少なかったです。WebCamTextureとかもあります。

今回、カメラに関してはNaitiveCameraというプラグインを利用しました。このプラグインの凄い部分は、メソッドを呼び出すだけで写真撮影ができるという、神プラグインです。

まとめ

今回のゲーム制作でとにかく苦戦した&大変だったことは

・初めてのAndroidプラットフォームでの制作
・カメラ機能を利用したゲーム性
・AIを利用したゲーム仕様
・神ゲー創造エボリューションの締め切りスパンが早い

以上の4つです。コンテストの結果としては二次で落ちてしまい、さらに作品もa?プロト段階で開発が終わってしまいましたが...

自分にとってはゲームクリエイターとしてかなり成長することができた、一大コンテストだったので参加して後悔はしてません!このコンテストのお陰で主体的に動けるようになったのでむしろ参加して良かったと思います。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?