更新於 2022/05/01閱讀時間約 1 分鐘

Unity C# | 結構(Struct)及應用

前言

  本文章將會介紹結構(Struct)的定義、簡單介紹其應用,並且補充與序列化(SerializeFile)結合的方式,在撰寫這篇文章之前,我以為寫過Struct文章,準備撰寫一篇文章關於結構與序列化的結合。

結構(Struct)

  結構(Struct)是封裝的做法之一,可以儲存變數欄位後多次使用,常用於道具或怪物清單,可以封裝將重覆使用的宣告,並用簡短的程式碼達成同樣的動作。
圖片來源:我獨立製作的專案
圖片來源:我獨立製作的專案
  創建完Sturct之後,只需要短短幾行程式就能宣告變數,上面這個畫面看似宣告了六次,實際上只有短短兩行程式。
    [SerializeField]
    private s_BottlePileSprite Pile3;
    [SerializeField]
    private s_BottlePileSprite Pile5;
  我今天要說的部份主要是上面介紹的這些,不過似乎還可以做簡單的運算及使用,未來如果有使用到,再更新這篇文章,想細看更多的內容,可以參考下方從官網截下來的程式碼,或是前往官方細看。
public struct Coords
{  
  public Coords(double x, double y)    
  {       
    X = x; 
    Y = y;   
  }     
  public double X { get; }    
  public double Y { get; }   

  public override string ToString() => $"({X}, {Y})"; 
}

宣告
  Struct類似Class,是一種封裝的方式,在查詢Struct時,我有去查詢Class的內容,譬如Class是封裝函式,那麼Struct就是封裝變數,它的宣告方法如下。
private struct 結構名稱(ex. s_Item)
{
  public int ItemID;
  public String ItemIntroduce;
  public bool ItemUsed;
  ...
}
  當結構(Struct)宣告後,裡面的變數都是空物件,也只能是空物件。

使用
  Struct的使用相當簡單,就是一行程式碼,有點像是用C#告訴電腦「我要使用XX結構,然後它叫OO」,類似「我要買個鉛筆盒,然後它叫阿明的百寶袋」 (話說現在還有人會幫自己的物品命名嗎?XD)
private 結構名稱(ex. s_Item) Item_1;

應用:重覆物件

  遊戲中使用的重覆物件相當多,其中有兩種常用的應用方式,其中一種就是如同上述使用的方式,不停的宣告即可。
private 結構名稱(ex. s_Item) Item_1;
private 結構名稱(ex. s_Item) Item_2;
private 結構名稱(ex. s_Item) Item_3;
private 結構名稱(ex. s_Item) Item_4;
private 結構名稱(ex. s_Item) Item_5;
...
  不過,假設重覆的次數非常非常多,像是Rouge like類型的遊戲,可能包含千多種道具,這樣重覆宣告的性價比太低,可以使用陣列Array。
private 結構名稱(ex. s_Item)[] Items = new 結構名稱(ex. s_Item)[100];

//陣列(Array)宣告補充
int[] a = new int[5]
資料型別[] 陣列名稱 = new 資料型別[陣列大小]

補充:結構(Struct)與序列化(SerializeFiled)結合

  序列化是程式設計中很重要的一個觀念,主要是希望程式員不要大量宣告公有變數,讓程式保持乾淨,不要有太多可以隨便使用的變數,保持好封裝,在使用Struct的時候,我很常序列化出問題,所以我總結了一下序列化的使用。
我拿我自己的專案來介紹。
[System.Serializable]//這一行要用Serializable
private struct s_BottlePileSprite
    {
        public Sprite Normal;
        public Sprite Heightlight;
        public Sprite Pressed;
    }
口訣是「外面要私有,裡面要公有」
  照序列化的理論來說,應該是把非公用的變數與函式通通私有化,也就是長下面這樣。
[System.Serializable]
    private struct s_BottlePileSprite
    {
        [SerializeField]
        private Sprite Normal;
        [SerializeField]
        private Sprite Heightlight;
        [SerializeField]
        private Sprite Pressed;
    }
  它看起來沒問題,在Unity中甚至會正常顯示,不過,你完全沒辦法在程式中呼叫它,也就是可以呼叫下列程式中的Pile3,但內容物根本無法使用,會因為保護層級被擋下來。
private s_BottlePileSprite Pile3;

結語:

  Struct可以不使用,但在追求簡潔、易懂、好閱讀的程式時,會常常需要使用的一種方法,而且使用前通常會思考,怎麼規劃、怎麼使用,在搜尋Struct的介紹或教學時,能連結到很多值得學習的觀念和內容。
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.