Unity 逼死強(qiáng)迫癥的字段序列化

最近在整理 Unity 代碼的時候遇到一個可以逼死強(qiáng)迫癥的情況,就是 Unity 里面對字段進(jìn)行序列化讓字段可以在 Inspector 中編輯的同時,要求其他類對該字段只能讀取不能修改。通常情況下,我們對字段進(jìn)行序列化有兩種方式:

  1. 將類的字段直接設(shè)置成 public
  2. 將字段設(shè)置成 private,但是使用 [SerializeField] 標(biāo)記該字段需要序列化

也許是出于便利性,我看到的大部分 Unity 源碼在進(jìn)行字段序列化的時候都是采用第一種方式,即直接將字段設(shè)置成 public,例如我們有一個類 MyComponent,這個類有一個代表最大生命值的字段叫 maxHealth:

public class MyComponent : MonoBehaviour
{
    public int maxHealth;
}

上面的代碼里,maxHealth 字段會被 Unity 自動序列化,但是它違背了面向?qū)ο缶幊痰囊粋€很重要的原則,即【封裝】。一個字段被設(shè)置成 public 之后意味著它可以被其他類隨意修改,這是一個潛在的風(fēng)險,當(dāng)團(tuán)隊(duì)開發(fā)人員越來越多的時候,很可能哪天某一個新來的程序員就把這個字段通過代碼給改了,而我們的初衷是只希望該字段只能在 MyComponent 類和 Inspector 中修改。為了解決封裝性的問題,我采用了第二種方式,將 maxHealth 字段改成了 private,并且加上 [SerializeField] 特性,然后新增了個只允許 get 操作的 MaxHealth 屬性:

public class MyComponent : MonoBehaviour
{
    [SerializeField]
    private int maxHealth;
    public int MaxHealth { get => maxHealth; }
}

修改之后的代碼就可以滿足只允許 MyComponent 和 Inspector 修改數(shù)值,其他類只能讀取的要求了,但是 VS 卻會給出如下的警告:

Field 'MyComponent.maxHealth' is never assigned to, and will always have its default value 0.

意思就是 maxHealth 這個字段是私有的,但是卻沒有進(jìn)行任何的賦值操作,所以它的默認(rèn)值會一直是 0,而實(shí)際上我們是通過 Inspector 賦值的,這個操作 VS 檢測不到。這不是要必死我這種見不得任何代碼警告的強(qiáng)迫癥患者,于是我又對代碼進(jìn)行了修改:

public class MyComponent : MonoBehaviour
{
    [SerializeField]
    private int maxHealth = default;
    public int MaxHealth { get => maxHealth; }
}

這回我給 maxHealth 直接顯示賦值為 default,其實(shí)也就是 0,VS 在檢查的時候就不會再有警告了,但是卻有另一個提示:

經(jīng)過 VS 的檢查,它認(rèn)為 maxHealth 可以被標(biāo)記成 readonly,但是如果我真的這么干的話,又會導(dǎo)致 Inspector 無法修改 maxHealth 的值,另外 VS 還會提示你 default 的賦值操作是不必要的,因?yàn)槟J(rèn)就是這個值。

到這里,我已經(jīng)無可奈何了,想要完全通過代碼解決上訴所有問題已經(jīng)是不可能了,只能你選擇接受這個相對較弱的提示。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容