AI×Unity連携強化!【AIを活用したクリッカーゲーム制作#05】

AIゲームクリエイターズ

AIを活用して、ゲーム制作!

初心者でもAIに助けてもらいながらUnityでゲームを開発する方法を解説します。

このページの内容は、下記の動画で詳しく説明しています

はじめに

ゲーム制作なんて自分には絶対に無理!

自分はプログラマーとか、専門家じゃないからゲームなんて作れるわけがない!

そんなふうに思っていませんか?

確かに自分ひとりでは難しいかもしれません

でも、最近はAIの進化がものすごく、これらAIを活用すれば

あなたもゲーム制作者になれるかもしれません!

さぁ、一緒に、AIに頼りまくったゲーム制作を始めていきましょう!

前回の振り返り

前回は、ChatGPTなどのAIの力を借りて

制作中のクリッカーゲーム「鉱石クリッカー」で、獲得できる鉱石の種類を確率で変化させたり

クリックした時に小さな鉱石がポンッと飛び出すエフェクトを追加したりしました。

このチャレンジのコンセプト

  • AIを活用することで、初心者でもゲーム制作できることを目指す!
  • Unity(ユニティ)というゲームエンジンを使って制作する
  • AIはできる限り、無料のものを使用する(商用利用の関係や、どうしても必要な機能の関係で有料版を使用する場合もあり)
  • AIを活用したゲーム制作の過程を、省略せずに全てをお見せすることで、視聴者の方が真似をして再現できるようにする

このページで使用するAIツール

ChatGPT(チャットジーピーティー)

  • https://openai.com/ja-JP/chatgpt/
  • ChatGPTは、チャット形式で質問や指示を投げかけると、自然な言葉で回答してくれるAIです。
  • 今回は、Unityの情報を出力する方法を教えてもらいました。

このページ(および動画)の活用方法

  • まずは真似して同じように試してみて、慣れてきたら少しアレンジするのが良いと思います
  • 手順などは、動画を見てもらうのが一番分かりやすいと思います
  • AIへの指示文(プロンプト)はこのページに載せていますので、コピペして、ご自身用に修正しながらご使用ください

それでは、AIに助けてもらいながら、ゲーム制作を始めていきましょう!

ヒエラルキーの出力

まず、ヒエラルキーを出力する方法が無いか聞いてみます。

Unityで、ヒエラルキーの構成をテキスト形式で出力する方法はありますか?
Unityのバージョンは2022.3.45です
ChatGPTの回答例

Unityでヒエラルキーの構成をテキスト形式で出力するには、簡単なエディタースクリプトを作成して、自動的にヒエラルキーの内容を取得し、ファイルに書き出す方法が便利です。以下にその手順を示します。

  1. Unityのプロジェクト内に新しいエディタースクリプトを作成します。
  • プロジェクトビューで、Assetsフォルダ内にEditorという名前のフォルダを作成します(エディタースクリプトは必ずEditorフォルダ内に置く必要があります)。
  • Editorフォルダ内にHierarchyExporter.csというC#スクリプトを作成します。
  1. 以下のコードをHierarchyExporter.csに記述します。
   using System.IO;
   using UnityEditor;
   using UnityEngine;

   public class HierarchyExporter : EditorWindow
   {
       [MenuItem("Tools/Export Hierarchy")]
       private static void ShowWindow()
       {
           var window = GetWindow<HierarchyExporter>();
           window.titleContent = new GUIContent("Hierarchy Exporter");
           window.Show();
       }

       private void OnGUI()
       {
           if (GUILayout.Button("Export Hierarchy to Text"))
           {
               ExportHierarchy();
           }
       }

       private static void ExportHierarchy()
       {
           string path = EditorUtility.SaveFilePanel("Save Hierarchy", "", "Hierarchy.txt", "txt");
           if (string.IsNullOrEmpty(path)) return;

           using (StreamWriter writer = new StreamWriter(path))
           {
               foreach (GameObject obj in UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects())
               {
                   WriteObject(writer, obj, 0);
               }
           }

           Debug.Log("Hierarchy exported to " + path);
       }

       private static void WriteObject(StreamWriter writer, GameObject obj, int indent)
       {
           writer.WriteLine(new string(' ', indent * 2) + obj.name);
           foreach (Transform child in obj.transform)
           {
               WriteObject(writer, child.gameObject, indent + 1);
           }
       }
   }
  1. 使い方
  • Unityエディターのメニューバーに、新しいメニュー項目「Tools > Export Hierarchy」が表示されます。
  • 「Export Hierarchy」をクリックすると、保存ダイアログが表示されますので、保存場所とファイル名を指定します。
  • 選択した場所にHierarchy.txtが出力され、テキスト形式でヒエラルキーが表示されます。

このスクリプトは、現在アクティブなシーンのルートオブジェクトから再帰的に各オブジェクトを取得し、インデントを付けて階層構造をテキストファイルに出力します。

ちゃんと出力できました。
ではさらにこれを、アタッチされているコンポーネントも表示させるようにはできますか?
ChatGPTの回答例

アタッチされているコンポーネントも含めて表示させるようにするには、各オブジェクトに追加されているコンポーネントを取得して、その名前を出力するようにスクリプトを少し改良します。以下に更新したコードを示します。

using System.IO;
using UnityEditor;
using UnityEngine;

public class HierarchyExporter : EditorWindow
{
    [MenuItem("Tools/Export Hierarchy with Components")]
    private static void ShowWindow()
    {
        var window = GetWindow<HierarchyExporter>();
        window.titleContent = new GUIContent("Hierarchy Exporter");
        window.Show();
    }

    private void OnGUI()
    {
        if (GUILayout.Button("Export Hierarchy with Components to Text"))
        {
            ExportHierarchy();
        }
    }

    private static void ExportHierarchy()
    {
        string path = EditorUtility.SaveFilePanel("Save Hierarchy with Components", "", "HierarchyWithComponents.txt", "txt");
        if (string.IsNullOrEmpty(path)) return;

        using (StreamWriter writer = new StreamWriter(path))
        {
            foreach (GameObject obj in UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects())
            {
                WriteObject(writer, obj, 0);
            }
        }

        Debug.Log("Hierarchy with components exported to " + path);
    }

    private static void WriteObject(StreamWriter writer, GameObject obj, int indent)
    {
        // オブジェクト名を書き込む
        writer.WriteLine(new string(' ', indent * 2) + obj.name);

        // アタッチされているコンポーネントを取得し、出力する
        Component[] components = obj.GetComponents<Component>();
        foreach (Component component in components)
        {
            if (component != null)
            {
                writer.WriteLine(new string(' ', (indent + 1) * 2) + "- " + component.GetType().Name);
            }
        }

        // 子オブジェクトについても再帰的に同様の処理を行う
        foreach (Transform child in obj.transform)
        {
            WriteObject(writer, child.gameObject, indent + 1);
        }
    }
}

改良点と使い方

  • 各オブジェクトについてGetComponents<Component>()を使い、アタッチされている全てのコンポーネントを取得しています。
  • 各コンポーネントの名前を、親オブジェクトより1段下のインデントで出力します。
  • スクリプトを保存し、「Tools > Export Hierarchy with Components」をクリックすると、コンポーネント情報を含むテキストファイルが出力されます。

出力例は次のようになります。

Main Camera
  - Transform
  - Camera
  - AudioListener
Directional Light
  - Transform
  - Light
Canvas
  - Transform
  - Canvas
  - CanvasScaler
  - GraphicRaycaster

これで、各オブジェクトの階層構造とアタッチされているコンポーネントを確認できます。

スクリプト間の依存関係

次に、スクリプト間の依存関係を出力する方法が無いか聞いてみます。

Unityで、シーン内のスクリプト間の依存関係をテキスト形式で出力できますか?
Unityのバージョンは2022.3.45です
ChatGPTの回答例

Unityでシーン内のスクリプト間の依存関係をテキスト形式で出力するためには、スクリプトを作成して、各スクリプトの参照関係を調べ、依存関係を出力することができます。以下に簡単なサンプルコードを示します。シーン内のすべてのオブジェクトを調べ、それぞれのスクリプトがどのオブジェクトやコンポーネントを参照しているかを解析し、テキストファイルに出力します。

1. 依存関係出力用のスクリプト作成

  1. Unityの Scripts フォルダに DependencyExporter.cs という新しいスクリプトを作成します。
  2. 以下のコードを DependencyExporter.cs に追加してください。
using UnityEngine;
using System.Collections.Generic;
using System.IO;
using System.Text;

public class DependencyExporter : MonoBehaviour
{
    [ContextMenu("Export Script Dependencies")]
    public void ExportScriptDependencies()
    {
        StringBuilder sb = new StringBuilder();
        sb.AppendLine("Scene Script Dependencies Report:");

        // シーン内のすべてのオブジェクトを取得
        GameObject[] allObjects = FindObjectsOfType<GameObject>();
        foreach (GameObject obj in allObjects)
        {
            // オブジェクトの各コンポーネントを取得
            Component[] components = obj.GetComponents<Component>();
            foreach (Component comp in components)
            {
                if (comp is MonoBehaviour monoBehaviour && monoBehaviour != null)
                {
                    // スクリプトの名前を記録
                    sb.AppendLine($"\nObject: {obj.name}, Script: {monoBehaviour.GetType().Name}");
                    sb.AppendLine("  References:");

                    // 参照を取得するフィールド
                    var fields = monoBehaviour.GetType().GetFields(
                        System.Reflection.BindingFlags.Public |
                        System.Reflection.BindingFlags.NonPublic |
                        System.Reflection.BindingFlags.Instance
                    );

                    foreach (var field in fields)
                    {
                        if (field.FieldType.IsSubclassOf(typeof(Component)))
                        {
                            Component referencedComponent = field.GetValue(monoBehaviour) as Component;
                            if (referencedComponent != null)
                            {
                                sb.AppendLine($"    - {field.Name}: {referencedComponent.gameObject.name} ({field.FieldType.Name})");
                            }
                        }
                        else if (field.FieldType == typeof(GameObject))
                        {
                            GameObject referencedGameObject = field.GetValue(monoBehaviour) as GameObject;
                            if (referencedGameObject != null)
                            {
                                sb.AppendLine($"    - {field.Name}: {referencedGameObject.name} (GameObject)");
                            }
                        }
                    }
                }
            }
        }

        // テキストファイルに出力
        string path = Path.Combine(Application.dataPath, "ScriptDependenciesReport.txt");
        File.WriteAllText(path, sb.ToString());
        Debug.Log($"Dependency report saved to {path}");
    }
}

2. 使い方

  1. スクリプトを任意のGameObject(例えば GameManager)にアタッチします。
  2. Unityエディタで、アタッチしたオブジェクトを選択し、インスペクタ内のコンテキストメニュー(スクリプト名の右側にある3点メニュー)から「Export Script Dependencies」を選択します。
  3. スクリプトがシーン内の依存関係を調べ、結果を ScriptDependenciesReport.txt というテキストファイルに出力します。出力ファイルはプロジェクトの Assets フォルダに保存されます。

3. 出力例

以下は出力ファイル ScriptDependenciesReport.txt の例です:

Scene Script Dependencies Report:

Object: GameManager, Script: GameManager
  References:
    - scoreManager: ScoreManager (ScoreManager)
    - player: Player (GameObject)

Object: Player, Script: PlayerController
  References:
    - rb: Player (Rigidbody2D)
    - enemyTarget: Enemy (GameObject)

...

このレポートには、各オブジェクトごとに、スクリプトが依存しているコンポーネントやオブジェクトのリストが記録されます。

これをエディタースクリプトに変更することは可能ですか?
ChatGPTの回答例

はい、このスクリプトをエディタースクリプトに変更し、Unityエディターのメニューから簡単にアクセスできるようにできます。以下は DependencyExporterEditor.cs というエディタースクリプトの作成手順です。このスクリプトを使用すると、Unityのメニューから直接依存関係レポートを出力できます。

1. エディタースクリプトの作成

  1. Assets/Editor フォルダを作成し、その中に DependencyExporterEditor.cs という新しいスクリプトファイルを作成します。
  2. 以下のコードを DependencyExporterEditor.cs に追加してください。
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.IO;
using System.Text;

public class DependencyExporterEditor : Editor
{
    [MenuItem("Tools/Export Script Dependencies")]
    public static void ExportScriptDependencies()
    {
        StringBuilder sb = new StringBuilder();
        sb.AppendLine("Scene Script Dependencies Report:");

        // シーン内のすべてのオブジェクトを取得
        GameObject[] allObjects = GameObject.FindObjectsOfType<GameObject>();
        foreach (GameObject obj in allObjects)
        {
            // オブジェクトの各コンポーネントを取得
            Component[] components = obj.GetComponents<Component>();
            foreach (Component comp in components)
            {
                if (comp is MonoBehaviour monoBehaviour && monoBehaviour != null)
                {
                    // スクリプトの名前を記録
                    sb.AppendLine($"\nObject: {obj.name}, Script: {monoBehaviour.GetType().Name}");
                    sb.AppendLine("  References:");

                    // 参照を取得するフィールド
                    var fields = monoBehaviour.GetType().GetFields(
                        System.Reflection.BindingFlags.Public |
                        System.Reflection.BindingFlags.NonPublic |
                        System.Reflection.BindingFlags.Instance
                    );

                    foreach (var field in fields)
                    {
                        if (field.FieldType.IsSubclassOf(typeof(Component)))
                        {
                            Component referencedComponent = field.GetValue(monoBehaviour) as Component;
                            if (referencedComponent != null)
                            {
                                sb.AppendLine($"    - {field.Name}: {referencedComponent.gameObject.name} ({field.FieldType.Name})");
                            }
                        }
                        else if (field.FieldType == typeof(GameObject))
                        {
                            GameObject referencedGameObject = field.GetValue(monoBehaviour) as GameObject;
                            if (referencedGameObject != null)
                            {
                                sb.AppendLine($"    - {field.Name}: {referencedGameObject.name} (GameObject)");
                            }
                        }
                    }
                }
            }
        }

        // テキストファイルに出力
        string path = Path.Combine(Application.dataPath, "ScriptDependenciesReport.txt");
        File.WriteAllText(path, sb.ToString());
        Debug.Log($"Dependency report saved to {path}");
        EditorUtility.DisplayDialog("Export Complete", "Script dependency report saved to:\n" + path, "OK");
    }
}

2. 使い方

  1. エディタースクリプトを保存すると、Unityメニューの Tools の下に Export Script Dependencies という新しい項目が表示されます。
  2. メニューの Tools > Export Script Dependencies を選択すると、現在のシーンの依存関係レポートが生成され、Assets フォルダに ScriptDependenciesReport.txt というテキストファイルが出力されます。

3. 出力例

出力例は、先ほどの通常スクリプトと同様の形式です:

Scene Script Dependencies Report:

Object: GameManager, Script: GameManager
  References:
    - scoreManager: ScoreManager (ScoreManager)
    - player: Player (GameObject)

Object: Player, Script: PlayerController
  References:
    - rb: Player (Rigidbody2D)
    - enemyTarget: Enemy (GameObject)

...

このエディタースクリプトにより、シーン内のスクリプト依存関係を簡単に取得できるようになります。

Mermaid記法でスクリプト依存関係の出力

では、シーン内のスクリプト依存関係をMermaid記法で表して出力するスクリプトを、
先ほどとは別のスクリプトで作成してください。
ChatGPTの回答例

Mermaid記法でシーン内のスクリプト依存関係を出力するエディタースクリプトを作成します。Mermaidはシンプルな記法でフローチャートや関係図を作成でき、Markdownファイルなどで視覚化するのに便利です。

以下に、DependencyMermaidExporterEditor.cs という新しいエディタースクリプトの手順を示します。このスクリプトは、依存関係をMermaid記法で出力し、テキストファイルとして保存します。

1. エディタースクリプトの作成

  1. Assets/Editor フォルダに DependencyMermaidExporterEditor.cs という新しいスクリプトファイルを作成します。
  2. 以下のコードを DependencyMermaidExporterEditor.cs に追加してください。
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

public class DependencyMermaidExporterEditor : Editor
{
    [MenuItem("Tools/Export Script Dependencies as Mermaid")]
    public static void ExportScriptDependenciesAsMermaid()
    {
        StringBuilder sb = new StringBuilder();
        sb.AppendLine("graph TD");

        // シーン内のすべてのオブジェクトを取得
        GameObject[] allObjects = GameObject.FindObjectsOfType<GameObject>();
        HashSet<string> uniqueEdges = new HashSet<string>(); // エッジの重複を避ける

        foreach (GameObject obj in allObjects)
        {
            Component[] components = obj.GetComponents<Component>();
            foreach (Component comp in components)
            {
                if (comp is MonoBehaviour monoBehaviour && monoBehaviour != null)
                {
                    string scriptName = FormatMermaidNodeName(monoBehaviour.GetType().Name);
                    string objectName = FormatMermaidNodeName(obj.name);

                    sb.AppendLine($"    {objectName}([\"{objectName}\"]) --> {scriptName}([\"{scriptName}\"])");

                    var fields = monoBehaviour.GetType().GetFields(
                        System.Reflection.BindingFlags.Public |
                        System.Reflection.BindingFlags.NonPublic |
                        System.Reflection.BindingFlags.Instance
                    );

                    foreach (var field in fields)
                    {
                        if (field.FieldType.IsSubclassOf(typeof(Component)))
                        {
                            Component referencedComponent = field.GetValue(monoBehaviour) as Component;
                            if (referencedComponent != null)
                            {
                                string referencedObjectName = FormatMermaidNodeName(referencedComponent.gameObject.name);
                                string referencedTypeName = FormatMermaidNodeName(referencedComponent.GetType().Name);

                                string edge = $"{scriptName} --> {referencedObjectName}_{referencedTypeName}";
                                if (uniqueEdges.Add(edge)) // 重複を避ける
                                {
                                    sb.AppendLine($"    {scriptName} --> {referencedObjectName}_{referencedTypeName}[\"{referencedObjectName} ({referencedTypeName})\"]");
                                }
                            }
                        }
                        else if (field.FieldType == typeof(GameObject))
                        {
                            GameObject referencedGameObject = field.GetValue(monoBehaviour) as GameObject;
                            if (referencedGameObject != null)
                            {
                                string referencedGameObjectName = FormatMermaidNodeName(referencedGameObject.name);

                                string edge = $"{scriptName} --> {referencedGameObjectName}";
                                if (uniqueEdges.Add(edge)) // 重複を避ける
                                {
                                    sb.AppendLine($"    {scriptName} --> {referencedGameObjectName}([\"{referencedGameObjectName}\"])");
                                }
                            }
                        }
                    }
                }
            }
        }

        string path = Path.Combine(Application.dataPath, "ScriptDependenciesMermaid.md");
        File.WriteAllText(path, sb.ToString());
        Debug.Log($"Mermaid dependency report saved to {path}");
        EditorUtility.DisplayDialog("Export Complete", "Mermaid dependency report saved to:\n" + path, "OK");
    }

    private static string FormatMermaidNodeName(string name)
    {
        return Regex.Replace(name, @"[^a-zA-Z0-9_]", "_");
    }
}

2. 使い方

  1. スクリプトを保存すると、Unityメニューの ToolsExport Script Dependencies as Mermaid という新しい項目が表示されます。
  2. Tools > Export Script Dependencies as Mermaid を選択すると、現在のシーンの依存関係がMermaid記法で生成され、Assets フォルダに ScriptDependenciesMermaid.md というMarkdownファイルが出力されます。

3. 出力例

生成された ScriptDependenciesMermaid.md ファイルの例は次のようになります:

graph TD
    GameManager([GameManager]) --> GameManagerScript([GameManagerScript])
    GameManagerScript --> ScoreManager_ScoreManager[ScoreManager (ScoreManager)]
    GameManagerScript --> Player([Player])

    Player([Player]) --> PlayerController([PlayerController])
    PlayerController --> Rigidbody2D_Rigidbody2D[Rigidbody2D (Rigidbody2D)]
    PlayerController --> Enemy([Enemy])

    ...

このMarkdownファイルをMermaid対応のMarkdownエディタで開くと、スクリプト依存関係が視覚的に表示されます。

オブジェクトの設定出力

最後に、各オブジェクトの、インスペクター上での設定値を出力できないか聞いてみます。

Unityで、ゲームオブジェクトの設定値を出力させたいです。
対象のゲームオブジェクトにアタッチして、何らかのアクションを取ると
そのオブジェクトのインスペクター上での全ての設定値をテキスト形式で出力できるスクリプトを作成してください。
ChatGPTの回答例

Unityで、特定のゲームオブジェクトのインスペクター上の設定値をテキスト形式で出力するスクリプトを作成できます。以下のコードを対象のオブジェクトにアタッチし、ボタンを押したときにそのオブジェクトの全設定値をコンソールに出力するようにしてみましょう。

using UnityEngine;
using System.Text;

public class InspectorSettingsLogger : MonoBehaviour
{
    // 対象オブジェクトの設定値を出力するメソッド
    public void LogInspectorSettings()
    {
        // StringBuilderで出力内容を組み立てます
        StringBuilder sb = new StringBuilder();

        // 各コンポーネントの設定値を取得
        Component[] components = GetComponents<Component>();

        sb.AppendLine("Inspector Settings for GameObject: " + gameObject.name);
        sb.AppendLine("------------------------------------");

        foreach (Component component in components)
        {
            if (component == null) continue;

            sb.AppendLine("Component: " + component.GetType().Name);

            // すべてのフィールドを取得して、値を出力
            var fields = component.GetType().GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
            foreach (var field in fields)
            {
                object value = field.GetValue(component);
                sb.AppendLine("    " + field.Name + ": " + (value != null ? value.ToString() : "null"));
            }

            // すべてのプロパティを取得して、値を出力
            var properties = component.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
            foreach (var property in properties)
            {
                if (property.CanRead && property.GetIndexParameters().Length == 0) // 読み取り可能でインデクサでない場合
                {
                    object value = property.GetValue(component, null);
                    sb.AppendLine("    " + property.Name + ": " + (value != null ? value.ToString() : "null"));
                }
            }

            sb.AppendLine(); // 各コンポーネントの区切り
        }

        // 結果をコンソールに出力
        Debug.Log(sb.ToString());
    }
}

使用方法

  1. このスクリプトをUnityのプロジェクトに追加します。
  2. 対象のゲームオブジェクトにこのスクリプトをアタッチします。
  3. LogInspectorSettings メソッドをボタンから実行するように設定するか、Unityの[ContextMenu]属性を使用して、インスペクターで右クリックから実行できるようにします。例えば、LogInspectorSettingsメソッドの上に以下の行を追加すると、インスペクター上で実行できるようになります。
   [ContextMenu("Log Inspector Settings")]

これで、対象オブジェクトにアタッチされた全てのコンポーネントの設定値がコンソールに出力されるようになります。

下記の点を修正してください。
・コンテキストメニューで実行できるようにしてください
・コンソールでは無く、テキストファイルで出力されるようにしてください。
ChatGPTの回答例

コンテキストメニューから実行し、設定値をテキストファイルに出力するように修正したスクリプトを以下に示します。これで、ゲームオブジェクトの設定値がテキストファイルに書き出されるようになります。

using UnityEngine;
using System.Text;
using System.IO;
using System.Reflection;

public class InspectorSettingsLogger : MonoBehaviour
{
    // コンテキストメニューから実行可能にする
    [ContextMenu("Log Inspector Settings to File")]
    public void LogInspectorSettingsToFile()
    {
        // StringBuilderで出力内容を組み立てる
        StringBuilder sb = new StringBuilder();

        // 出力内容のヘッダー
        sb.AppendLine("Inspector Settings for GameObject: " + gameObject.name);
        sb.AppendLine("------------------------------------");

        // ゲームオブジェクトにアタッチされた全てのコンポーネントを取得
        Component[] components = GetComponents<Component>();

        foreach (Component component in components)
        {
            if (component == null) continue;

            sb.AppendLine("Component: " + component.GetType().Name);

            // 各コンポーネントのすべてのフィールドとプロパティを取得し、出力内容に追加
            var fields = component.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
            foreach (var field in fields)
            {
                object value = field.GetValue(component);
                sb.AppendLine("    " + field.Name + ": " + (value != null ? value.ToString() : "null"));
            }

            var properties = component.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
            foreach (var property in properties)
            {
                // 読み取り可能でインデクサでない、非推奨のプロパティをスキップ
                if (property.CanRead && property.GetIndexParameters().Length == 0)
                {
                    // 例外が発生した場合はそのプロパティをスキップ
                    try
                    {
                        object value = property.GetValue(component, null);
                        sb.AppendLine("    " + property.Name + ": " + (value != null ? value.ToString() : "null"));
                    }
                    catch
                    {
                        // 例外が発生した場合は何もしない(スキップする)
                    }
                }
            }

            sb.AppendLine(); // 各コンポーネントの区切り
        }

        // ファイル出力の準備
        string fileName = $"{gameObject.name}_InspectorSettings.txt";
        string filePath = Path.Combine(Application.dataPath, fileName);

        try
        {
            // テキストファイルに出力
            File.WriteAllText(filePath, sb.ToString());
            Debug.Log($"Inspector settings have been saved to: {filePath}");
        }
        catch (IOException e)
        {
            Debug.LogError("Failed to write inspector settings to file: " + e.Message);
        }
    }
}

使い方

  1. このスクリプトをUnityのプロジェクトに追加し、対象のゲームオブジェクトにアタッチします。
  2. インスペクターの「三点ボタン」または右クリックメニューから「Log Inspector Settings to File」を選択します。
  3. Unityのプロジェクトフォルダ内のAssetsディレクトリに、[オブジェクト名]_InspectorSettings.txtというファイル名で出力されます。

これにより、対象オブジェクトのインスペクター設定がテキストファイルに保存されます。

コメント

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