在多人合作的时候,为避免一个物体被多份代码共同控制产生不可描述的bug,我们往往需要写一系列控制类来控制场景中的物体的各种行为
比如场景加载,动画播放,人物行为等等等
这种时候,如果我们不对这些类进行统一管理就可能造成分工不明确,代码重复,沟通困难等问题
所以,我们需要一种模式对这些代码进行统一的管理,方便我们的程序开发
首先,我们当然需要一个继承子mono的类挂载到物体上并作为总的管理类。
不扯,直接上代码
public static GameKernel _instance;//将他做成单例方便其他类进行调用
//定义委托事件
public delegate void OnStart();
public event OnStart onStart;
public delegate void OnUpdate();
public event OnUpdate onUpdate;
//定义各种子管理类
public VoiceManager voiceManager ;
public PlayerManager playerManager ;
public PaperManager paperManager ;
public ItemManager itemManager ;
public InputManager inputManager;
void Awake()
{
_instance = this;
//将子管理类实例化
voiceManager = new VoiceManager();
playerManager = new PlayerManager();
paperManager = new PaperManager();
itemManager = new ItemManager();
inputManager = new InputManager();
}
void Start()
{
onStart();//触发start事件
}
void Update()
{
onUpdate();//触发udate事件
}
看到这里可能大家会很疑惑,你明明没有将事件注册上去,怎么可能调用
没错,为了节省代码量并提高代码复用性
我们需要给子管理类定义一个Manager父类,并在这个父类里面进行统一的注册,没错,注册代码只需要写一遍
using UnityEngine;
using System.Collections;
public class Manager{
//构造函数,在类被实例化时调用
public Manager()
{
GameKernel._instance.onStart += this.OnStart;
GameKernel._instance.onUpdate += this.OnUpdate;
}
//虚函数,供其他子管理类继承
public virtual void OnStart()
{
}
public virtual void OnUpdate()
{
}
public virtual void OnDestory()
{
}
}
然后就是我们的普通的子管理类了
这里由于代码是重复的,所以只贴PlayerManager的
using UnityEngine;
using System.Collections;
//继承自Manager类
public class PlayerManager : Manager {
//由于基础关系,在实例化对象时会自动调用Manager的构造函数注册委托事件
public override void OnStart()
{
base.OnStart();
}
public override void OnUpdate()
{
base.OnUpdate();
}
public override void OnDestory()
{
base.OnDestory();
}
}