京城遊戲人-Day2:一些 C# 與 Unity 基本常識
-
這文關於 C#、Unity、GDGeek 的一些基本常識,主要得益於 GDGeek 的視頻內容。
-
1. C# 數組
一維數組的初始化
int[] arrayA = new int[3];
int[] arrayB = new int[] {1, 2, 3};
int[] arrayC = {1, 2, 3};
二維數組的初始化
int[,] array2A = new int[2, 3];
int[,] array2B = new int[] { {1, 2, 3}, {4, 5, 6} };
int[,] array2C = { {1, 2, 3}, {4, 5, 6} };
讀取數組的某個值
Debug.Log(arrayA[2]);
Debug.Log(array2A[1, 2]);
修改數組的某個值
arrayA[2] = 3;
array2A[1, 2] = 4;
獲取數組長度
// 一維數組的長度
Debug.Log(arrayA.Length);
// 二維數組的裏面一層的長度
Debug.Log(array2A[0].Length);
// 一維數組的長度
Debug.Log(array2A.Length);
2. 初始化一個成員變量
一般方式
public int number = 0;
set 與 get
比如如下一個 set 寫法:
public int number {
set {
_number.text = value.toString();
}
}
使用的時候就是:
number = 123;
3. 幾個 Unity 的方法
MonoBehaviour 類的 GetComponentsInChildren 方法
獲取當前 GameObject 的所有 Text 子節點:
this.GetComponentsInChildren<Text>();
設置隱藏或顯示一個節點
this.gameObject.SetActive(false); // 隱藏
this.gameObject.SetActive(true); // 顯示
在 Unity 的 Console 打印調試日誌
Debug.Log("this is a log");
4. GDGeek 的幾個好用的腳本
FSM 有限狀態機
FSM = Finite State Machine,下面是一個例子。
FSM fsm = new FSM();
fsm.addState("begin", beginState());
fsm.addState("play", playState());
fsm.addState("end", endState());
fsm.init("play");
State beginState() {
StateWithEventMap state = new StateWithEventMap();
state.onStart += delegate {
_view.begin.gameObject.SetActive(true); // 開始時顯示
}
state.onOver += delegate {
_view.begin.gameObject.SetActive(false); // 結束時隱藏
}
state.addEvent("begin", "play");
return state;
}
State playState() {
StateWithEventMap state = new StateWithEventMap();
state.onStart += delegate {
_view.begin.gameObject.SetActive(true);
// ...
}
state.onOver += delegate {
_view.begin.gameObject.SetActive(false);
// ...
}
state.addEvent("play", "end");
return state;
}
State endState{} {
StateWithEventMap state = new StateWithEventMap();
state.onStart += delegate {
_view.end.gameObject.SetActive(true);
}
state.onOver += delegate {
_view.end.gameObject.SetActive(false);
}
state.addEvent("end", "begin");
return state;
}
fsm.post("play");
OffsetUI
對於 OffsetUI,GDGeek 推薦的用法是:
- 把 OffsetUI 腳本加到一個 empty object 上(叫做 Offset)。
- 把 UI 的對象作爲這個 empty object 的子節點。
其實 OffsetUI 的源碼只有幾十行,可以讀讀。
Task
先看一個函數的定義:
public static StateWithEventMap Create(TaskFactory creator, FSM fsm, string nextState);
比如我們要做一個 10 秒後執行 FSM 狀態切換的小功能:
StateWithEventMap state = TaskState.Create( delegate {
TaskWait tw = new TaskWait();
tw.setAllTime(3f);
return tw;
}, _fsm, "stateX" );
_fsm.addState("stateX", state);
另外要注意的一點:使用 Task 的話,要在 Hierachy 中添加一個 TaskManager(加到根層次即可)。
5. Unity UI 的幾個常用組件
Text
Width、Height、文字內容、字號要在 Inspector 中設置。
Button
裏面套了一層 Text。注意區分 Button 和內層 Text 的尺寸設置。
特別注意:用 Button 的時候,要給 Button 添加 OnClick 對應的函數和參數值。
Panel
加上 UI 組件後,會發現系統自動添加了 Canvas、EventSystem,而且你所添加的 UI 組件一定是在 Canvas 下面的。暫時先別惹他們。
6. Layout Group
可以給包含 Children 的 object 添加 layout group:
- Horizontal Layout Group
- Vertical Layout Group
- Grid Layout Group
-