2017-01-04 24 views
1

發現類似的問題,但沒有相同的:無法訪問SerializedProperty的字符串字段

我有一個類,「行動」,這是個ScriptableObject。

[Serializable] 
public class Action : ScriptableObject 
{ 
    [SerializeField] public string ID = ""; 
    [SerializeField] public float defaultCost = 1f; 
} 

我想保持在編輯器窗口,讓我輕鬆地創建和刪除此個ScriptableObject的實例的ReorderableList。我也希望能夠使用此列表上的文本字段輕鬆調整ID和defaultCost字段。但是,爲了這樣做,我需要能夠將這些字段作爲ReorderableList的SerializedProperty元素的子屬性來訪問。

顯然,它應該這樣工作:(從方法採取自定義繪製ReorderableList的一個要素)

SerializedProperty element = reorderableList.serializedProperty.GetArrayElementAtIndex(index); 

EditorGUI.PropertyField 
(
    new Rect(x, y, width, height), 
    element.FindPropertyRelative("ID"), 
    GUIContent.none 
); 

然而,element.FindPropertyRelative(「ID」),用於兩個屬性僅返回空。

我知道我有該元素是正確的,因爲如果我用

Action action = element.objectReferenceValue as Action; 

我能夠正確地獲取操作對象。

所以我只想總結一下,我需要找到一種方法來獲取這個ScriptableObject的字段作爲SerializedProperties,以便我可以在自定義的編輯器窗口中編輯它們。

+0

這是因爲FindPropertyRelative嘗試檢索屬性,但您的ID是字段。您可以將ID更改爲像[[SerializeField] public string ID {get; set;}這樣的屬性''我不確定SerializeField是否爲屬性的有效屬性。屬性不需要Meybe屬性。然後,您需要填充默認值屬性在構造函數中,比如'this.ID =「」' –

+0

我試圖改變我的動作類的樣子'[Serializable接口] 公共類行動:個ScriptableObject { 公共字符串ID { GET {return m_id; } set {m_id = value; } } [SerializeField] 私有字符串m_id =「」;',它似乎沒有工作。 – EmmetOT

回答

1

發現了一個可怕但功能齊全的解決方案。

通過獲取其引用類型來檢索對象,創建一個新的SerializedObject,使用FindProperty獲取該屬性,然後應用更改。

SerializedObject ac = new SerializedObject(action); 

EditorGUI.PropertyField 
(
new Rect(x, y, width, height), 
ac.FindProperty("ID"), 
GUIContent.none 
); 

ac.ApplyModifiedProperties();