これは本質的に「長所と短所は何か」という質問です。
基本的に、Unity エディターのスクリプトでは、アセットまたはデータのバージョンからEditorGUI.PropertyField(...)
何らかの形で取得する必要がありますが、別のフィールドのようなものはシリアライゼーション手順なしで使用できます。いけない。SerializedProperty
SerializedObject
EditorGUI.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);
}
}
}