当前位置: 首页 > news >正文

[框架] 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);}}}}

http://www.lryc.cn/news/347311.html

相关文章:

  • 二进制转为HEX数组小工具
  • 数据结构-二叉树-红黑树
  • C++11 新特性 decltype 说明符
  • java线程局部变量使用方式
  • 【隧道篇 / WAN优化】(7.4) ❀ 01. 启动WAN优化 ❀ FortiGate 防火墙
  • 2024数维杯数学建模B题生物质和煤共热解问题的研究原创论文分享
  • 中国电子学会(CEIT)2022年12月真题C语言软件编程等级考试三级(含详细解析答案)
  • 今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 5月12日,星期日
  • 微服务思想以及实现
  • C语法:格式符号%f和%lf引发的错误
  • Java基础入门day48
  • C++笔记(体系结构与内核分析)
  • c++ 唤醒指定线程
  • java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条
  • AI图书推荐:利用生成式AI实现业务流程超自动化
  • 什么事防抖和节流,有什么区别,如何实现
  • PanguSync大数据量初始化脚本
  • DELL T630服务器iDRAC分辨率调整办法
  • 您真的会高效使用 Mac 吗?
  • Vue11 Vue3完结撒花
  • CodeTop 高频笔试题总结(持续更新)
  • 类和对象一(从封装开始讲述)
  • LeetCode100题总结
  • 基于截断傅里叶级数展开的抖动波形生成
  • 图片标注编辑平台搭建系列教程(9)——支持撤销的画线行为
  • 赶紧收藏!2024 年最常见 100道 Java 基础面试题(四十一)
  • 使用自关联方法处理多表关系
  • annaconda详细解读换源文件
  • AI大模型系列:编写高质量提示(prompt)的实践技巧
  • 汽车EDI:安通林Antolin EDI 项目案例