-
2017-10-31 12:01:17
1.为什么要使用UI层级管理框架?
根据我个人写的UI层级总结出:在一般UI界面的 Canvas 下有多个Panel,每个Panel下又有很多个需要操作的控件(Image、Text、inputField、Button)等,
因此要去管理如此多的事件处理非常繁琐,UI的层级结构刚好适合用一套框架来管理 :Canvas--->Panel--->(控件)
例:
第一步:给需要监听鼠标事件的控件添加监听脚本
用一个脚本代替 控件在Inspector中留下的OnClick方法(例:Button的OnClick需要去在脚本中寻找相对应的方法,如果脚本多了,寻找方法困难,而且不利于扩展)
因此我用了一个 OnTriggerEvent.cs 的脚本来执行相应的点击事件
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class OnTriggerEvent : EventTrigger { //通过委托事件让UIScene来分配事件 public delegate void ClickListener(); public event ClickListener onBeginDrag; public event ClickListener onDrag; public event ClickListener onEndDrag; public event ClickListener onPointerClick; public event ClickListener onPointerUp; ///UI的相关监听//鼠标进入 public override void OnBeginDrag(PointerEventData eventdata) { if (onBeginDrag != null) onBeginDrag(); } public override void OnDrag(PointerEventData eventdata) { if (onDrag != null) onDrag(); } public override void OnEndDrag(PointerEventData eventdata) { if (onEndDrag != null) onEndDrag(); } public override void OnPointerClick(PointerEventData eventdata) { if (onPointerClick != null) onPointerClick(); } public override void OnPointerUp(PointerEventData eventdata) { if (onPointerUp != null) onPointerUp(); } }
第二步:给Panel添加脚本管理其下面需要监听的各个控件using System.Collections; using System.Collections.Generic; using UnityEngine; public class UIscene : MonoBehaviour { /// <summary> /// 管理所有需要监听的子物体 /// </summary> Dictionary<string,OnTriggerEvent> items=new Dictionary<string, OnTriggerEvent>(); // Use this for initialization public void Start () { Init(); } /// <summary> /// 根据名字在字典当中获取子物体 /// </summary> public OnTriggerEvent GetTrigger(string name) { if (items.ContainsKey(name)) return items[name]; return null; } public void Init() { //调用Find方法找到这个Panel下面带有OnTriggerEvent组件的所有子物体 Find(transform); } //递归查找子物体 public void Find(Transform t) { OnTriggerEvent item = t.GetComponent<OnTriggerEvent>(); if (item != null) { string name = item.gameObject.name; if (!items.ContainsKey(name)) { items.Add(name, item); } } for (int i = 0; i < t.childCount; i++) { Find(t.GetChild(i)); } } }
第三步:给Canvas添加管理各个Panel的脚本 UIManager.cs可以创建一个单例作为全局管理的类
如:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class UIPanel<T> : MonoBehaviour where T:Component{ private static T target; public static T Intance { get{ target = GameObject.FindObjectOfType(typeof(T)) as T; if (target == null) { GameObject go = new GameObject(); target = go.AddComponent<T>(); } return target; } } }
UIManager继承这个单例,方便使用
using System.Collections; using System.Collections.Generic; using UnityEngine; //因为有些Panel的名称复杂,所以通过静态类、字段存一些Panel的名称,方便我们索引 public class UISceneName { public const string Panel_login = "Panel_Login"; public const string Panel_ChooseAndEnter = "Panel_ChooseAndEnter"; public const string Panel_CreateCharacter = "Panel_CreateCharacter"; public const string Panel_Main = "Panel_Main"; public const string Panel_Hero="Panel_Hero"; // public const string Panel_Register="Panel_Register"; // public const string } public class UIManager : UIPanel<UIManager> { //创建一个字典来保存所有 Panel Dictionary<string,UIscene> scenes = new Dictionary<string,UIscene>(); public void Init() { UIscene[] items = GameObject.FindObjectsOfType<UIscene>(); for (int i = 0; i < items.Length; i++) { UIscene go =items[i]; if (!scenes.ContainsKey(go.name)) { scenes.Add(go.name, go); go.gameObject.SetActive(false); } } } //获取UIscene public UIscene GetUIscene(string name) { if (scenes.ContainsKey(name)) { return scenes[name]; } return null; } //对UIScene组件的Panel是否激活 public void IsActive(string name,bool isActive) { GameObject go = scenes[name].gameObject; if (go == null) { Debug.Log("你要查找的物体丢"); return; } go.gameObject.SetActive(isActive); } //展现登录界面的UIScene public void ShowUI() { IsActive(UISceneName.Panel_login, true); } }
第四步:前面三步都是管理思想,并提供了很多接口,初始化整个UI
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Init : MonoBehaviour { // Use this for initialization void Start () { UIManager.Intance.Init(); UIManager.Intance.ShowUI(); } }
第五步:外部的使用:通过继承UIScene的到整个Panel下面的所有需要监听的控件如:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ToMain : UIscene { private OnTriggerEvent Button_ToMain; // Use this for initialization void Start () { base.Start(); Button_ToMain = GetTrigger("Button_ToMain"); //给返回按钮绑定事件 Button_ToMain.onPointerClick += HeroToMain; } //返回到主界面 private void HeroToMain() { //关闭英雄界面 UIManager.Intance.IsActive(UISceneName.Panel_Hero, false); //打开主界面 UIManager.Intance.IsActive(UISceneName.Panel_Main, true); } }
更多相关内容 -
多层级角色部门权限管理结构图
2020-05-27 23:50:28详细描述多层级角色部门权限管理结构,对于理清权限管理思路非常有用,清晰了解权限设计多级,一级各层级关系和数据结构 -
多层级企业组织架构图.pptx
2019-09-26 05:31:14多层级企业组织架构图.pptx,PPTfans_0347 -
Unity层级管理插件---QHierarchy 4.3
2019-04-28 21:11:28QHierarchy 4.3是一款用于管理Unity3D游戏开发引擎中所有对象的插件,可以加快开发效率,仅供参考学习,商用请支持正版。 -
解决layui的table插件无法多层级获取json数据的问题
2021-01-21 14:13:01对于layui的table插件无法多层级获取json数据的解决方法,版本:2.2.6 根据官方文档 你接口返回的数据格式,遵循 response 对应的字段名称。 默认的格式为如下: { code: 0,//数据状态的字段名称,默认:code msg: ... -
试议保险资金运用的多层级风险管理体制.doc
2021-09-21 10:05:31试议保险资金运用的多层级风险管理体制.doc -
ioswindow层级管理
2014-04-29 15:15:23任意时刻任意地方向window添加任意数量的view或viewcontroller,其在window的层级很那管理,该demo把所有的view和viewcontroller管理起来。实现向window最后添加的view或viewcontroller在最前面。 -
unity窗体弹出层级管理
2018-04-04 18:33:02一套unity ugui 窗体弹出多层遮罩管理的代码,有弹出 关闭 等功能 -
BingSNS多层级分销拓客社群
2019-02-26 15:26:09BingSNS社群是一个通过内容引导消费的多层级分销拓客系统。 之前很多用户反映SQL数据库各种不会接,还有很多是虚拟主机只能导入一个SQL数据库,咱们这套系统有2个库,所以,对以上SQL不懂的用户可以直接下载这个... -
多层会员管理系统
2018-07-02 19:36:05学期项目写的会员管理系统 里面包括数据库 有多表连查和模糊查询等技术 适合我winform的初学者和想进一步提升的人员 里面有详细的注释和数据库 学期项目里面都很详细完美运行 -
MySQL多层级结构-树搜索介绍
2020-12-16 06:10:13在刚进入IT行业时使用CAKEPHP框架编写WEB的时候,使用它里面的一个ACL plugin实现权限管理的时候。发现一个表结构硬是不明白是怎么回事。具体表结构如下: CREATE TABLE acos ( id INTEGER(10) UNSIGNED NOT NULL ... -
电信设备-基于云计算的多层级关系信息管理系统及设计方法.zip
2021-09-18 13:56:14电信设备-基于云计算的多层级关系信息管理系统及设计方法.zip -
成功招商如何层级管理经销商
2020-12-21 09:54:49成功招商如何层级管理经销商适用于超市管理学、超市管理人员、超市职员等学习参考使用,欢迎大家下载成功...该文档为成功招商如何层级管理经销商,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看 -
基于多层级联算法的网络业务流量识别技术
2021-01-19 20:07:14在研究网络业务流量识别和机器学习技术的基础上,提出基于多层级联机器学习算法的网络业务流量识别方法,该方法能适应网络业务流量复杂多变的情况,并且平衡了机器学习算法在时间性能和识别准确率之间的矛盾,进一步... -
施工项目层级管理规定.ppt
2021-10-08 00:13:49施工项目层级管理规定.ppt -
星级酒店桑拿层级管理制度.docx
2022-01-05 14:11:48星级酒店桑拿层级管理制度.docx -
多层级口腔医疗机构管理者艾滋病职业防护认知的质性研究.rar
2021-09-20 00:31:50多层级口腔医疗机构管理者艾滋病职业防护认知的质性研究.rar -
电信设备-适应于分布式多层级扁平化信息管理系统设计的方法.zip
2021-09-19 00:34:58电信设备-适应于分布式多层级扁平化信息管理系统设计的方法.zip -
多层级口腔医疗机构管理者艾滋病职业防护认知的质性研究.pdf
2021-09-12 13:33:16多层级口腔医疗机构管理者艾滋病职业防护认知的质性研究.pdf -
财务预算各层级管理职责.doc
2021-09-09 17:45:25财务预算各层级管理职责.doc -
护理-人员层级管理规范方案.doc
2021-10-12 13:31:35护理-人员层级管理规范方案.doc -
CocosCreator之层级管理器
2020-09-09 23:44:08层级管理器 层级管理器中包括当前打开场景中的所有节点,不管节点是否包括可见的图像。你可以在这里选择、创建和删除节点,也可以通过拖拽一个节点到另一个上面来建立节点父子关系。 点击来选中节点,被选中的节点...层级管理器
层级管理器 中包括当前打开场景中的所有节点,不管节点是否包括可见的图像。你可以在这里选择、创建和删除节点,也可以通过拖拽一个节点到另一个上面来建立节点父子关系。
点击来选中节点,被选中的节点会以蓝底色高亮显示。当前选中的节点会在 场景编辑器 中显示蓝色边框,并更新 属性检查器 中的内容。
- 左上角的
按钮是创建按钮,用来创建节点。
搜索按钮用来过滤搜索的类型,分为 节点、组件 和 引用 UUID 的节点 三种类型。
- 上方的搜索栏可以根据搜索类型来搜索所需的节点或者组件等:
- 当在搜索按钮中选择 节点 类型时,可在搜索栏中输入需要查找的节点名称搜索。
- 当在搜索按钮中选择 组件 类型时,搜索栏中会出现
t:
的符号,在后面输入需要查找的组件名称即可(例如t:cc.Camera
)。 - 当在搜索按钮中选择 引用 UUID 的节点 类型时,搜索栏中会出现
used:
的符号,在后面输入需要查找的 UUID,即可搜索出有使用到该 UUID 的节点。
按钮可以切换 层级管理器 节点的展开/折叠状态。
- 面板主体是节点列表,可以在这里用右键菜单或者拖拽操作对资源进行增删修改。
- 节点前面的小三角
用来切换节点树的展开/折叠状态。当用户按住 Alt/Option 的同时点击该按钮,除了执行这个节点自身的展开/折叠操作之外,还会同时展开/折叠该节点下的所有子节点。
创建节点
在层级管理器中有两种方法可以创建节点:
- 点击左上角的 + 按钮,或右键点击鼠标并进入右键菜单中的 创建节点 子菜单。在这个子菜单中,你可以选择不同的节点类型,包括精灵(Sprite)、文字(Label)、按钮(Button)等有不同功能和表现节点。
- 从 资源管理器 中拖拽图片、字体或粒子等资源到层级管理器中。就能够用选中的资源创建出相应的图像渲染节点。
删除节点
选中节点后,通过右键菜单里
删除
选项,或按下 Delete(Windows)或 Cmd + Backspace 热键即可删除选中的节点。如果选中节点包括子节点,子节点也会被一起删除。建立和编辑节点层级关系
将节点 A 拖拽到节点 B 上,就使节点 A 成为节点 B 的子节点。和 资源管理器 类似,层级管理器中也通过树状视图表示节点的层级关系。点击节点左边的三角图标,即可展开或收起子节点列表。
更改节点的显示顺序
除了将节点拖到另一个节点上,你还可以继续拖拽节点上下移动,来更改节点在列表中的排序。橙色的方框表示节点所属父节点的范围,绿色的线表示节点将会被插入的位置。
节点在列表中的排序决定了节点在场景中的显示次序。在层级管理器中显示在下方的节点的渲染顺序是在上方节点的后面,即下方的节点是在上方节点之后绘制的,因而最下方的节点在 场景编辑器 中显示在了最前。
其他操作
右键点击节点弹出的菜单里还包括下列操作:
- 拷贝/粘贴:将节点复制到剪贴板上,然后可以粘贴到另外的位置,或打开另一个场景来粘贴刚才拷贝的节点。
- 复制节点:生成和选中节点完全相同的节点副本,生成节点和选中节点在同一层级中。
- 重命名:将节点改名。
- 显示节点 UUID 和路径:在复杂场景中,我们有时候需要获取节点的完整层级路径,以便在脚本运行时访问该节点。点击这个选项,就可以在 控制台 中看到当前选中节点的路径以及节点的 UUID。
- 锁定节点:鼠标移到节点上,左侧会有一个锁定按钮,节点锁定后无法在 场景编辑器 内选中该节点。
关注公众号:《码之有道》,一起聊游戏全栈开发!
1、公众号回复:【教程】获取零基础游戏开发客户端+服务端全套教程。
2、公众号回复:【实战】获取企业级实战项目。
3、公众号回复:【资料】获取大学四年整理的所有自学资料。 - 左上角的
-
护理_人员层级管理实施与培训方案.doc
2021-09-26 11:29:59护理_人员层级管理实施与培训方案.doc -
学习管理层级.docx
2020-11-13 22:42:51管理层次设计 管理层次设计 Management-level design 也称纵向结构设计 管理层次设计概述 管理幅度 与管理层次 是进行 组织设计 和诊断的关键内容 组织结构设计 包括纵向结构设计 和横向结构设计 两个方面 纵向结构... -
甘肃省质量技术监督系统财务层级管理办法.doc
2021-09-30 17:20:56甘肃省质量技术监督系统财务层级管理办法.doc -
论加强护理层级管理的改进措施-论文.zip
2021-08-18 17:57:29论加强护理层级管理的改进措施-论文.zip -
APN连续排班层级管理模式在病人服务中心的应用 (2012年)
2021-06-19 00:15:08目的:评价APN连续排班层级管理模式在病人服务中心的应用效果。方法:应用APN连续排班层级管理模式,以提高工作效率,提高工作质量。结果:提高了工作效率,提高了护理工作质量。结论:应用APN连续排班层级管理模式,节省了... -
管理节点层级和显示顺序
2020-12-20 01:18:04管理节点层级和显示顺序通过前面的内容,我们了解了通过节点和组件的组合,能够在场景中创建各种图像、文字和交互元素。当场景中的元素越来越多时,我们就...请先阅读 层级管理器 面板介绍,来掌握 层级管理器 的...管理节点层级和显示顺序
通过前面的内容,我们了解了通过节点和组件的组合,能够在场景中创建各种图像、文字和交互元素。当场景中的元素越来越多时,我们就需要通过节点层级来将节点按照逻辑功能归类,并按需要排列它们的显示顺序。
了解层级管理器
创建和编辑节点时,场景编辑器 可以展示直观的可视化场景元素。而节点之间的层级关系则需要使用 层级管理器 来检查和操作。请先阅读 层级管理器 面板介绍,来掌握 层级管理器 的使用方法。
节点树
通过层级管理器或运行时脚本的操作,建立的节点之间的完整逻辑关系,就叫做节点树。
下面是一个简单的游戏场景,包括背景图像,三个角色,标题文字,分数文字和开始游戏的按钮:
每个视觉元素都是一个节点,通常我们不会把所有节点平铺在场景上,而是会按照一定的分类和次序组织成如下图所示的节点树:
节点树中由箭头连接的两个节点之间就是父子关系,我们把显示在上面的叫做父节点,下面的叫子节点。在 层级管理器 中,上面的节点树就会是这个样子:
这就是如果依照类别创建几个父节点,然后把同类节点放在一个父节点下构建出的节点树。在实际游戏项目中我们还可以根据需要用其他各种方式组织节点树,下面我们就来仔细看看节点树和节点父子关系的实际作用,以及我们如何组织节点树的策略。
节点本地坐标系
在前一节的 本地坐标系相关介绍 中,我们了解了节点父子关系的重要作用之一就是让我们能够在 本地坐标系 下使用子节点的变换属性。
我们知道世界坐标系的原点是屏幕左下角,如果我们场景中所有节点都是平行排列,当我们需要将两个节点放在背景节点上面比较靠近中间的位置时,我们可以看到节点的 位置 属性如下图所示:
由于两个主要节点和背景节点没有任何关系,因此它们的位置都是在世界坐标系下的数值,基本上没有规律,当我们需要让节点在背景范围内移动时,要计算出节点新的位置也需要动一番脑筋。
下面我们再来看看借助节点父子关系和本地坐标系,我们把两个主要节点拖拽到 Parent 节点下面作为子节点,这时两个节点的 位置 属性会变成怎样:
由于 Parent 节点的锚点属性是 (0.5, 0.5),也就是以中心点作为本地坐标系原点,所以靠近父物体中心摆放的两个子节点的位置现在变成了 (-100, 0) 和 (100, 0),使用本地坐标系的位置信息能够直观的反应两个子节点的摆放逻辑,也就是「靠近背景中心左右对称摆放」。这样的工作方式能够更直接的体现设计师在搭建场景时的想法,在后续让节点在背景范围内运动的过程中,也更容易获得边界范围,比如父节点最右边的本地坐标,就是 (parentNode.width/2, 0)。
另外当需要将一组节点作为一个整体进行移动、缩放、旋转时,节点的父子关系也可以让我们只关心父节点的变换操作,而不需要再去对子节点进行一一的遍历和计算。下图就是我们把上面例子里的父节点进行旋转和缩放的结果,可以看到子节点像印在父节点上一样,和父节点一起进行变换。
我们经常会遇到由很多节点组合成的复杂角色,游戏控制这些角色互动时,就需要这种基于父节点整体变换的功能。下面我们就来看看都有哪些基于逻辑关系的节点树管理方式。
管理节点逻辑关系
在游戏中经常需要控制复杂的玩家角色,这种角色通常不会只由单个节点组成,我们看看下面这张图里的英雄角色,就由三个不同的部分组成。
我们将英雄角色的 Sprite 图像显示和帧动画组件放在 body 节点上,然后需要跟随角色移动的阴影 Sprite 单独拿出来作为 shadow 节点。最后把负责生命值显示的进度条作为一组独立功能的节点,形成自己的迷你节点树 HPBar。
上面的例子就是典型的根据逻辑需要来组织节点关系,我们可以根据游戏逻辑操作英雄角色节点的动画播放、左右翻转;根据角色当前血量访问 HPBar 节点来更新生命值显示;最后它们共同的父节点 player 用于控制角色的移动,并且可以作为一个整体被添加到其他场景节点中。
管理节点渲染顺序
在上面的例子中,我们可以注意一下 body 和 shadow 节点的排列顺序,在 层级管理器 中会按照节点排列顺序依次渲染,也就是显示在列表上面的节点会被下面的节点遮盖住。body 节点在列表里出现在下面,因此实际渲染时会挡住 shadow 节点。
我们可以看到父节点永远是出现在子节点上面的,因此子节点永远都会遮盖住父节点,这点需要特别注意。这也是我们为什么必须把英雄角色 Sprite 单独分离出来作为 body 节点的原因,因为如果英雄的 Sprite 处在 player 节点上,我们就无法使英雄图像挡住他脚下的阴影了。
性能考虑
注意,虽然前面我们说父节点可以用来组织逻辑关系甚至是当做承载子节点的容器,但节点数量过多时,场景加载速度会受影响,因此在制作场景时应该避免出现大量无意义的节点,应该尽可能合并相同功能的节点。
-
发现一个好用的层级多项目管理工具
2017-08-31 15:14:22市面上项目管理工具蛮多的,但大多仅支持单层多项目管理,而我们公司有多条产品线,如果没有层级组织用于分类,使用起来就非常麻烦。。。最近,我们试用了下Topo项目管理软件,它可以根据我们的组织架构进行层级搭建...市面上项目管理工具蛮多的,但大多仅支持单层多项目管理,而我们公司有多条产品线,如果没有层级组织用于分类,使用起来就非常麻烦。。。
最近,我们试用了下Topo项目管理软件,它可以根据我们的组织架构进行层级搭建,实际使用效果不错。看图:
进系统:
进设置:
在公司下建部门(或产品线)“系统”:
在“系统”下建项目“电子商城”:
层级组织就这么搭建起来了,条理很清晰吧:
还提供了一个公司级的项目中心,方便多项目的统一管理:
跟我们一样是多产品线又苦于没有层级多项目管理软件的小伙伴可以去试用一下!
-
培训需求调查问卷-C、D层级管理版.doc
2021-09-11 06:01:41培训需求调查问卷-C、D层级管理版.doc