智能巡逻兵
作业目标
智能巡逻兵:
- 提交要求:
- 游戏设计要求:
- 创建一个地图和若干巡逻兵(使用动画);
- 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算;
- 巡逻兵碰撞到障碍物,则会自动选下一个点为目标;
- 巡逻兵在设定范围内感知到玩家,会自动追击玩家;
- 失去玩家目标后,继续巡逻;
- 计分:玩家每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束;
- 程序设计要求:
- 必须使用订阅与发布模式传消息
- subject:OnLostGoal
- Publisher: ?
- Subscriber: ?
- 工厂模式生产巡逻兵
- 必须使用订阅与发布模式传消息
- 友善提示1:生成 3~5个边的凸多边型
- 随机生成矩形
- 在矩形每个边上随机找点,可得到 3 - 4 的凸多边型
- 5 ?
- 友善提示2:参考以前博客,给出自己新玩法
游戏规则
- 使用wsad或者方向键控制玩家上下左右移动;
- 当玩家靠近巡逻兵一定距离时,巡逻兵会主动追击玩家;
- 若玩家摆脱巡逻兵,加一分;
- 若巡逻兵碰撞到玩家时,玩家死亡,游戏结束;
游戏设计
1、UML类图
2、游戏预制
游戏预制中的玩家和巡逻兵都是我从资源商店中找的免费资源。
- 玩家:一只红皮独眼的小怪兽
- 巡逻兵:一只背壳带刺的独眼小怪兽
- 地图:由四面墙合围而成的封闭地图,其中有9个区域,各区域之间用栅栏隔开。
3、游戏动画机制作
动画机之中的各个状态都是随游戏对象一起从资源商店获得的,在制作动画时将需要的动画拖到界面中然后配上一定的条件即可。
- 玩家动画:
- 巡逻兵动画:
4、相关代码
大部分代码与之前的游戏设计大同小异,架构差不多。这次的主要不同之处在于碰撞通知。
4.1 巡逻兵工厂
巡逻兵工厂对巡逻兵进行实例化,设定好了巡逻兵的初始位置。
public class PropFactory : MonoBehaviour {
private GameObject patrol = null;
private List<GameObject> used = new List<GameObject> ();
private Vector3[] vec = new Vector3[9];
public FirstSceneController sceneControler;
public List<GameObject> GetPatrols () {
int[] pos_x = {
-6, 4, 13 };
int[] pos_z = {
-4, 6, -13 };
int index = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
vec[index] = new Vector3 (pos_x[i], 0.5f, pos_z[j]);
index++;
}
}
for (int i = 0; i < 9; i++) {
patrol = Instantiate (Resources.Load<GameObject> ("Prefabs/Patrol"));
patrol.transform.position = vec[i];
patrol.GetComponent<PatrolData> ().sign = i + 1;
patrol.GetComponent<PatrolData> ().start_position = vec[i];
used.Add (patrol);
}
return used;
}
public void StopPatrol () {
for (int i = 0; i < used.Count; i++) {
used[i].gameObject.GetComponent<Animator> ().SetBool ("run", false);
}
}
}
4.2 场景控制器
场景控制器FirstSceneController继承了接口IUserAction和ISceneController,并对其声明的函数进行实现。
场景控制器是订阅与发布模式中的订阅者,可以将自身相应事件处理函数提交给消息处理器,在相应事件发生时自动调用。
public class FirstSceneController : MonoBehaviour, IUserAction, ISceneController {
public PropFactory patrol_factory;
public ScoreRecorder recorder;
public PatrolActionManager action_manager;
public int wall_sign = -1;
public GameObject player;
public Camera main_camera;
public float player_speed = 5;
private List<GameObject> patrols;
private bool game_over = false;
void Update () {
for (int i = 0; i < patrols.Count; i++