1.使用目的
为了使不继承MonoBehaviour的类也可以使用Update、协程等
2.主要思路
Update实现: 创建一个继承自MonoBehaviour的mono类,定义一个Event,在Update里面调用这个Event,给外部提供添加委托的函数(+=),这样添加的函数就可以在mono类中的Update进行帧更新了。
封装成“单例”:但上面这样做并不能保证只能实例化一次,为了保证只能实例化一次mono,我们需要再新建一个MonoManager类继承自单例模式,在内部声明一个私有的mono成员变量,在MonoManager的构造函数中创建一个空物体,将mono类挂载(AddComponent)到该空物体上面,赋值给内部成员变量mono,这样,由于MonoManager为单例,构造函数只被调用一次,保证了mono也只被实例化一次。
协程:在MonoManager中向外部提供一个public函数,然后在函数内部调用成员变量mono的开启携程函数、关闭携程函数等方法,因为mono是继承自MonoBehaviour,所以自然携带这些方法。
3.代码
3.1.继承自MonoBehavior的mono负责提供MonoBehavior方法:
public class Mono : MonoBehaviour
{
private void Start()
{
DontDestroyOnLoad(this.gameObject);
}
private event UnityAction UpdateEvent;
void Update()
{
if(UpdateEvent != null)
{
UpdateEvent();
}
}
public void AddUpdateAction(UnityAction action)
{
UpdateEvent += action;
}
public void RemoveUpdateAction(UnityAction action)
{
UpdateEvent -= action;
}
}
3.2.继承自单例的MonoManager负责封装mono使其只实例化一次,通过调用Mono的携带的方法使外部未继承MonoBehavior的方法能够使用Update、协程:
/// <summary>
/// 通过调用Mono所拥有的MonoBehavior为外部提供Update、协程等(将mono做成“单例”)
/// </summary>
public class MonoManager : SingeCaseBase<MonoManager>
{
private Mono mono;
/// <summary>
/// [注意]构造MonoManager:实例化一个mono,因为此处MonoManager为单例,保证了Mono只有一次实例
/// </summary>
public MonoManager()
{
GameObject MonoHolder = new GameObject("MonoHolder");
mono = MonoHolder.AddComponent<Mono>();
}
public void AddUpdateAction(UnityAction action)
{
if (mono)
{
mono.AddUpdateAction(action);
}
}
public void RemoveUpdateAction(UnityAction action)
{
if(mono)
{
mono.RemoveUpdateAction(action);
}
}
public Coroutine StartCoroutine(string methodName)
{
return mono.StartCoroutine(methodName);
}
public void StopCoroutine(IEnumerator routine)
{
mono.StopCoroutine(routine);
}
public Coroutine StartCoroutine(IEnumerator routine)
{
return mono.StartCoroutine(routine);
}
}
3.测试
class TestAgain
{
public TestAgain()
{
MonoManager.GetInstance().AddUpdateAction(TestMethod);
}
void TestMethod()
{
Debug.Log("Test Working!");
}
}
public class Test : MonoBehaviour
{
private void Start()
{
TestAgain test = new TestAgain();
}
}
结果截图:

16万+

被折叠的 条评论
为什么被折叠?



