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

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

时间:2024-10-08 17:18:44浏览次数:11  
标签:调用 小球 void 耦合度 优缺点 Unity unity 方法 public

该文章专栏是向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. 消息或事件

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

优点

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

缺点

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

 

 

标签:调用,小球,void,耦合度,优缺点,Unity,unity,方法,public
From: https://blog.csdn.net/2301_77947509/article/details/142763023

相关文章

  • Unity移动旋转缩放
    //【移动】//一、修改Position//Translate//每帧移动一定距离,乘以deltaTime后变成每秒移动一定距离,默认是局部坐标会受自身旋转影响//transform.Translate(Vector3.up*Time.deltaTime);//transform.Translate(Vector3......
  • 【Unity】绘制表格:排行榜
    绘制一款表格,表格特征为头行颜色不同、间隔行不同背景色、滚动视图;表格内容是分数排行榜,前三名有奖牌图标前缀。成果展示Scene部分标题和背景滚动视图:表头、表格行模板效果图脚本部分脚本绑定在滚动组件的Viewport物体上。publicclassHighscoreTable:MonoBehaviour......
  • Unity 二维数组序列化
    unity中,二维以上的数量是不支持序列化的,如:usingSystem.Collections.Generic;usingUnityEngine;publicclassTestArray:MonoBehaviour{//不支持序列化(在Inspector面板无法显示)publicRect[][]rect2Ds;//不支持序列化(在Inspector面板无法显示)//pub......
  • 【春秋招必看】Unity相关笔试面试题(内有完整答案)第12期
    欢迎来到光光的奇妙冒险,我是你们的煎饼光子老师。今天是我们的第12期试题总结。C#部分:(前四题为字节跳动面试问题)1、List是链表还是数组答案:数组2、上一题追问:当list满了的时候,我再加入一个元素它的效率会比较低啊,它内部大概是一个什么样的执行过程呢?答案:数组搬家,会......
  • unity性能优化(有关图集)
    1.什么是图集?首先,你必须把你的美术资源TextureType改为Sprite(精灵类型),因为SpriteAltas只支持Sprite这种TextureType格式。官方:2D项目使用精灵和其他图形来创建其场景的视觉效果。这意味着单个项目可能包含许多纹理文件。Unity通常会为场景中的每个纹理发出一个绘制调用;但是,......
  • Unity实战案例全解析:RTS游戏的框选和阵型功能(5)阵型功能 优化一
    前篇:Unity实战案例全解析:RTS游戏的框选和阵型功能(4)阵型功能-CSDN博客本案例来源于unity唐老狮,有兴趣的小伙伴可以去泰克在线观看该课程我只是对重要功能进行分析和做出笔记分享,并未无师自通,吃水不忘打井人本案例的实现流程图 兵种排序  首先在一个阵型中,我们希望远......
  • 聊一聊自底向上测试和自顶向下测试的优缺点
    自顶向下的测试是从程序的顶部或初始模块开始。测试开始之后,挑选哪一个后续模块进行增量测试没有唯一正确的方法,唯一的原则是要成为合乎条件的下一个模块,至少一个该模块的从属模块,调用它的模块事先经过了测试。在大多数情况下,自底向上的策略与自顶向下的策略是相对立的。自顶......
  • unity编辑器绘制扇形
    使用UnityEditor.Handles.DrawSolidArc usingUnityEngine;usingUnityEditor;publicclassDrawSectorHandles:MonoBehaviour{publicfloatradius=5f;//扇形半径publicfloatangle=90f;//扇形角度publicColorarcColor=Color.red;/......
  • Unity编辑器扩展-基于UniTask的Http请求和下载
    publicclassHttpHelper{publicstaticasyncUniTask<(bool,string)>RequestGetUrlAsync(stringurl,booldebug=false){Debug.Log($"reqgeturl:{url}");UnityWebRequestreq=null;......
  • 【春秋招必看】Unity相关笔试面试题(内有完整答案)第八期
    欢迎来到光光的奇妙冒险,我是你们的煎饼光子老师。今天是我们的第八期笔试面试题总结。C#部分:1、如果我们想为Unity中的Transform类添加一个自定义的方法,应该如何处理?答案:通过C#的拓展方法相关知识点进行添加2、请说出using关键字的两个作用答案:1.引入命名空间2.安全......