1

这本质上是一个“利弊是什么”的问题。

基本上,在 Unity Editor 脚本中,需要从资产或数据的某个版本中获取EditorGUI.PropertyField(...)某种形式,而无需序列化步骤就可以使用另一个字段,所以我想知道您应该在何处/何时使用 PropertyField 以及何时使用不应该。SerializedPropertySerializedObjectEditorGUI.TextField(...)

我实际上是从 PropertyFields 开始的,但是随着我的数据库经理的成长,我在编辑和保存数据方面遇到了越来越多的问题,直到最终我回到了EditorGUI.TextField

现在我不记得为什么我首先开始使用SerializedProperty并认为我缺少一些优势(即,一种更新保存数据的方式不会导致每次用户更新项目名称并导致滞后来电AssetDatabase.SaveAssets()

谢谢你的时间。

这是我的编辑器脚本的一部分:

    void OnGUI()
{
    if (db == null) db = new ItemDB();

    Item item;

    // ...

    GUILayout.Label("Items");
    scrollOffset = GUILayout.BeginScrollView(scrollOffset);
    for(int i = 0, len = db.size; i < len; i++)
    {
        item   = db.items[i];

        /*
        Begin GUILayout formatting
        */
        EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField(item.itemId.ToString(), GUILayout.Width(48f));
            item.itemName = EditorGUILayout.TextField(item.itemName);
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("Eq Slot", GUILayout.Width(48f));
            item.eqSlot = (Item.EqSlot)EditorGUILayout.EnumPopup(item.eqSlot);
        EditorGUILayout.EndHorizontal();

        GUILayout.Space(24f);
        /*
        End GUILayout formatting
        */
    }
    GUILayout.EndScrollView();
}

/*
 * Runs 10 frames a second to let the inspector refresh.
 * Saving 'dirty' assets is kinda heavy work, so mark them in OnGUI then save them here.
 */
void OnInspectorUpdate()
{
    AssetDatabase.SaveAssets();
}

这是 Item 类的示例:

using UnityEngine;
using UnityEditor;
using System.Collections;

public class Item : ScriptableObject
{
// ...

public int itemId;

[SerializeField]
private string _itemName;

[SerializeField]
private EqSlot _eqSlot = EqSlot.Null;

public string itemName
{
    get { return _itemName; }
    set
    {
        if (_itemName != value)
        {
            _itemName = value;
            EditorUtility.SetDirty(this);
        }
    }
}

public EqSlot eqSlot
{
    get { return _eqSlot; }
    set
    {
        if (_eqSlot != value)
        {
            _eqSlot = value;
            EditorUtility.SetDirty(this);
        }
    }
}
4

0 回答 0