기능 : MonoBehaviour를 상속하지 않는 클래스를 활성화하여 코루틴을 시작하고, FixUpdate, Update 및 LateUpdate를 사용하여 각 프레임을 업데이트합니다.
원칙:
1. 장면에서 MonoBehaviour를 상속하는 "실행자" 스크립트를 만듭니다. 이 스크립트는 특히 코루틴을 시작하고 프레임 업데이트를 모니터링하는 데 사용됩니다.
2. Mono 관리자는 원하는 효과를 얻기 위해 이 "실행자" 스크립트에 액세스합니다.
빈 개체를 만들고 MonoBehaviour에서 상속된 스크립트를 마운트합니다(어떤 메서드 없이도 가능).
상속이 없는 스크립트 코드는 다음과 같이 작성됩니다.
public void Show()
{
GameObject go = GameObject.Find("MonoController");
go.AddComponent<MonoController>().StartCoroutine(MyCoroutine());
}
IEnumerator MyCoroutine()
{
while (true)
{
Debug.Log("协程执行中");
yield return null;
}
}
당신은 그것을 호출할 수 있습니다
Mono 관리자가 코루틴을 시작합니다.
public class MonoController : MonoBehaviour
{
}
MonoManager 관리 클래스는 장면 객체를 자동으로 생성하고 Mono를 상속하는 스크립트를 마운트합니다.
SingletonPatternBase를 상속하고 싱글톤으로 존재합니다.
public class MonoManager : SingletonPatternBase<MonoManager>
{
private MonoManager() { }
private MonoController monoController;
public MonoController MonoController
{
get
{
if (monoController == null)
{
GameObject go = new GameObject(typeof(MonoController).Name);
monoController = go.AddComponent<MonoController>();
}
return monoController;
}
}
//一个专门让外部用来开启协程的方法
public Coroutine StartCoroutine(IEnumerator routine)
{
return MonoController.StartCoroutine(routine);
}
Mono 관리자가 코루틴을 중지합니다.
//停止协程的方法
public void StopCoroutine(IEnumerator routine)
{
MonoController.StopCoroutine(routine);
}
//停止协程的方法 重载
public void StopCoroutine(Coroutine coroutine)
{
MonoController.StopCoroutine(coroutine);
}
//停止所有协程的方法
public void StopAllCoroutine()
{
MonoController.StopAllCoroutines();
}
public class Player
{
Coroutine coroutine;
public void Show()
{
coroutine = MonoManager.Instance.StartCoroutine(MyCoroutine());
}
public void Hide()
{
MonoManager.Instance.StopCoroutine(coroutine);
}
public void HideAll()
{
MonoManager.Instance.StopAllCoroutine();
}
MonoManager.Instance.xxx 메서드는 특정 스크립트에서 직접 실행할 수 있습니다.
코루틴을 중지하는 방법에 주목하세요! ! !
모노 관리자 업데이트 이벤트 수신
대리자 이벤트를 사용하여 실행 메서드 전달
실행자 스크립트
/// <summary>
/// 执行者脚本。其他脚本可以通过它来开启停止协程,也可以通过它来监听Update,FixedUpdate。LateUpdate
/// </summary>
public class MonoController : MonoBehaviour
{
//在生命周期方法中执行的时间
event UnityAction updateEvent;
private void Update()
{
updateEvent?.Invoke();
}
public void AddUpdateListener(UnityAction call)
{
updateEvent += call;
}
public void RemoveUpdateListener(UnityAction call)
{
updateEvent -= call;
}
public void RemoveAllUPdateListeners()
{
updateEvent = null;
}
관리자 스크립트
//添加Update事件
public void AddUpdateListener(UnityAction call)
{
monoController.AddUpdateListener(call);
}
//移除Update事件
public void RemoveUpdateListener(UnityAction call)
{
monoController.RemoveUpdateListener(call);
}
//移除所有Update事件
public void RemoveAllUPdateListeners()
{
monoController.RemoveAllUPdateListeners();
}
실행해야 하는 특정 메소드의 스크립트가 위임 스크립트를 전달합니다.
public void PrintUpdate()
{ //添加可以添加Lambda 表达式,但是无法从委托列表中删掉这个Lambda表达式
//所以一般不是很简单的逻辑不建议使用lambda表达式
//可以声明为一个专门的方法然后添加进去
//lambd 表达式
MonoManager.Instance.AddUpdateListener(() =>
{
Debug.Log("Update");
});
}
public void StopPrintUpdate()
{
//这个方法是无效的,无法成功删除
//lambd 表达式
MonoManager.Instance.RemoveUpdateListener(() =>
{
Debug.Log("Update");
});
}
public void StopAllPrintUpdate()
{
MonoManager.Instance.RemoveAllUPdateListeners();
}
Mono 관리자 최적화: 중첩 클래스
매우 간단합니다. MonoController를 MonoManager에 선언하기만 하면 됩니다. 추가 작업은 수행되지 않습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class MonoManager : SingletonPatternBase<MonoManager>
{
private MonoManager() { }
private MonoController monoExecuter;
public MonoController MonoExecuter
{
get
{
if (monoExecuter == null)
{
GameObject go = new GameObject(typeof(MonoController).Name);
monoExecuter = go.AddComponent<MonoController>();
}
return monoExecuter;
}
}
//一个专门让外部用来开启协程的方法
public Coroutine StartCoroutine(IEnumerator routine)
{
return MonoExecuter.StartCoroutine(routine);
}
//停止协程的方法
public void StopCoroutine(IEnumerator routine)
{
if (routine != null)
{
MonoExecuter.StopCoroutine(routine);
}
}
//停止协程的方法 重载
public void StopCoroutine(Coroutine coroutine)
{
if (coroutine != null)
{
MonoExecuter.StopCoroutine(coroutine);
}
}
//停止所有协程的方法
public void StopAllCoroutine()
{
MonoExecuter.StopAllCoroutines();
}
//添加Update事件
public void AddUpdateListener(UnityAction call)
{
monoExecuter.AddUpdateListener(call);
}
//移除Update事件
public void RemoveUpdateListener(UnityAction call)
{
monoExecuter.RemoveUpdateListener(call);
}
//移除所有Update事件
public void RemoveAllUPdateListeners()
{
monoExecuter.RemoveAllUPdateListeners();
}
/// <summary>
/// 执行者脚本。其他脚本可以通过它来开启停止协程,也可以通过它来监听Update,FixedUpdate。LateUpdate
/// </summary>
public class MonoController : MonoBehaviour
{
//在生命周期方法Update中执行的事件
event UnityAction updateEvent;
//在生命周期方法FixUpdate中执行的事件
event UnityAction fixUpdateEvent;
private void FixedUpdate()
{
fixUpdateEvent?.Invoke();
}
private void Update()
{
updateEvent?.Invoke();
}
public void AddUpdateListener(UnityAction call)
{
updateEvent += call;
}
public void RemoveUpdateListener(UnityAction call)
{
if (updateEvent != null)
{
updateEvent -= call;
}
}
public void RemoveAllUPdateListeners()
{
updateEvent = null;
}
public void AddFixUpdateListener(UnityAction call)
{
fixUpdateEvent += call;
}
public void RemoveFixUpdateListener(UnityAction call)
{
if (fixUpdateEvent != null)
{
fixUpdateEvent -= call;
}
}
public void RemoveAllFixUpdateListeners()
{
fixUpdateEvent = null;
}
}
}