• 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] 标签,否则无法序列化。

  • 相关阅读:
    poj 3616 Milking Time
    poj 3176 Cow Bowling
    poj 2229 Sumsets
    poj 2385 Apple Catching
    poj 3280 Cheapest Palindrome
    hdu 1530 Maximum Clique
    hdu 1102 Constructing Roads
    codeforces 592B The Monster and the Squirrel
    CDOJ 1221 Ancient Go
    hdu 1151 Air Raid(二分图最小路径覆盖)
  • 原文地址:https://www.cnblogs.com/xiaoyulong/p/13019953.html
Copyright © 2020-2023  润新知