欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > Unity 从零开始的框架搭建1-1 unity中对象调用的三种方式的优缺点分析【干货】

Unity 从零开始的框架搭建1-1 unity中对象调用的三种方式的优缺点分析【干货】

2024/10/23 15:21:12 来源:https://blog.csdn.net/2301_77947509/article/details/142763023  浏览:    关键词:Unity 从零开始的框架搭建1-1 unity中对象调用的三种方式的优缺点分析【干货】

该文章专栏是向QFrameWork作者凉鞋老师学习总结得来,吃水不忘打井人,不胜感激

Unity 框架搭建学习笔记1-1,前一个1代表凉鞋的第一季教程,后一个1代表该季第一篇我的文章

 unity中对象调用的三种方式

  • 方法调用,例如:A 调用 B 的 SayHello 方法
  • 委托或者回调,例如:界面监听子按钮的点击事件
  • 消息或事件,例如:服务器像客户端发送通知

举例分析

提前准备

我的场景中有如下内容,一个panel,其下有button,text组件,一个Sphere

panel1身上有一个脚本,还没写任何代码

小球身上有一个脚本写了下面的方法

想要实现的效果: 

 

方法调用

在panel身上的脚本中获取到小球组件,在游戏开始时候可以触发一次

private void Start() {transform.Find("Sphere").GetComponent<Sphere>().SphereFun();}

优点是很简单

缺点也很明显:耦合度高

耦合度为什么高?

我有十个小球,那UI就需要多个去持有小球的对象,然后调用其中的方法,想想就很恐怖

那我换个思路呢,我让箭头反过来,所有小球持有一个UI控件不就好了?

直接的委托或者回调 

C# & Unity 面向对象补全计划 之 委托-CSDN博客

委托或者回调,就是直接反过来,让所有小球持有一个UI控件

自然用到了按钮的委托方法

Unity UGUI 之Button_unity button-CSDN博客

在Sphere脚本中写如下内容

   public Button button;// Start is called before the first frame updatevoid Start(){button.onClick.AddListener(SphereFun);     }

或者直接拖拽到按钮下

耦合度是低了,但是这个时候又出现问题了,现在一个函数还好,等函数和按钮多了,我需要一个一个加?

基于事件的发布-订阅模式

C# & Unity 面向对象补全计划 之 事件-CSDN博客

[干货] [非基础警告] Unity 发布-订阅模式下的事件中心设计-CSDN博客

我们需要一个船新的脚本,叫做EventCenter,提供了事件注册,执行,注销的方法

public class EventCent : MonoBehaviour
{private static Action mOnEventTrigger;/// <summary>/// 注册事件/// </summary>public static void Register(Action onEvent) {mOnEventTrigger += onEvent;}/// <summary>/// 注销事件/// </summary>/// <param name="onEvent"></param>public static void UnRegister(Action onEvent) {mOnEventTrigger -= onEvent;}/// <summary>/// 触发事件/// </summary>public static void Trigger() {mOnEventTrigger?.Invoke();}
}

小球的脚本中直接注册方法 

public class Sphere : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){EventCenter.Register(SphereFun);}// Update is called once per framevoid Update(){}public void SphereFun(){Debug.Log("摇晃了一次");this.transform.DOPunchPosition(new Vector3(1,0,0),0.5f,10,0.5f);  }
}

在 panel1的脚本中直接写执行方法

public class PanelScripts : MonoBehaviour
{   private void Start() {transform.Find("SphereCtrl").GetComponent<Button>().onClick.AddListener(EventCenter.Trigger);        }   
}

 

优点:对于小球和UI来说直接0耦合

但是缺点也很明显:如果这个系统复杂起来,维护会很麻烦,开销也很大

总结

因为跟前文所讲的内容大差不差,所以我直接用Ai总结了

1. 方法调用

示例:A 调用 B 的 SayHello 方法

优点

  • 简单直接:调用方法非常直观,代码易于理解和维护。
  • 高效:直接调用方法,性能较高。

缺点

  • 耦合度高:对象A需要知道对象B的具体实现,增加了代码的耦合度。
  • 灵活性差:如果对象B的实现发生变化,需要修改对象A的代码。

2. 委托或者回调

示例:界面监听子按钮的点击事件

优点

  • 解耦合:通过委托或回调机制,调用者和被调用者之间的耦合度降低。
  • 灵活性高:可以动态地分配和更改回调方法,适应不同的需求。

缺点

  • 复杂度增加:代码逻辑变得复杂,特别是在处理多个回调时。
  • 调试困难:由于回调是异步的,调试和跟踪问题可能比较困难。

3. 消息或事件

示例:服务器向客户端发送通知

优点

  • 高度解耦:消息或事件机制使得发送方和接收方完全解耦,适用于分布式系统。
  • 扩展性强:可以方便地添加新的消息处理者,而无需修改现有代码。

缺点

  • 性能开销:消息传递通常比直接方法调用有更高的性能开销。
  • 复杂度高:需要设计和维护消息或事件系统,增加了系统的复杂性。

 

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com