智能巡逻兵
-
游戏设计要求:
- 创建一个地图和若干巡逻兵(使用动画);
- 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算;
- 巡逻兵碰撞到障碍物,则会自动选下一个点为目标;
- 巡逻兵在设定范围内感知到玩家,会自动追击玩家;
- 失去玩家目标后,继续巡逻;
- 计分:玩家每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束;
-
程序设计要求:
- 必须使用订阅与发布模式传消息
- 工厂模式生产巡逻兵
构建场景
首先准备游戏资源,使用子迷宫预制来构建地图。
制作三个只有地板颜色不同的子迷宫预制,构建完整迷宫时交替使用。
构建地图添加五列子迷宫,每一列的延伸方向随机,如此可以构建出随机地图。相关代码如下:
public void LoadResources() {
Instantiate(Resources.Load("Prefabs/Light"));
Instantiate(Resources.Load("Prefabs/Entry"));
blood = Instantiate(Resources.Load("Prefabs/Blood"), new Vector3(40, 40, 40), Quaternion.identity) as GameObject;
role = Instantiate(Resources.Load("Prefabs/role")) as GameObject;
float pos_z = 0, pos_x;
int dir, sum = 0, size = 5;
GameObject maze, temp;
guardFactory gf = guardFactory.getInstance();
for (int i = 0; i < size; i++) {
dir = Random.Range(0, 2);
pos_x = i * 2.8f;
for (int j = 0; j <= i; j++, sum++) {
if (sum%3 == 0)
maze = Instantiate(Resources.Load("Prefabs/g_maze"), new Vector3(pos_x, 0, pos_z), Quaternion.identity) as GameObject;
else if (sum%3 == 1)
maze = Instantiate(Resources.Load("Prefabs/y_maze"), new Vector3(pos_x, 0, pos_z), Quaternion.identity) as GameObject;
else maze = Instantiate(Resources.Load("Prefabs/b_maze"), new Vector3(pos_x, 0, pos_z), Quaternion.identity) as GameObject;
temp = gf.getNewGuard(pos_x - 0.9f, 0, pos_z - 0.9f);