简单巡逻兵
游戏规则与游戏要求
游戏UML类图
新增了订阅与发布模式
游戏实现
巡逻兵部分
巡逻兵部分实现了进行矩形路线的自动巡逻移动,当玩家进入它的触发器范围后,如果玩家当前在自己巡逻区域内,则跟随追捕玩家。如果巡逻兵与玩家碰撞,则双方都播放碰撞后动画,游戏结束。
巡逻兵预制体
为巡逻兵添加两个Collider
,一个是Capsule Collider
,添加在预制体父节点上,用于检测巡逻兵与玩家的碰撞。另一个是Box Collider
,添加在预制体的子节点上,用于检测玩家进入巡逻兵巡逻的范围
巡逻兵创建
保存了巡逻兵的一些基本数据
public class PatrolData : MonoBehaviour
{
public int sign; //标志巡逻兵在哪一块区域
public bool follow_player = false; //是否跟随玩家
public int wall_sign = -1; //当前玩家所在区域标志
public GameObject player; //玩家游戏对象
public Vector3 start_position; //当前巡逻兵初始位置
}
道具工厂,创建了9个巡逻兵,因为巡逻兵的位置有规律所以用循环就可以赋值初始位置,还设置了每个巡逻兵所在区域的标志。当游戏结束时候,需要工厂将巡逻兵的动画设置为初始状态。部分代码如下
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, 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);
}
}
巡逻兵巡逻与追捕
巡逻兵巡逻的动作,根据四个方向来选择要去到的目的地,当当前位置与目的地相差0.9f的时候,换一个方向继续巡逻
public class GoPatrolAction : SSAction
{
private enum Dirction { EAST, NORTH, WEST, SOUTH };
private float pos_x, pos_z; //移动前的初始x和z方向坐标
private float move_length; //移动的长度
private float move_speed = 1.2f; //移动速度
private bool move_sign = true;