首页 > 其他分享 >Unity_U_OP1 ScriptableObject 替代单例

Unity_U_OP1 ScriptableObject 替代单例

时间:2023-12-28 17:45:16浏览次数:19  
标签:ScriptableObject OP1 void Unity OnEventRaised 事件 单例 public

核心思想:解耦GameManager单例模式,不再由一个单例管理所有事件触发,拆分成无数个小单例,各自管理

优点:

  1. 更加灵活的事件管理模式
  2. 复用性高,对于相关类型的事件,只需要写一遍代码,剩下的拖拖拖就可以实现相同的功能。

缺点:

  1. 管理起来相对麻烦
  2. 不利于维护,除非对这个系统非常了解,要不然排查起来难度系数较高

下图为主要逻辑
image-20231228163319372

这里主要需要实现两个部分的内容,一个是ScriptableObject ,另一个是事件的监听部分。

Part1. ScriptableObject 部分

[CreateAssetMenu(fileName = "SceneManager", menuName = "Event/SceneManger")]
public class SceneManagerSO : ScriptableObject
{
    //事件系统,用于监听者注册
    public event UnityAction OnEventRaised;
    
    //资源,场景等等,这里可以添加组件用于处理
    [SerializeField] public AssetReference NextScene;
    
    //invoke操作
    public void RaiseEvent(bool value)
    {
        if (OnEventRaised != null)
            OnEventRaised.Invoke();
    }
}

Part2.Listener部分

public class ListenerSceneChanged : MonoBehaviour
{
    [SerializeField]
    private SceneManagerSO _sceneManager;

	//事件注册需要放在onEnable()里面,优先于Start被调用
    private void OnEnable()
    {
        _sceneManager.OnEventRaised += OnSceneChanged;
    }

    private void OnDisable()
    {
        _sceneManager.OnEventRaised -= OnSceneChanged;
    }

    //监听执行函数
    private void OnSceneChanged()
    {
        _sceneManager.NextScene.LoadSceneAsync().Completed+= ((handle) =>
        {
            Debug.Log($"{handle.Result}");
        });
    }

}

触发操作不需要单独写脚本,也可以写,本样例是点击Button切换场景,用Button自带的事件即可
image

  • 事件绑定的是ScriptableObject模块的invoke方法,这样就可以触发监听者执行对应事件

标签:ScriptableObject,OP1,void,Unity,OnEventRaised,事件,单例,public
From: https://www.cnblogs.com/jobshenlei/p/17933217.html

相关文章

  • Maya与Unity模型尺度统一
    Maya与Unity模型尺度统一Maya建模默认使用的单位是cm,Unity使用的是m,有时候可能需要把Maya中建好的模型导入到Unity中,因此这篇文章介绍如何修改Maya的默认建模单位,从而使得二者的尺度统一。进入窗口,设置,首选项。修改为m......
  • Unity引擎2D游戏开发,敌人追击状态的转换
    思路:从敌人的位置发射一道射线或者一片区域来对玩家实体进行检测,如果检测倒玩家,则进行追击进攻利用BoxCast()即可实现BoxCast()官方文档:https://docs.unity3d.com/cn/2022.3/ScriptReference/Physics2D.BoxCast.html创建检测区域由于BoxCast需要众多参数,所以在Enemy中创建......
  • Unity3D 如何提升游戏运行效率详解
    前言Unity3D是一款非常强大的游戏引擎,但是在处理复杂场景和大量资源时,游戏运行效率可能会遇到一些问题。本文将详细介绍如何提升Unity3D游戏的运行效率,包括技术详解和代码实现。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀使用合适的资源压缩......
  • Unity3D Shader在GPU上是如何执行的详解
    Unity3D是一款广泛应用于游戏开发的跨平台开发引擎,它提供了丰富的功能和工具来帮助开发者创建高质量的游戏。其中一个重要的功能就是Shader,它可以用来控制对象的渲染效果。在Unity3D中,Shader是在GPU上执行的,那么它是如何工作的呢?本文将详细解释Unity3DShader在GPU上的执行过程,并......
  • Unity3D Shader Compute Shader基于GPU的并发计算详解
    在游戏开发中,计算密集型的任务通常需要耗费大量的CPU资源,这可能导致游戏性能下降,影响玩家的游戏体验。为了解决这个问题,Unity3D引入了ShaderComputeShader技术,它使用GPU进行并发计算,将一些计算密集型任务从CPU转移到GPU上执行,以提高游戏的性能和效率。本文将详细介绍Unity3DSha......
  • Unity3D 基类脚本怎么分别获取多个子类脚本的组件详解
    Unity3D是一款非常流行的游戏开发引擎,它提供了丰富的功能和工具,使得开发者可以轻松地创建高质量的游戏。在Unity3D中,脚本是游戏对象的一部分,它们通过附加到游戏对象上的组件来实现特定的功能。本文将详细介绍在Unity3D中如何分别获取多个子类脚本的组件,并提供相应的代码实现。对......
  • unity 标准资源包(过时)
    unity标准资源包Unity标准资源包(StandardAssets)是由Unity官方提供的一组可复用的资源集合,包含许多常用的游戏开发资源,如场景、材质、脚本、粒子效果、声音等。使用StandardAssets可以加速游戏开发的过程,因为它们已经预先制作好了,并且经过了官方的测试和优化,开发者可以......
  • Unity知识总结系列(二):相机跟随人物的几种方式
    相机跟随人物的几种方式1、最简单,无代码,固定距离,固定视角2、代码控制,固定距离,固定视角,对1进行改进3、代码控制,固定距离,固定视角,直接移动,不会旋转4、代码控制,固定距离,固定视角,插值移动(因为Update和LateUpdate刷新率不同,会有抖动现象,不建议使用)5、代码控制,固定距离,固定视角,平滑......
  • Unity URP 风格化水
    前言笔者曾使用UE实现过一个较为完整的写实水材质系统,但是因为UE的管线是定死的,导致高光无法实现,且后来做笔试题发现关于水的交互还未实现,因此本文将实现一个完整的风格化水,考虑到水的实现部分过多,这里不再使用代码展示,而是使用ASE,原理都差不多管线设置“ShaderType”为“U......
  • unity 射线只检测某个层级
    Hithit;//参数1:射线发射的位置-参数2:射线发射的方向-参数3:射线-参数4:发射的距离-参数5:要检测的层-参数6:重写全局 Physics.queriesHitTriggers 以指定默认情况下查询(射线投射、球形投射、重叠测试等)是否命中触发器。对查询使用Ignore可忽略触发碰撞体。if(Physic......