找回密码
 立即注册
查看: 363|回复: 0

Unity中,不继承MonoBehaviour的类使用Mono的相关功能

[复制链接]
发表于 2021-12-31 17:44 | 显示全部楼层 |阅读模式
实现一个单例MonoSys,外部调用它。
MonoSys自己维护一个MonoController。
using System;using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.SceneManagement;public class MonoController : MonoBehaviour{    public event Action ApplicationPauseEvent;    public event Action ApplicationQuitEvent;    public event Action UpdateEvent;    public event Action<Scene, LoadSceneMode> SceneChangedEvent;    private void OnEnable()    {        SceneManager.sceneLoaded += OnSceneLoaded;    }    private void OnDisable()    {        SceneManager.sceneLoaded -= OnSceneLoaded;    }    private void OnApplicationPause(bool pauseStatus)    {        if (pauseStatus)        {            ApplicationPauseEvent?.Invoke();        }    }    private void OnApplicationQuit()    {        ApplicationQuitEvent?.Invoke();    }    private void Update()    {        UpdateEvent?.Invoke();    }    private void OnSceneLoaded(Scene scene, LoadSceneMode mode)    {        SceneChangedEvent?.Invoke(scene, mode);    }}public class MonoSys{    private static MonoSys _instance;    public static MonoSys Instance    {        get        {            if (_instance == null)            {                _instance = new MonoSys();            }            return _instance;        }    }    private MonoController _monoController;    private MonoSys()    {        var parentGo = GameObject.Find("Singleton");        if (parentGo == null)        {            parentGo = new GameObject("Singleton");            UnityEngine.Object.DontDestroyOnLoad(parentGo);        }        GameObject go = new GameObject(nameof(MonoController));        go.transform.SetParent(parentGo.transform);        _monoController = go.AddComponent<MonoController>();    }    public Coroutine StartCoroutine(IEnumerator routine)    {        return _monoController.StartCoroutine(routine);    }    public void StopCoroutine(IEnumerator routine)    {        _monoController.StopCoroutine(routine);    }    public void AddApplicationQuitEvent(Action action)    {        _monoController.ApplicationQuitEvent += action;    }    public void RemoveApplicationQuitEvent(Action action)    {        _monoController.ApplicationQuitEvent -= action;    }    public void AddApplicationPauseEvent(Action action)    {        _monoController.ApplicationPauseEvent += action;    }    public void RemoveApplicationPauseEvent(Action action)    {        _monoController.ApplicationPauseEvent -= action;    }    public void AddUpdateEvent(Action action)    {        _monoController.UpdateEvent += action;    }    public void RemoveUpdateEvent(Action action)    {        _monoController.UpdateEvent -= action;    }    public void AddSceneChangedEvent(Action<Scene, LoadSceneMode> action)    {        _monoController.SceneChangedEvent += action;    }    public void RemoveSceneChangedEvent(Action<Scene, LoadSceneMode> action)    {        _monoController.SceneChangedEvent -= action;    }}
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 11:38 , Processed in 0.088335 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表