获取第一个序列化属性。
您可以使用此属性遍历目标对象的所有属性。通常,当已知所需的字段名称时,最好使用 FindProperty 以更快地检索关联的 SerializedProperty。不过当面对需要扫描不同类型的对象的更通用代码(如在提前未知所需属性名称时),此方法会很有用。
其他资源:FindProperty、SerializedProperty.NextVisible、SerializedProperty.Reset。
using System; using System.Text; using UnityEngine; using UnityEditor;
public class SerializeObjectGetIteratorExample : ScriptableObject { public bool m_FirstField;
[MenuItem("Example/SerializedObject GetIterator")] static void GetIteratorExample() { // Each Unity Object has some internal properties that will be serialized. // Some of these are visible in the inspector, others are hidden. // Typically they can be ignored, but when using SerializedObject.GetIterator() they // appear prior to the C# fields. var scriptableObject = ScriptableObject.CreateInstance<SerializeObjectGetIteratorExample>();
using (var serializedObject = new SerializedObject(scriptableObject)) { SerializedProperty iterator = serializedObject.GetIterator();
var sb = new StringBuilder(); sb.AppendLine("Visible Internal Properties:");
// GetIterator returns a root that is above all others (depth -1) // so first property is found by stepping into the children bool visitChildren = true; iterator.NextVisible(visitChildren);
// For rest of scan stay at the same level (depth 0) visitChildren = false;
do { if (iterator.name == "m_FirstField") break; // Found first field from the C# object
sb.AppendLine($"\t{iterator.name}"); } while (iterator.NextVisible(visitChildren));
// Repeat, using "Next" to show the hidden properties as well as visible sb.AppendLine("All Internal Properties:");
iterator.Reset(); visitChildren = true; iterator.Next(visitChildren); visitChildren = false;
do { if (iterator.name == "m_FirstField") break; sb.AppendLine($"\t{iterator.name}"); } while (iterator.Next(visitChildren));
Debug.Log(sb.ToString()); } } }