[框架] Unity 公共执行器

本篇我们通过使用单例模式来创建一个公共执行器,使得原本应该在Update()、FixedUpdate()中的指令都可以统一放在一个对象中执行,且可进行添加和移除操作。

1. 创建单例模式改造器:SingletonMono

我们先创建一个单例模式改造器,使得其它类想要使用单例模式都可以直接继承该类:

using UnityEngine;

public class SingletonMono<T> : MonoBehaviour where T : SingletonMono<T>
{
    public static T Instance;

    protected virtual void Awake()
    {
        if (Instance == null)
        {
            Instance = (T)this;
        }
        else
        {
            Destroy(gameObject);
        }
    }
}

2. 公共执行器:MonoManager

关于 PlayerInputControl 类的相关解释可参考文章:[步骤] 启用Unity全新输入系统

using System;
using UnityEngine;

public class MonoManager : SingletonMono<MonoManager>
{
    [HideInInspector] public PlayerInputControl input;

    private void OnEnable()
    {
        if (input == null)
            input = new PlayerInputControl();
        input.Enable();
    }

    private void OnDisable()
    {
        input?.Disable();
    }

    private Action updateAction;
    private Action lateUpdateAction;
    private Action fixedUpdateAction;

    public void AddUpdateListener(Action action)
    {
        updateAction += action;
    }

    public void RemoveUpdateListener(Action action)
    {
        updateAction -= action;
    }

    public void AddLateUpdateListener(Action action)
    {
        lateUpdateAction += action;
    }

    public void RemoveLateUpdateListener(Action action)
    {
        lateUpdateAction -= action;
    }

    public void AddFixedUpdateListener(Action action)
    {
        fixedUpdateAction += action;
    }

    public void RemoveFixedUpdateListener(Action action)
    {
        fixedUpdateAction -= action;
    }

    private void Update()
    {
        updateAction?.Invoke();
    }

    private void LateUpdate()
    {
        lateUpdateAction?.Invoke();
    }

    private void FixedUpdate()
    {
        fixedUpdateAction?.Invoke();
    }
}

 3. 测试:TestMonoManager

using System.Collections;
using UnityEngine;

public class TestMonoManager : MonoBehaviour
{
    Coroutine coroutine;

    private void Start()
    {
        MonoManager.Instance.AddUpdateListener(TestUpdate);
        MonoManager.Instance.AddFixedUpdateListener(TestFixedUpdate);
        MonoManager.Instance.AddFixedUpdateListener(TestLateUpdate);

        coroutine = MonoManager.Instance.StartCoroutine(TestCoroutine());
    }

    private void TestUpdate()
    {
        print("正在执行Update");
    }

    private void TestFixedUpdate()
    {
        print("正在执行FixedUpdate");
    }

    private void TestLateUpdate()
    {
        print("正在执行LateUpdate");
    }

    private IEnumerator TestCoroutine()
    {
        while (true)
        {

            yield return new WaitForSeconds(0.1f);
            print("正在执行TestCoroutine");
            // 当用户按下<移动键>则停止执行该协程
            if (MonoManager.Instance.input.Player.Move.ReadValue<Vector2>() != Vector2.zero)
            {
                MonoManager.Instance.StopCoroutine(coroutine);
            }
        }
    }

}

相关推荐

  1. [框架] Unity 公共执行

    2024-05-12 02:18:05       31 阅读
  2. Unity音频管理

    2024-05-12 02:18:05       62 阅读
  3. unity C#执行bat文件

    2024-05-12 02:18:05       25 阅读
  4. Unity自定义框架开发

    2024-05-12 02:18:05       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-12 02:18:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-12 02:18:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-12 02:18:05       87 阅读
  4. Python语言-面向对象

    2024-05-12 02:18:05       96 阅读

热门阅读

  1. C++ 模板

    2024-05-12 02:18:05       39 阅读
  2. 数据库查询--条件查询

    2024-05-12 02:18:05       35 阅读
  3. Linux 网络时间校准

    2024-05-12 02:18:05       39 阅读
  4. 零基础入门篇①③ Python可变序列类型--列表

    2024-05-12 02:18:05       32 阅读
  5. 单例模式如何实现?

    2024-05-12 02:18:05       33 阅读
  6. 查看iqn编码

    2024-05-12 02:18:05       27 阅读
  7. python-pytorch seq2seq+attention笔记0.5.00

    2024-05-12 02:18:05       30 阅读
  8. ECS中播放 Animator 动画和控制Gameobject 显示状态

    2024-05-12 02:18:05       28 阅读
  9. Git那些事-如何撤销暂存区的文件

    2024-05-12 02:18:05       29 阅读
  10. linux c++获取当前程序的运行路径

    2024-05-12 02:18:05       34 阅读
  11. 【找最长重复子串长度】

    2024-05-12 02:18:05       34 阅读