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 update
   void 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 update
    void Start()
    {
        EventCenter.Register(SphereFun);
    }

    // Update is called once per frame
    void 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. 消息或事件

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

优点

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

缺点

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值