シュモクカップ

UnityでTRPGをやろう

https://github.com/lliveaevill/AITRPG.git

C#

Unity

TRPGの秋。AIのゲームマスターで1人でもTRPG。

ミツノ

33ui1778ito

推しアイデア

AI×TRPGで、一人でもTRPGができること

作った背景

1人でもTRPGがしたい!

推し技術

Unityでチャットを再現! テキストの長さによって、背景の画像の長さが動的に変わる。 AIでTRPGを使った

プロジェクト詳細

概要

AIのゲームマスターで1人でも遊べるTRPG。

使用技術&選定理由

  1. Unity:自由度が高いため
  2. C#: Unityのスクリプトを書く時に必要
  3. OpenAiのAPI: ゲームマスター役として使用

実装内容

チャット画面

OpenAIのチャット機能を使い、TRPG風のゲームを作成した。

技術面

まず、Unityからopenaiのapiの取得して、それを元にして画像を動かしています。 そして、ゲーム中の判断は全てai が判断するため、パラメーターや、ルールなどを設けるのに苦労した

###リクエストするときのコード using System.Collections; using UnityEngine; using UnityEngine.Networking; using Newtonsoft.Json; // Use Newtonsoft.Json using dotenv.net; // Use dotenv.net using System;

public class OpenAIChatGPT : MonoBehaviour { private string apiKey ; private string apiUrl = "https://api.openai.com/v1/chat/completions";

void Awake() { // Load the .env file DotEnv.Load(); // Get the value of the API_KEY from the .env file // APIキーを環境変数から取得 apiKey = Environment.GetEnvironmentVariable("API_KEY"); Debug.Log("API Key: " + apiKey); } public IEnumerator GetChatGPTResponse(string prompt, System.Action<string> callback,string character,string storyLine,string log,string rule, int maxTokens) { // Setting OpenAI API Request Data var jsonData = new { model = "gpt-3.5-turbo", messages = new[] { new { role = "system", content = "You are a TRPG game master. Guide the players through the story." }, new { role = "user", content = prompt }, new {role="user",content=character}, new {role="user",content=rule+storyLine}, new {role="user",content=log} }, max_tokens = maxTokens, }; string jsonString = JsonConvert.SerializeObject(jsonData); // HTTP request settings UnityWebRequest request = new UnityWebRequest(apiUrl, "POST"); byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonString); request.uploadHandler = new UploadHandlerRaw(bodyRaw); request.downloadHandler = new DownloadHandlerBuffer(); request.SetRequestHeader("Content-Type", "application/json"); request.SetRequestHeader("Authorization", "Bearer " + apiKey); Debug.Log(apiKey); Debug.Log(request); yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) { Debug.LogError("Error: " + request.error); } else { var responseText = request.downloadHandler.text; Debug.Log("Response: " + responseText); // Parse the JSON response to extract the required parts var response = JsonConvert.DeserializeObject<OpenAIResponse>(responseText); callback(response.choices[0].message.content.Trim()); } } public class OpenAIResponse { public Choice[] choices { get; set; } } public class Choice { public Message message { get; set; } } public class Message { public string role { get; set; } public string content { get; set; } }

}

感想

Unityを使ったら、自由度が高いため、いろんなことができると思っていた時期が僕にもありました。 実際は値や条件の変更を行わないといけないため、そちらにリソースが裂けてしまって、思い通りの形にならなかった。

ミツノ

@7c6ea2f880695e0c