UGUI事件系统
Unity UGUI 的可触发事件系统:
PointerEnter:
PointerExit:
PointerDown:
PointUp:
PointClick:
Drag:
Drop:
Scroll:
UpdateSelected:
Select:
Deselect:
Move:
继承基础接口实现:
创建ClickObject脚本,继承 MonoBehaviour 和 PointerClickHander
public ClickObject : MonoBehaviour,IPointerClickHandelr{
void Start(){
}
void Update(){
}
public void OnPointerClick(PointerEventData eventData){
Debug.Log("click");
}
}
实现public void OnPointerClick(PointerEventData eventData)
创建名为 Panel_IPointer 的空白对象,并且把ClickObject脚本挂在对象上
启动。点击 Panel_IPointer 对象,Console输出
Unity3D编辑器操作设置实现:
Button 提供 OnClick 操作,实现事件
步骤一:创建c#脚本,添加OnTestClick()
步骤二:创建Empty对象,接受和响应点击事件,创建名为Panel的UI对象,于触发点击事件。
步骤三:Panel对象添加EventTrigger组件,“ Add New” -> 选择" PointerClick"。
将Empty对象拖拽到触发者位置。然后点击"No Function"选择我们写在Test脚本中的OnTestClick事件。
UGUI渲染层级
Unity中的渲染顺序自上而下大致分为三层。 分别是Camera - > Sorting Layer - > Sorting order
最高层为Camera层,可以在Camera的depth那里设置,设置之后,图形的渲染顺序就是先绘制depth低的相机下的物体,
再绘制depth高的相机下的物体,也就是说,depth高的相机会覆盖depth低的相机(具体的覆盖关系有don’t clear, solid color等等几种)
UGUI渲染模式: Canvas – Render Mode:ScreenSpace-Overlay
此模式下不依赖摄像机Camera的渲染
Hierachy下存在各层级遮挡,
- 不同Camera的Depth。(大在前,小在后)
- 同Camera的SortingLayer。(下在前,上在后)
- 同SortingLayer下的Order in Layer。(大在前,小在后)
- 同Order in Layer下的Z轴。(小在前,大在后)
改变控件之间的层级关系
同一canvas下:
- 改变控件 transform 的 SiblingIndex ,
- transform.GetSiblingIndex();
- transform.SetSiblingIndex(int index); //index值越大,越后渲染,层级越大,越显示在前面
不同Canvas下:
设置Canvas下的Sort Order //Sort Order值越大,越后渲染,层级越大,越显示在前面
渲染顺序与hierarchy面板里物体的摆放顺序也有关
面板里越靠上的物体越先被渲染,越后被渲染的显示在越前面。
注意:
如果是多个Canvas的渲染先后顺序 看这里
调Canvas下面有一个Sort Order值,默认为0,越大越在后面。
创建任意UGUI元素时自动生成一个Canvas物体,Canvas下的所有物体从上往下渲染,即排在下面的会遮盖排上面的。同理,子元素会覆盖父元素。
在游戏运行中如何修改UGUI的显示层级?
在代码中调整该元素的层级位:使用RectTransform类的函数。
- SetAsFirstSibling :移动到所有兄弟节点的第一个位置(Hierarchy同级最上面,先渲染,显示在最下面)
- SetAsLastSibling: 移动到所有兄弟节点的最后一个位置(Hierarchy同级最下面,后渲染,显示在最上面)
- GetSiblingIndex: 获得该元素在当前兄弟节点层级的位置
- SetSiblingIndex: 设置该元素在当前兄弟节点层级的位置
Canvas的渲染模式【Render Mode】: ScreenSpace Overlay,ScreenSpace Camera,World Space
ScreenSpace-Overlay:
- OverLay模式,永远覆盖在其他物体之上。出现在最上面。不受摄像机的Depth值影响
- 有多个摄像机时,由摄像机的Depth值决定
- 只有一个摄像机时,由距离和方向决定World模式和Camera模式、它们的渲染结果 可前、可后、可穿插。ScreenSpace-Camera:
1.遵循刷油漆规则
2.依次由Render Camera的Depth值、Sorting Layer先后顺序、Order in Layer值决定
Render Camera不同时,由Render Camera的Depth决定
Render Camera相同时,由Sorting Layer先后顺序决定
Render Camera相同时,Sorting Layer相同,由Order in Layer值决定。
UI框架设计
Unity的UI层级管理框架
UI框架的设计是任何游戏都需要做的事情,其中事件管理器(EventManager)是比较常用的UI和逻辑分离的方法。
通过注册,绑定,分发事件来控制UI界面或者游戏场景的逻辑处理。
UI和逻辑分离:
最基本的需求,不希望日后游戏更换UI需要到处修改逻辑,想要的是UI界面的负责展示。
一个UIManager来定义UI变化的逻辑,UI变化由事件驱动,所以UI界面 + UIManager + 事件分发器 就可以了。
以后换UI只需要修改UI界面就可以了。
游戏UI框架设计思路
UI窗体功能设计分布:
1)窗体自动加载管理
2)窗体生命周期管理
3)模态窗体实现
4)资源管理化
5)缓存UI窗体
6)窗体层级管理
7)消息中心
8)日志调试
UI框架核心设计:
根据UI框架的核心设计理念,定义三个核心功能:
1)UI窗体的自动加载
2)缓存UI窗体
3)窗体生命周期(状态)管理
UI框架设计的目的: 完成和具体游戏逻辑无关的底层事物。
四个核心类:
1)BaseUIForms: 基础UI窗体脚本
2)UIManager: UI窗体管理器脚本
3)UIType:窗体类型 【引用窗体的重要属性:枚举类型】
4)系统定义类 【框架使用的枚举类型,委托事件,系统常量
UI框架的设计:
UI框架用于管理场景中的所有面板,控制面板之间的切换,加快开发进度,提高代码质量。【主要在于管理面板】
实现思路:
- 进入状态:界面第一次动态加载被使用【】
- 暂停状态:切换到其他界面的时候
- 继续状态:重新回到界面的时候
- 退出状态:界面不显示的时候
实现步骤:
- 使用JSON保存面板路径,枚举保存面板类型
- 根据界面的四种状态,创建UI基类BasePanel,场景界面继承该类。将四种状态写作虚方法,分别为 OnEnter(),OnPause(),OnResume(),OnExit()
- 通过管理类UIManager,解析JSON,管理UI界面的加载和切换。方便调用,做成单例模式,分别从两个字典保存从JSON读取面板信息和已动态加载实例化的面板,通过栈实现面板之间的切换。
缺点明显,使用栈用来存储场景中依次打开的界面,只能够依次从栈顶界面开始关闭。
OnEnter()->OnPause()->OnResume()->OnExit()
UI框架类图:
UIPanelType : 存储面板路径和类型
UIManager :
- panelPathDict:Dictionary<UIPanelType,String>
- panelDict:Dictionary<UIPanelType,BasePanel>
- panelStack:Stack<BasePanel>
BasePanel