困った時の自分用メモ

読んだ本を考察してメモったり、自分でいじった物の感想をメモったりする場。週1更新を目指します。

ChatGPTの話~作業指示をして、UnityC#のコードを出力させてみた~

巷では、ChatGPTを使って、いろんな事が行われている。
プログラマーの仕事が無くなるなどと騒がれているが、まずはこういったAIサービスをうまく活用する方向にシフトすると思われるので、
未来を想像して、ChatGPTをどのように活用できるのか、少し試してみた。

サービス(ゲーム)を作ることを想定して、下記のような簡易的な作業指示を提示した。

▼機能の目的
〇あなたというAIに、どのような指示を出せば、どの程度のアウトプットを頂けるのかの実験を目的としています
〇その為、簡易的なインプットと画面遷移のみを目的としている機能です

▼構成要素
〇画面
・Title画面
・MenuSelect画面
・Battle画面
・Option画面

▼要素の説明
〇Title画面
・PushStartButtonが表示される
・PushStartButtonを押下すると、MenuSelect画面へ遷移する

〇MenuSelect画面
・BattleButtonが表示される
・OptionButtonが表示される
・BattleButtonを押下すると、Battle画面へ遷移する
・OptionButtonを押下すると、Option画面へ遷移する

〇Battle画面
・Battle文字列が表示される
・BackButtonが表示される
・BackButtonを押下すると、MenuSelect画面へ遷移する

〇Option画面
・SeToggleが表示される
・SeSliderが表示される
・BgmToggleが表示される
・BgmSliderが表示される
・BackButtonが表示される
・SeToggleは、Onの状態にする
・SeSliderは、50%の状態にする
・BgmToggleは、Offの状態にする
・BgmSliderは、75%の状態にする
・BackButtonを押下すると、MenuSelect画面へ遷移する

▼レイアウトや外観について
シンプルな内容で良いので、UnityのHierarchy上のGameObject配置のサンプルを提示して欲しい。

この内容で、シーケンス図、および、UnityのC#スクリプトを出力をお願いいたします。

▼得られたアウトプット(最終成果物だけ抜粋)
〇プログラム

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class MenuController : MonoBehaviour {
    [SerializeField] private GameObject titlePanel;
    [SerializeField] private GameObject menuSelectPanel;
    [SerializeField] private GameObject battlePanel;
    [SerializeField] private GameObject optionPanel;

    [SerializeField] private Button startButton;
    [SerializeField] private Button battleButton;
    [SerializeField] private Button optionButton;
    [SerializeField] private Button backButton;

    [SerializeField] private Toggle seToggle;
    [SerializeField] private Slider seSlider;
    [SerializeField] private Toggle bgmToggle;
    [SerializeField] private Slider bgmSlider;

    private void Start()
    {
        // イベントリスナーを設定
        startButton.onClick.AddListener(OnStartButtonClick);
        battleButton.onClick.AddListener(OnBattleButtonClick);
        optionButton.onClick.AddListener(OnOptionButtonClick);
        backButton.onClick.AddListener(OnBackButtonClick);

        // シーン起動時に最初に表示されるパネルを設定
        titlePanel.SetActive(true);
        menuSelectPanel.SetActive(false);
        battlePanel.SetActive(false);
        optionPanel.SetActive(false);

        // オプション画面の初期状態を設定
        seToggle.isOn = true;
        seSlider.value = 0.5f;
        bgmToggle.isOn = false;
        bgmSlider.value = 0.75f;
    }

    private void OnStartButtonClick()
    {
        // Startボタンを押下した時の処理
        titlePanel.SetActive(false);
        menuSelectPanel.SetActive(true);
        battlePanel.SetActive(false);
        optionPanel.SetActive(false);
    }

    private void OnBattleButtonClick()
    {
        // Battleボタンを押下した時の処理
        titlePanel.SetActive(false);
        menuSelectPanel.SetActive(false);
        battlePanel.SetActive(true);
        optionPanel.SetActive(false);
    }

    private void OnOptionButtonClick()
    {
        // Optionボタンを押下した時の処理
        titlePanel.SetActive(false);
        menuSelectPanel.SetActive(false);
        battlePanel.SetActive(false);
        optionPanel.SetActive(true);
    }

    private void OnBackButtonClick()
    {
        // Backボタンを押下した時の処理
        titlePanel.SetActive(false);
        menuSelectPanel.SetActive(true);
        battlePanel.SetActive(false);
        optionPanel.SetActive(false);
    }
}

・ヒエラルキ構造

- TitleCanvas
  - TitlePanel
    - PushStartButton
- MenuSelectCanvas
  - MenuSelectPanel
    - BattleButton
    - OptionButton
- BattleCanvas
  - BattlePanel
    - BattleText
    - BackButton
- OptionCanvas
  - OptionPanel
    - SeToggle
    - SeSlider
    - BgmToggle
    - BgmSlider
    - BackButton

▼ヒエラルキ構造を生成するツールの作成も依頼してみた結果

using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

public class GameObjectCreator : MonoBehaviour {
    [MenuItem("MyTools/CreateGameObjects")]
    static void CreateGameObjects()
    {
        // ゲームオブジェクトの親オブジェクトを作成
        GameObject parentObject = new GameObject("GameObjects");

        // ゲームオブジェクトを作成し、親オブジェクトの子オブジェクトにする
        GameObject titleCanvas = new GameObject("TitleCanvas");
        titleCanvas.transform.SetParent(parentObject.transform);
        GameObject titlePanel = new GameObject("TitlePanel");
        titlePanel.transform.SetParent(titleCanvas.transform);
        GameObject pushStartButton = new GameObject("PushStartButton", typeof(Button));
        pushStartButton.transform.SetParent(titlePanel.transform);

        GameObject menuSelectCanvas = new GameObject("MenuSelectCanvas");
        menuSelectCanvas.transform.SetParent(parentObject.transform);
        GameObject menuSelectPanel = new GameObject("MenuSelectPanel");
        menuSelectPanel.transform.SetParent(menuSelectCanvas.transform);
        GameObject battleButton = new GameObject("BattleButton", typeof(Button));
        battleButton.transform.SetParent(menuSelectPanel.transform);
        GameObject optionButton = new GameObject("OptionButton", typeof(Button));
        optionButton.transform.SetParent(menuSelectPanel.transform);

        GameObject battleCanvas = new GameObject("BattleCanvas");
        battleCanvas.transform.SetParent(parentObject.transform);
        GameObject battlePanel = new GameObject("BattlePanel");
        battlePanel.transform.SetParent(battleCanvas.transform);
        GameObject battleText = new GameObject("BattleText");
        battleText.transform.SetParent(battlePanel.transform);
        GameObject backButton1 = new GameObject("BackButton", typeof(Button));
        backButton1.transform.SetParent(battlePanel.transform);

        GameObject optionCanvas = new GameObject("OptionCanvas");
        optionCanvas.transform.SetParent(parentObject.transform);
        GameObject optionPanel = new GameObject("OptionPanel");
        optionPanel.transform.SetParent(optionCanvas.transform);
        GameObject seToggle = new GameObject("SeToggle", typeof(Toggle));
        seToggle.transform.SetParent(optionPanel.transform);
        GameObject seSlider = new GameObject("SeSlider", typeof(Slider));
        seSlider.transform.SetParent(optionPanel.transform);
        GameObject bgmToggle = new GameObject("BgmToggle", typeof(Toggle));
        bgmToggle.transform.SetParent(optionPanel.transform);
        GameObject bgmSlider = new GameObject("BgmSlider", typeof(Slider));
        bgmSlider.transform.SetParent(optionPanel.transform);
        GameObject backButton2 = new GameObject("BackButton", typeof(Button));
        backButton2.transform.SetParent(optionPanel.transform);

        // ゲームオブジェクトに必要なコンポーネントを追加する
        // (省略)

        Debug.Log("GameObjects created.");
    }
}

実行結果

この状態では、タダオブジェクトを並べただけなので、UI機能を持ったオブジェクトが配置されない。
その為、UI機能を持ったオブジェクト配置も出来ないか試してみたが、中々難しく、結果出来なかった。
その為、各オブジェクトをUI機能を持つオブジェクトに差し替える作業は、手作業で行って、ゲーム機能の方に紐づけて実行した。
そして、意図した動作を行った。

いろいろと試した事が他にもあったり、試したい事があったり、このAIを用いた筆者の考えなどが結構出てきているので、
おいおい、記事化していく予定。