Unity中自定义一个EditorWindow窗体并显示诸如list<GameObject>数据

前言: 自定义窗体的效果

Unity中自定义一个EditorWindow窗体并显示诸如list<GameObject>数据_第1张图片

Unity中自定义一个EditorWindow窗体并显示诸如list<GameObject>数据_第2张图片

一、显示一个你自定义的窗口

  • 原理

1、基类:EditorWindow
2、组成:
(1)定义普通变量。
(2)定义系列化的对象和属性。【SerializedObject】、【SerializedProperty】
(3)初始化方法和菜单定制

 //Add menu named "My Window" to the Window menu
    [MenuItem("Window/My Window")]
    static void Init()
    {
        // Get existing open window or if none, make a new one:
        MyWindow window = (MyWindow)EditorWindow.GetWindow(typeof(MyWindow));
        window.Show();
    }

(4)定制GUI和逻辑

  void OnGUI(){......}
  • 完整代码
using UnityEngine;
using UnityEditor;

public class MyWindow : EditorWindow
{
    string myString = "Hello World";
    bool groupEnabled;
    bool myBool = true;
    float myFloat = 1.23f;

    private string name = "";   //物体的名字

    //Add menu named "My Window" to the Window menu
    [MenuItem("Window/My Window")]
    static void Init()
    {
        // Get existing open window or if none, make a new one:
        MyWindow window = (MyWindow)EditorWindow.GetWindow(typeof(MyWindow));
        window.Show();
    }

    //编辑器的GUI实现

    void OnGUI()
    {
        GUILayout.Label("Base Settings", EditorStyles.boldLabel);
        myString = EditorGUILayout.TextField("Text Field", myString);
        GUILayout.Button("Click");

        groupEnabled = EditorGUILayout.BeginToggleGroup("Optional Settings", groupEnabled);
        myBool = EditorGUILayout.Toggle("Toggle", myBool);
        myFloat = EditorGUILayout.Slider("Slider", myFloat, -3, 3);
        EditorGUILayout.EndToggleGroup();

        name = EditorGUILayout.TextField("输入名字");

        if (GUILayout.Button("Click"))
        {
            Debug.Log(EditorGUILayout.TextField("Text Field"));
            string myStr = "1#2#3#4#5#6#7#8#9#10#11#12#13";
            var result = myStr.Split("#"[0]);
            Debug.Log(result.Length);
            Debug.Log(result.ToString());
            
            Debug.Log(name);
        }
    }
}

二、如何在editorWindow窗体上显示场景中的GameObject物体

  • 效果
    Unity中自定义一个EditorWindow窗体并显示诸如list<GameObject>数据_第3张图片

  • 关键点

    • 定义一个正常的变量:searchResults
    /// 
    /// 查询的结果:显示物体的ref
    ///    
    public List<GameObject> searchResults = new List<GameObject>();
    • 定义一个对应的SerializedProperty变量: gosPty
    /// 
    /// SerializedProperty - searchResults
    /// 
    private SerializedProperty gosPty;
    • 初始化SerializedProperty变量
  private void OnEnable()
    {        
        //...       
        gosPty = serObj.FindProperty("searchResults");    
        //...  
    }
    • 绘制GUI和定制事件
      主要步骤:
      绘制 label,
      绘制textField,
      绘制Button并定制代码
      更新窗体自身
      Unity中自定义一个EditorWindow窗体并显示诸如list<GameObject>数据_第4张图片
  • 参考代码【需要引用别的脚本,仅供参考,不能直接run】

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;


/// 
/// 窗体。输入一个物体的名字,查询对应的scene对象,查询时使用的容器为SceneGraphManage.objectName
/// 
public class searchObjEditorWindow : EditorWindow
{
    /// 
    /// 容器的名字:挂载单例脚本SceneGraphManager的GameObject物体
    /// 
    public string containerName = "sceneGraph测试";

    /// 
    /// 要查询物体的名字
    /// 
    public string objName = "gameObject1";

    /// 
    /// 查询的结果:显示物体的ref
    ///    
    public List<GameObject> searchResults = new List<GameObject>();

    /// 
    /// SerializedObject - this
    /// 
    private SerializedObject serObj;

    /// 
    /// SerializedProperty - searchResults
    /// 
    private SerializedProperty gosPty;

    /// 
    /// SerializedProperty - containerName
    /// 
    private SerializedProperty canPty;

    [MenuItem("Window/查询物体")]
    static void Init()
    {
        //Get existing open window or if none, make a new one:
        searchObjEditorWindow window = (searchObjEditorWindow)EditorWindow.GetWindow(typeof(searchObjEditorWindow));
        window.title = "==查询物体==";
        window.Show();
    }

    private void OnEnable()
    {
        //系列化对象的初始化
        serObj = new SerializedObject(this);
        canPty = serObj.FindProperty("containerName");
        gosPty = serObj.FindProperty("searchResults");      
    }

    //编辑器的GUI实现
    void OnGUI()
    {
        containerName = EditorGUILayout.TextField("装载物体的容器", containerName);
        objName = EditorGUILayout.TextField("物体的名字", objName);     //注意 objName = ...的【objName】不能定义成临时变量
        EditorGUILayout.PropertyField(gosPty, true);
        if (GUILayout.Button("查询"))
        {
            searchResults.Clear();
            var container = GameObject.Find(containerName).GetComponent<SceneGraphManager>().objectName;
            var res =  SceneGraphManager.GetGoByName(container, objName); 
            Debug.Log($"container.count = {container.Count} , res.count = {res.Length}");
            
            if(res.Length > 0)
            {
                foreach (var item in res)
                {
                    searchResults.Add(item);
                }
            }            
        }

        //update editorWindow
        serObj.Update();
        EditorGUI.BeginChangeCheck();
        if (EditorGUI.EndChangeCheck())
        {
            serObj.ApplyModifiedProperties();
        }
    }
}

你可能感兴趣的:(unity,游戏引擎)