京城遊戲人-Day2:一些 C# 與 Unity 基本常識

京城遊戲人-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

-

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章