ChatGPTでUnityのツールを作ろう!

unity
スポンサーリンク

こんにちは!ビーバー@ゲーム業界歴約20年 です。
今回は、ChatGPTを使ってUnityのツールを作成する方法について説明します。

まるで人間と会話しているような自然な文章を生成できるChatGPTですが、
コード生成にも使用することができます。
ChatGPTを使うと、プログラミングの知識がなくても簡単にツールをつくることができますよ!

この記事を読んでわかること
  • ChatGPTを使ってUnityの業務効率化ツールを作成する方法
  • ChatGPTでコード生成する際の注意点と解決方法

◆Unity C#プログラミングの基礎を知りたい方に おすすめの動画・本

icon icon
一週間で身につくC#言語 icon
Unity・ASP.ENT・Windowsアプリ開発のために
必要な基礎プログラミングスキルを身に着けるコース

↑こちらの本はKindle Unlimitedで読むこともできます!
Kindle Unlimitedの無料体験はこちらから

ChatGPTでUnityツールを作ろう!

4つのステップでUnityツールの作成方法を説明していきます。

  1. 作りたいツールの機能を決める
  2. ChatGPT を使ってツールのコードを生成する
  3. 生成されたコードをUnityに追加する
  4. ツールをテストして、期待通りに動作することを確認する

1.作りたいツールの機能を決める

まずはどのようなツールを作るのかを考えましょう!

今回は、「アニメータコントローラの中にクリップの指定忘れがないか確認するツール」
をつくってみようと思います。

図の赤枠で示した場所は、ステート内にアニメーションクリップを設定する場所ですが、
クリップが設定されていないためNoneになっています。
このようなケースを捕捉するツールを作っていきます。

2.ChatGPTを使ってコードを生成する

ChatGPTに、作成したいツールのコードを自動生成させましょう。

例えば、図のように入力します。

「アニメータコントローラの中にクリップの指定忘れがないか確認するツール」という要求に加えて、
「ゲーム非実行時に使うエディタスクリプトが欲しい」ということを添えてみました。

ツールの仕様は、詳細を指定した方が回答の精度が上がりますが、
とりあえずはざっくりした要求でも構いません。

送信すると、さっそくコードが返ってきます。

using UnityEngine;
using UnityEditor;
using UnityEditor.Animations;

public class AnimationClipChecker : EditorWindow
{
    [MenuItem("Tools/Animation Clip Checker")]
    private static void ShowWindow()
    {
        GetWindow<AnimationClipChecker>("Animation Clip Checker");
    }

    private void OnGUI()
    {
        if (GUILayout.Button("Check Animation Clips"))
        {
            CheckAnimationClips();
        }
    }

    private void CheckAnimationClips()
    {
        AnimatorController selectedController = Selection.activeObject as AnimatorController;

        if (selectedController == null)
        {
            Debug.LogWarning("Please select an Animator Controller.");
            return;
        }

        AnimatorControllerLayer[] layers = selectedController.layers;

        foreach (AnimatorControllerLayer layer in layers)
        {
            CheckLayer(layer.stateMachine);
        }

        Debug.Log("Animation clip checking completed.");
    }

    private void CheckLayer(AnimatorStateMachine stateMachine)
    {
        foreach (ChildAnimatorState state in stateMachine.states)
        {
            AnimationClip clip = state.state.motion as AnimationClip;

            if (clip != null)
            {
                Debug.Log($"Checking clip '{clip.name}' in state '{state.state.name}'...");

                if (clip.empty)
                {
                    Debug.LogWarning($"Animation clip '{clip.name}' in state '{state.state.name}' is empty.");
                }
            }
        }

        foreach (ChildAnimatorStateMachine subStateMachine in stateMachine.stateMachines)
        {
            CheckLayer(subStateMachine.stateMachine);
        }
    }
}

このスクリプトをUnityプロジェクトに追加すると、メニューの “Tools” セクションに “Animation Clip Checker” という項目が追加されます。この項目を選択すると、ウィンドウが表示され、チェックボタンをクリックすることでアニメータコントローラ内のアニメーションクリップの指定を確認できます。

ただし、このスクリプトは基本的なものであり、プロジェクトの要件に応じてカスタマイズや拡張が必要かもしれません。また、エディタスクリプトはゲームの実行時ではなく、プロジェクトの編集時に使用されることに注意してください。

…とのことです。
要求どおりの挙動になっているかどうか、Unityで確認していきます。

◆Unity C#プログラミングの基礎を知りたい方に おすすめの動画・本

icon icon
一週間で身につくC#言語 icon
Unity・ASP.ENT・Windowsアプリ開発のために
必要な基礎プログラミングスキルを身に着けるコース

↑こちらの本はKindle Unlimitedで読むこともできます!
Kindle Unlimitedの無料体験はこちらから

3.生成されたコードをUnityに追加する

生成されたスクリプトをUnityに追加していきます。

Unityのプロジェクトウィンドウで、スクリプトを追加したいフォルダを選択します。
Assets/Editor にします。

プロジェクトウィンドウ右側の何もないところで右クリックし、
「Create」メニューから、「C# Script」を選択。

新しいスクリプトファイルができました。

スクリプトファイルの名前を変更します。
ファイル名は、生成スクリプトのクラス名と同じにしましょう。

AnimationClipCheckerをダブルクリックして開き、すでに書いてある内容をすべて消します。

ChatGPTの生成したコードを貼り付けて上書き保存しましょう。

これで、Unityへコードの追加は完了です。

4.ツールをテストして、期待通りに動作することを確認する

ツールの準備ができたので、期待通りに動くか確認していきます。

ChatGPTいわく、

とのことでしたので、メニューからツールを呼び出してみます。

↑メインメニューのTools > Animation Cilp Checker をクリック。

↑ウィンドウが表示されました!
ここまででも、十分すごいなあと感心してしまいます。
ただ肝心なのは、ツールが自分の意図通りに動いてくれることです。

動作確認をしていきましょう。

検証用のデータとして、下記のアニメータコントローラを用意しました。
ステートは2つ、Idleとrunを入れてあり、runステートのみMotion設定をしていません。
ツールから、「runステートにクリップが無いよ!」と返ってくることを期待しています。

ツールのテストを行います。
コントローラを選択してツールのボタンをクリック。

コンソールウィンドウに結果が表示されたようです。詳しく見ていきましょう。
「Checking clip ‘Idle’ in state ‘Idle’…」
「Animation clip checking completed.」

肝心の「runステートにクリップが無いよ!」が返ってきていないようです。
これでは十分な動作と言えません。
ツールを意図通りに動かすにはどのようにすればいいのでしょうか?

ご安心ください、修正対応もChatGPTがやってくれます。

◆Unity C#プログラミングの基礎を知りたい方に おすすめの動画・本

icon icon
一週間で身につくC#言語 icon
Unity・ASP.ENT・Windowsアプリ開発のために
必要な基礎プログラミングスキルを身に着けるコース

↑こちらの本はKindle Unlimitedで読むこともできます!
Kindle Unlimitedの無料体験はこちらから

ツールの修正もChatGPTでできる!

ChatGPTは過去に入力した文脈をおぼえているため、
修正指示を繰り返していくことで、ツールの動作を改善していくことができます。

最初の入力に加えて、以下の要件を追加で送信してみました。

  • すべてのステートに対してチェックが行われているのかを確認したい
  • ステート名とクリップ名をコンソールに表示してほしい
  • クリップがないステートを見つけた場合は、警告を出してほしい

すかさず回答が返ってきます。

using UnityEngine;
using UnityEditor;
using UnityEditor.Animations;

public class AnimationClipChecker : EditorWindow
{
    [MenuItem("Tools/Animation Clip Checker")]
    private static void ShowWindow()
    {
        GetWindow<AnimationClipChecker>("Animation Clip Checker");
    }

    private void OnGUI()
    {
        if (GUILayout.Button("Check Animation Clips"))
        {
            CheckAnimationClips();
        }
    }

    private void CheckAnimationClips()
    {
        AnimatorController selectedController = Selection.activeObject as AnimatorController;

        if (selectedController == null)
        {
            Debug.LogWarning("Please select an Animator Controller.");
            return;
        }

        AnimatorControllerLayer[] layers = selectedController.layers;

        foreach (AnimatorControllerLayer layer in layers)
        {
            CheckLayer(layer.stateMachine);
        }

        Debug.Log("Animation clip checking completed.");
    }

    private void CheckLayer(AnimatorStateMachine stateMachine)
    {
        foreach (ChildAnimatorState state in stateMachine.states)
        {
            AnimationClip clip = state.state.motion as AnimationClip;

            if (clip != null)
            {
                Debug.Log($"State: '{state.state.name}', Clip: '{clip.name}'");
            }
            else
            {
                Debug.LogWarning($"State: '{state.state.name}' has no animation clip.");
            }
        }

        foreach (ChildAnimatorStateMachine subStateMachine in stateMachine.stateMachines)
        {
            CheckLayer(subStateMachine.stateMachine);
        }
    }
}

AnimationClipCheckerの中身をすべて上記のコードと入れかえて、
再度ツールの動作確認をおこなっていきます。

コントローラを選択して、ツールのボタンをクリック。

「State: ‘run has no animation clip.」と表示されました。
見事、意図通りの挙動が完成です!

作成したツールは実用前に十分テストを行うことをおすすめします。
ツールから操作するデータはバックアップを取っておくなどして、
誤動作があっても問題ない環境で行うと安心です。

ChatGPTを使ってツール作成を行うことのメリット

このように、ツール作成者にプログラム知識がなくても
ChatGPTへの入力を繰り返していくだけで、実用に耐えるツールを作ることができます。

ChatGPTを使ってツール作成を行うことのメリットをまとめます。

コード生成でツールを作るメリット
  • プログラミングの知識を持っていなくても、ツールを作成することができる
  • 瞬時にコード生成が行われるため、ツール作成の時間が劇的に速くなる

ChatGPTでコード生成する際の注意点

逆に、生成AIでコードを作る場合の注意点もあげます。

生成コードは意図しない誤動作を含む可能性がある

生成AIが出力するコードには、バグや不具合が含まれる可能性があります。
通常のChatGPTの利用でも誤った情報が出力される恐れがあるように、
完璧なコードが生成される保証はありません。

ツールの想定外の挙動によって、大切なデータを壊してしまう可能性もゼロとは言えないのです。

コード生成の利用で、プログラミング知識がなくてもツールが作れることは魅力ではあるのですが、
動作を保証するためには、コードを読んで理解し修正できるスキルが必要だと思います。

法的な問題がないか確認が必要

ChatGPTによって生成されたコードには、特許や著作権などの法的な問題を含む場合があります。

個人が趣味や学習目的で生成コードを利用することは問題無いと思いますが、
業務で利用する場合は法的な確認を行うようにしましょう。

入力情報はAIの学習に使われる

ChatGPTは過去の入力情報から学習することで、文章生成を可能にしています。
AIに入力した情報は、AIが学習するためのデータとして使用されるのです。

個人情報や機密情報をChatGPTに入力してしまうことは、
情報を開示するに等しいため注意が必要です。

入力情報は、公開されている情報や一般的に認知されている情報にとどめるようにしましょう。

まとめ

今回は、ChatGPTを使用してUnityのツールを作成する方法についてご紹介しました。

ChatGPTを使うと、プログラミング知識がなくても瞬時にツール作成ができます。
ただし、AIによる生成コードは誤動作を含む可能性があるため、
安全にツールを使うためには最低限のプログラミング知識が必要です。

ツールの動作を保証するため、
生成されたコードを読んで理解し、修正できるスキルを身につけておきたいですね。

幸い、プログラムの学習もAIを使うことで効率的に進めることができます。
わからないところをAIに聞くと、まるで詳しい人に聞いたように答えてくれるのでとても便利です。

おすすめの学習教材を紹介しますので、興味を持たれたかたはぜひ見てみてください!

◆Unity C#プログラミングの基礎を知りたい方に おすすめの動画・本

icon icon
一週間で身につくC#言語 icon
Unity・ASP.ENT・Windowsアプリ開発のために
必要な基礎プログラミングスキルを身に着けるコース

↑こちらの本はKindle Unlimitedで読むこともできます!
Kindle Unlimitedの無料体験はこちらから

コメント

タイトルとURLをコピーしました