前言
本文章將會介紹結構(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的介紹或教學時,能連結到很多值得學習的觀念和內容。