Unity3d游戏(七): 智能巡逻兵
智能巡逻兵
- 游戏设计要求:
- 创建一个地图和若干巡逻兵(使用动画);
- 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算;
- 巡逻兵碰撞到障碍物,则会自动选下一个点为目标;
- 巡逻兵在设定范围内感知到玩家,会自动追击玩家;
- 失去玩家目标后,继续巡逻;
- 计分:玩家每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束;
设计过程:
采用MVC架构,用工厂模式产生巡逻兵。
巡逻兵的设计:
巡逻兵的路径为一个3~5个边的凸多边形,需因此要一些数组来存放巡逻兵路径的相对位置:
if (sideNum == 3) {
posSet = new Vector3[] {new Vector3 (0, 0, 0), new Vector3 (8, 0, 0),
new Vector3 (4, 0, 6), new Vector3 (0, 0, 0)};
} else if (sideNum == 4) {
posSet = new Vector3[] {new Vector3 (0, 0, 0), new Vector3 (8, 0, 0),
new Vector3 (8, 0, 8), new Vector3 (0, 0, 8), new Vector3 (0, 0, 0)};
} else {
posSet = new Vector3[] {new Vector3 (0, 0, 0), new Vector3 (5, 0, 0),
new Vector3 (7, 0, 5), new Vector3 (3, 0, 8), new Vector3 (-2, 0, 5), new Vector3 (0, 0, 0)};
}
Patrol
的Update ()
方法来实现巡逻兵的动作
void Update () {
if (playerIsLive && inField (playerPos)) { //玩家存活并且在此巡逻兵视野中
catchPlayer (); //追击玩家
} else {
if (patrolInMap (currentSide)) { //否则沿着自己的路径巡逻
if (++currentSide >= sideNum) {
bothPos = transform.position;
currentSide = 0;
}
}
}
}
其中追击玩家以及巡逻的具体实现参考后面的代码Patrol.cs
设计的重点是使用发布订阅模式完成Player
、Patrol
、SceneController
以及ScoreManager
之间的通信。首先定义了一个抽象类Subject.cs(发布者)和一个接口Handle.cs(订阅者)。