2013-07-27 42 views
1

我想製作一個程序,如果它從檢查器(它被放置在「ExampleEditor」中)取得一個TextAsset,它會爲使用Blendshape動畫製作一個自定義數據實例。爲什麼C#使用[System.Serializable]來保存實例? (Unity3D)

起初我使自定義數據類不使用[System.Serializable]。

public class Matrix { 
    public int row; 
    public int col; 
    public double[,] mat; 
} 

我的策略是採取TextAsset,解析來自TextAsset串並最終作出Matrix實例在「Example.cs」字段變量。我想,當它初始化並且首先分配時,我能夠在Example實例中使用該變量。然而,它沒有工作,它拋出'NullReferenceException'。

所以我使用'[System.Serializable]'找到解決方案。它確實有效。 (我知道Unity3D不提供自己的序列化方法多維數組)。

using UnityEngine; 
using System; 
using System.Collections; 
using System.Collections.Generic; 

[System.Serializable] 
public class Matrix { 
    [System.Serializable] 
    public class mRow { 
     public List<float> aRow = new List<float>(); 
    } 

    [HideInInspector] 
    [SerializeField] 
    public int row; 

    [HideInInspector] 
    [SerializeField] 
    public int col; 

    //[HideInInspector] 
    [SerializeField] 
    public List<mRow> mat = new List<mRow>(); 
} 

最後,我知道解決的辦法,但我不知道爲什麼這個問題發生了。它與GC有關?

+2

這個問題似乎沒有道理?可序列化屬性僅告訴編譯器可以序列化所討論的對象。未標記的屬性不會被序列化。很難知道你想要達到什麼樣的效果/這個描述中究竟是什麼問題。 – War

回答

7

你的問題不是很清楚,但我想知道你不瞭解什麼。

My strategy was taking a TextAsset, parsing string from TextAsset and finally making a Matrix instance to a field variable in 'Example.cs'.

你沒有解釋你是怎麼做到的(也許調用自定義檢查器的解析函數?)。 但是,儘管如何設法從編輯器初始化字段,如果該字段不是可序列化的,那麼將從編輯器切換到播放模式時爲空。

發生這種情況是因爲在進入播放模式時,Unity3D會序列化所有C#類,這些類將填充引擎的相對類別C++。如果一個字段不是Unity可以序列化的類型的公共字段(或者甚至是標有SerializeFieldAttribute的私有字段,總是Unity可以序列化的類型),Unity3D將不會序列化它。

所以當你切換到播放模式時,參考值將爲空。

換句話說,您想要從編輯器初始化的所有字段必須是可序列化的,以便在播放模式下使用。

[SerializeField] 
public List<mRow> mat = new List<mRow>(); 

上面的代碼沒有多大意義。如果您計劃從檢查器初始化可序列化的字段,請不要通過代碼對其進行初始化,否則最終可能會失去參考。 一個這樣的錯誤的示例:

[SerializeField] 
private List<int> aList; 

public void Start() 
{ 
    aList = new List<int>(); 
} 

上面的代碼會引起麻煩。如果您已經從檢查員初始化aList,它將被正確序列化,但是當您切換到播放模式時,Start回調被調用,aList將被重新初始化,並且您將最終引用一個空列表。

這裏有一個很好的blog post解釋如何處理對象的序列化的詳細信息Unity3D。閱讀!

+2

這裏是[其他] [http://forum.unity3d.com/threads/155352-Serialization-Best-Practices-Megapost]好[資源](http://docs.unity3d.com/Documentation/ScriptReference/SerializeField .html)爲其他感興趣的人。 – Jerdak

+0

感謝您的回答,「但是,儘管您已經從編輯器中設法初始化了一個字段,但如果該字段不是可序列化的,則從編輯器切換到播放模式時它將爲空。」這部分真的很有幫助。 – user1732445

相關問題