【《游戏架构核心技术与面试精粹》 提炼总结】(一) 第一章 · UI事件的绑定方式及优劣

本文深入探讨游戏UI交互设计的核心方法,包括事件绑定技术、触发流程及代码优化策略。解析三种绑定方式:接口实现、拖拽绑定与代码监听,阐述各自优劣,并提出效率提升建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 

本文由@唐三十胖子出品,转载请注明出处。  
文章链接:https://blog.youkuaiyun.com/icesony/article/details/82957793

 

 

这篇文章将总结和提炼《游戏架构核心技术与面试精粹》的第一章“UI交互”的内容。

针对其中疑惑与错误内容进行修正。

通过这篇文章,你可以知道

1)UI交互有哪些事件绑定方法

2)UI绑定事件的具体触发流程

3)如何高效添加事件绑定代码

 

一.UI交互有哪些事件绑定方法?

UI控件除了右键可以创建的拖动条 输入框 开关 滚动区域 按钮

还应该有各式各样的自定义控件

 

比如一个图片,同样可以添加点击或者拖拽事件

 

1.1通过接口实现事件绑定:

                                                                              图1.创建脚本的事件绑定方法

 

从图片上不难看出,这些都是官方提供的UI触发事件接口

包含了常见的各种事件具体代码实现:首先在调用中加一行引用EventSystems

 

之后在你自己的函数中,比如想要修改drag方法,那么在MonoBehaviour后输入drag

编辑器会自动提示drag的接口全称

using UnityEngine.EventSystems;
public class OnClickEvent : MonoBehaviour ,IDragHandler{
    void IDragHandler.OnDrag(PointerEventData eventData)
    {
        var rt = gameObject.GetComponent<RectTransform>();
        Vector3 globalMousePos;
        if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, eventData.position, eventData.pressEventCamera, out globalMousePos))
        {
            rt.position = globalMousePos;
        }
        Debug.LogError("now is drag");
    }
}

就这样,你在窗口中就可以拖拽物体了

1.2拖拽绑定方法

首先我们用三个对象,button,toggle,slider来示范

                                                                          图2.创建一个空对象保存脚本

                                                                                   图3.在视图窗口拖动绑定

绑定代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestEvent : MonoBehaviour
{
    public void OnButtonClick()
    {
        Debug.Log("button is clicked");
    }
    public void OnToggleChange(bool isOn)
    {
        Debug.Log("now toggle is " + isOn);
    }
    public void OnSliderValueChange(float rate)
    {
        Debug.Log("now slider value  is " + rate);
    }
}

运行测试,发现正常输出

 

 

其实还有第二种自定义的方式,添加eventrigger

这里你可以任意添加上面的12种绑定方式

这样你就可以自定义各种控件了

1.3代码中添加监听

​using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TestEvent : MonoBehaviour
{
    public Button btn;
    public Toggle toggle;
    public Slider slider;
    private void Start()
    {
        btn.onClick.AddListener(OnButtonClick);
        toggle.onValueChanged.AddListener(OnToggleChange);
        slider.onValueChanged.AddListener(OnSliderValueChange);
    }
    public void OnButtonClick()
    {
        Debug.Log("button is clicked");
    }
    public void OnToggleChange(bool isOn)
    {
        Debug.Log("now toggle is " + isOn);
    }
    public void OnSliderValueChange(float rate)
    {
        Debug.Log("now slider value  is " + rate);
    }
}

 

代码添加与拖拽的优劣:

代码绑定可能出现重复绑定,忘记移除等,因为没显示在界面中,但是不容易被修改

拖拽方式当存在多个方法绑定时候,拖拽不方便。但直观,很容易就看出绑定的事件

 

代码绑定的缺点如何克服:

也就是委托怎么防止重复添加

解决方法:所有的委托添加之前先删除然后添加

btn.onClick.RemoveListener(OnButtonClick);

btn.onClick.AddListener(OnButtonClick);

二.UI绑定事件的具体触发流程

  • 采集器帧检测输入,用户输入后调用派发器
  • 采集器用于采集用户输入方式,可能是手柄/键盘/点击
  • 本质是射线检测,这里反映在编辑器下就是eventsystem
  • 派发器传递信息给响应器,上面的绑定事件由响应器触发
  • 响应器常见实现就是IEventSystemHandler,上面重写接口也就是实现响应器

怎么降低事件频率?

1.降低采集器检测频率

2.降低派发频率

三.怎么高效的添加事件绑定代码?

其实书中代码参考价值不大

作者表达的观点是尽可能重用代码,减少代码量

书中用到了for循环getcomponentinchildrens<Button>的对象来添加事件

 

大量不显示的按钮,会影响性能吗?

不显示的按钮会加载很多无用监听,降低了运行效率

解决办法是:onenable中绑定事件,并在ondisable中解除绑定

保障在对象隐藏时候无用事件被移除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值