该文章专栏是向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. 消息或事件
示例:服务器向客户端发送通知
优点:
- 高度解耦:消息或事件机制使得发送方和接收方完全解耦,适用于分布式系统。
- 扩展性强:可以方便地添加新的消息处理者,而无需修改现有代码。
缺点:
- 性能开销:消息传递通常比直接方法调用有更高的性能开销。
- 复杂度高:需要设计和维护消息或事件系统,增加了系统的复杂性。