1

これは本質的に「長所と短所は何か」という質問です。

基本的に、Unity エディターのスクリプトでは、アセットまたはデータのバージョンからEditorGUI.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