文章目录
牧师与魔鬼 动作分离版
- 【2019新要求】:设计一个裁判类,当游戏达到结束条件时,通知场景控制器游戏结束
实现过程
什么是动作分离版呢?还记得我们上个版本的牧师与魔鬼为了实现character与boat的移动,实现了一个Moveable的脚本,并把此脚本作为组件加到character与boat上了。然而这样的实现方法是不完全符合MVC的分离的,动作的控制应该交由Control模块管理,而不是在Model模块中。所以这次为了实现动作分离版,我们实现一个Action模块,专门管理Model的动作,实际使用上与Moveable差别不大。为了有个更清晰的理解,先来看一下UML图
Action模块
- ISSActionCallback(动作事件接口)
这是一个接口,用以实现callback。也就是当某个动作完成之后,使用callback回调到调用此函数的类中实现的此接口的函数,如SSActionEvent中。
public enum SSActionEventType : int { Started, Competeted }
public interface ISSActionCallback
{
void SSActionEvent(SSAction source, SSActionEventType events = SSActionEventType.Competeted,
int intParam = 0, string strParam = null, Object objectParam = null);
}
- SSAction (动作基类)
这是所有动作的基类,所有动作继承该类以实现各种动作以及组合动作。ScriptableObject 是不需要绑定 GameObject 对象的可编程基类,这些对象受 Unity 引擎场景管理。这个类更关键的是利用接口(ISSACtionCallback)实现消息通知,避免了与动作管理者直接依赖。
public class SSAction : ScriptableObject //动作
{
public bool enable = true; //是否正在进行此动作
public bool destroy = false; //是否需要被销毁
public GameObject gameobject { get; set; } //动作对象
public Transform transform { get; set; } //动作对象的transform
public ISSActionCallback callback { get; set; } //回调函数
protected SSAction() { } //保证SSAction不会被new
public virtual void Start() //子类可以使用这两个函数
{
throw new System.NotImplementedException();
}
public virtual void Update()
{
throw new System.NotImplementedException();
}
}
- SequenceAction(组合动作实现)
该类继承了SSAction类,实现多个单动作的组合成一个动作,组合动作同时也是一个动作。该类利用一个List管理多个动作,并在接口方法中实现了动作的执行顺序。
public class SequenceA