京城游戏人-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
-