俺の最強カードをみんなで集めて対戦したい! → APIこんな感じです
http://sukidukinn.blog/wp-content/uploads/2024/10/20241023_CardMasterAI.zip
↑プロジェクト+コード ↓実行プログラム
http://sukidukinn.blog/wp-content/uploads/2024/10/CardMasterAI_Win.zip
https://chatgpt.com/share/e/67189739-9314-8013-b5b6-42f94deb487a
Firebaseの接続、googleスプレッドシートの読み書き、chatGPT,DALL-E3のAPI連携について色々聞いた。
で、「俺の最強カードをみんなで集めて対戦したい!」ので、chatGPTに色々聞いた。
★firebaseだとカードイメージやjsonの送受信できる? →はい、コードとやり方こんな感じ
public void ReceiveTexture2D(Action<Texture2D> callback, string loadPath)
{
StorageReference imageRef = storageRef.Child(loadPath);
// 画像をFirebase Storageからダウンロード
imageRef.GetBytesAsync(long.MaxValue).ContinueWithOnMainThread(task =>
{
if (task.IsFaulted || task.IsCanceled)
{
Debug.LogError($"Failed to download Texture2D: {task.Exception}");
callback(null);
}
else
{
byte[] fileContents = task.Result;
Texture2D texture = new Texture2D(2, 2);
texture.LoadImage(fileContents);
callback(texture);
}
});
}
★chatGPTでカード名からイラストを作りたい →はい、コードこんな感じ
public async void Dalle3(Action<Texture2D> callback, string imageText )
{
RequestBody body = new RequestBody();
body.model = "dall-e-3";
body.prompt = imageText; //画像生成テキスト
body.n = 1;
body.size = "1024x1024";
string jsonBody = JsonUtility.ToJson(body);
//以下、OpenAIのAPIへJSONを投げる
UnityWebRequest request = new UnityWebRequest(dalle3Url, "POST");
byte[] postData = System.Text.Encoding.UTF8.GetBytes(jsonBody);
request.uploadHandler = new UploadHandlerRaw(postData);
request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
request.SetRequestHeader("Authorization", "Bearer " + apiKey);
var operation = request.SendWebRequest();
//Debug.Log( "DALLE-3: " +body.prompt );
while (!operation.isDone)
{
await Task.Delay(10);
}
if (request.result != UnityWebRequest.Result.Success)
{
Debug.Log(request.error);
}
else
{
// OpenAIのAPIが正常にレスポンスがあった場合は以下
if (request.responseCode == 200 || request.responseCode == 201)
{
string text = request.downloadHandler.text;
ImageResponse response = JsonUtility.FromJson<ImageResponse>(text);
string imageUrl = response.data[0].url;
Debug.Log(imageUrl);
await DownloadAndSetTexture(callback,imageUrl);
}
}
request.Dispose();
}
async Task DownloadAndSetTexture(Action<Texture2D> callback, string url)
{
using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(url))
{
TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
www.SendWebRequest().completed += _ => tcs.SetResult(true);
await tcs.Task;
if (www.isNetworkError || www.isHttpError)
{
Debug.Log(www.error);
}
else
{
Debug.Log("DownloadAndSetTexture");
Texture2D returnTexture = DownloadHandlerTexture.GetContent(www);
callback(returnTexture );
}
}
}
★カードの名前から強さをAIで考えて! →はいこれ
string jsonData = $@"
{{
""model"": ""{model}"",
""messages"": [
{{
""role"": ""user"",
""content"": ""{message}""
}}
]
}}";
UnityWebRequest request = new UnityWebRequest(chatGPTUrl, "POST");
byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonData);
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
request.SetRequestHeader("Authorization", "Bearer " + apiKey);
await SendUnityWebRequestAsync(request);
if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
{
Debug.LogError("ChatGPT Error: " + request.error);
callback(null); // エラーが発生した場合はnullを返す
}
こんな感じでコピペで実行したらこうなった。
城を守るゴーレム、という名前で画像生成すると、20秒後に画像ができる。
次に、強さ作成をすると、パラメータもテキストでできる。
あとはドロップダウンで指定した番号0から7で、送信と受信をするとfirebaseで読み書きできる。
実行時に、firebaseで登録された枚数を取得して、jsonとpngを取り込むことでみんなのオリカで対戦できるかも?
今はこの仕組みだけ確認して終了! 次はDNA変異ビルドゲーム作るぞい。
firebase接続 10h、スプレッドシート連携5h、openAI API連携 12h、ゲーム枠の作成と確認 3h