京城游戏人-Day2:一些 C# 与 Unity 基本常识

时间:2022-04-20 17:39:55

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

-