Unity3D 从入门到放弃(六)
—–巡逻兵
2017.5.9修改:修改了UML图。
作业需求
游戏规则:
- 创建一个地图和若干巡逻兵;
- 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次
确定下一个目标位置,用自己当前位置为原点计算;- 巡逻兵碰撞到障碍物如树,则会自动选下一个点为目标;
- 巡逻兵在设定范围内感知到玩家,会自动追击玩家;
- 失去玩家目标后,继续巡逻;
- 计分:每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束;
先上UML图:
做完后的游戏动画:
(这游戏真难玩)
PS:源码在GitHub上,链接如下:
下面说一下我遇到的一些问题。
游戏制作过程:
实例化部分:
本次我运用到了两个外部实例Ami和King,这两个实例可以在我源码中下载。
两个实例的动作控制如下:
其中Speed属性判断动作,toDie触发器触发死亡。
将两个预设加上刚体(虽然没用上物理学),和胶囊触发器, 设置触发器的大小即可。
地板和墙用plane和cube实现即可。
动作部分:
动作部分分为巡逻兵UI和主角控制两个动作,分别在两个脚本实现,最后挂在到预设中。
巡逻兵:
首先,需要实现巡逻兵的三个动作:静止,走路,追击(主角)
我用三个继承SSSAction的基类分别实现它们,通过改Animator中的Speed实现动画切换。
public class IdleAction : SSAction
{
private float time;
private Animator ani;
// 站立持续时间
public static IdleAction GetIdleAction(float time, Animator ani)
{
IdleAction currentAction = ScriptableObject.CreateInstance<IdleAction>();
currentAction.time = time;
currentAction.ani = ani;
return currentAction;
}
public override void Start()
{
ani.SetFloat("Speed", 0);
// 进入站立状态
}
public override void Update()
{
if (time == -1) return;
// 永久站立
time -= Time.deltaTime;
// 减去时间
if (time < 0)
{
this.destory = true;
this.callbac