zoukankan      html  css  js  c++  java
  • Unity3D编辑器扩展(七)—— 在自定义编辑器窗口中序列化List对象

    假设我们创建一个 Test 组件,并定义一个 string 类型的列表,代码如下:

    1 using System.Collections.Generic;
    2 using UnityEngine;
    3 
    4 public class Test : MonoBehaviour 
    5 {
    6     public List<string> strs;
    7 }

    挂载组件后,我们会得到下面的效果:

     Unity 自动帮我们把 strs 这个 List 序列化到了面板上,我们还可以通过修改 Size 的大小,来改变 List 的大小,也可以通过鼠标右键来删除或者复制一个元素。

    如果我们想要在自定义的窗口中去序列化一个 List 对象应该怎么做呢?

    这时,我们就需要用到 SerializedObject 和 SerializedProperty 两个类来帮助我们序列化,代码如下:

     1 using System.Collections.Generic;
     2 using UnityEditor;
     3 using UnityEngine;
     4 
     5 public class EditorTest : EditorWindow
     6 {
     7     public List<string> stringList = new List<string>();
     8 
     9     private SerializedObject serializedObject;
    10     private SerializedProperty serializedProperty;
    11 
    12     [MenuItem("MyEditor/Window1")]
    13     private static void Window()
    14     {
    15         EditorTest _editorTest = (EditorTest)EditorWindow.GetWindow(typeof(EditorTest), false, "Window", true);
    16         _editorTest.Show();
    17     }
    18 
    19     private void OnEnable()
    20     {
    21         serializedObject = new SerializedObject(this);
    22         serializedProperty = serializedObject.FindProperty("stringList");
    23     }
    24     private void OnGUI()
    25     {
    26         serializedObject.Update();
    27         EditorGUI.BeginChangeCheck();
    28         EditorGUILayout.PropertyField(serializedProperty, true);
    29         if (EditorGUI.EndChangeCheck())
    30         {
    31             serializedObject.ApplyModifiedProperties();
    32         }
    33 
    34         GUILayout.BeginHorizontal();
    35         GUILayout.FlexibleSpace();//插入一个弹性空白  
    36         if (GUILayout.Button("Add"))
    37         {
    38             stringList.Add(string.Empty);
    39         }
    40         GUILayout.EndHorizontal();
    41     }
    42 }

    我们会得到下面的效果:

     这样我们就实现了再窗口中序列化 List 对象。这里还实现了一个 Add 按钮去方便我们新增元素,至于删除,还是得使用鼠标右键。

    如果说我们 List 中存储的是我们自定义的数据类型,那么这个类型必须添加 [System.Serializable] 标签,否则无法序列化。

  • 相关阅读:
    队列安排
    杂物
    最大数
    牛券
    斐波那契数列 !有疑惑
    方格取数
    阶乘之和-魏国
    过河卒
    二分查找算法(转)
    求整数的二进制表示中1的个数 (转)
  • 原文地址:https://www.cnblogs.com/xiaoyulong/p/13019953.html
Copyright © 2011-2022 走看看