本文由@唐三十胖子出品,转载请注明出处。
文章链接: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中解除绑定
保障在对象隐藏时候无用事件被移除