内容简介:这是第149篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员)
这是第149篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。
UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
本期目录:
- 按钮穿透点击实现方式
- 根据Mesh名称查找其在FBX中的路径
- 使用IL2CPP后是否存在Mono内存
- 实例化Prefab时Mesh合并
- UGUI TEXT里的Best Fit性能消耗
UI
Q:在按钮重叠情况下,如何实现点上面的按钮能同时让下面的按钮也执行?就是想让我的触摸监听能穿透下去不会停止,请问在UGUI上要怎么做?
A:我们是给需要做这种处理的控件上挂了一个脚本来实现的,没有修改EventSystem的源码。对应你的需求,可能要做一个全屏的UI来专门检测滑动时间。
using UnityEngine; using System.Collections; using UnityEngine.EventSystems; using UnityEngine.UI; using System.Collections.Generic; namespace KEngine.UI { public class TouchPenetrate : MonoBehaviour, IPointerClickHandler { public bool PenetrateOneLayer = true; //监听点击 public void OnPointerClick(PointerEventData eventData) { //PassEvent(eventData, ExecuteEvents.submitHandler); PassEvent(eventData, ExecuteEvents.pointerClickHandler); } //把事件透下去 public void PassEvent<T>(PointerEventData data, ExecuteEvents.EventFunction<T> function) where T : IEventSystemHandler { List<RaycastResult> results = new List<RaycastResult>(); EventSystem.current.RaycastAll(data, results); GameObject current = data.pointerCurrentRaycast.gameObject; for (int i = 0; i < results.Count; i++) { if (current != results[i].gameObject) { ExecuteEvents.Execute(results[i].gameObject, data, function); if (PenetrateOneLayer) { //只触发一层事件 break; } } } } } }
Editor
Q:现在项目需要进行一些资源的清理,将一些不需要的Mesh去掉。因而,需要获取所有Prefab中使用的Mesh所在FBX中的路径,然后FBX回建模软件,将其中不再用到的Mesh删除。现在能通过名称获取Prefab中的Mesh所在的FBX,但如果FBX中存在同名Mesh,如何确定用到的是哪个Mesh呢?
A:无法直接通过名称获取Mesh所在FBX中的路径,但是可以通过对比找到其在FBX中具体是哪个Mesh,然后再查找路径:
private static string GetMeshPath(string modelPath, MeshFilter prefabFilter) { GameObject model = AssetDatabase.LoadAssetAtPath<GameObject>(modelPath); if (!model) { Debug.LogWarning("No game object found at " + modelPath, prefabFilter); return null; } MeshFilter modelFilter = null; foreach (MeshFilter filter in model.GetComponentsInChildren<MeshFilter>(true)) { if (filter.sharedMesh == prefabFilter.sharedMesh) { modelFilter = filter; break; } } if (!modelFilter) { Debug.LogWarning("No game object found for " + prefabFilter, prefabFilter); return null; } Transform transform = modelFilter.transform; string path = transform.name; while (transform.parent) { transform = transform.parent; path = transform.name + "/" + path; } return path; }
IL2CPP
Q:使用了IL2CPP后是否还存在Mono内存,使用IL2CPP后,通过Profiler工具获取的Manage Object(例如: Int32[])是哪种内存?
A:可以简单的认为,IL2CPP 只是替换掉了Mono的虚拟机实现,所以该分配堆内存的地方还是会一样的分配(可能会有某些细节的地方不一样)。 IL2CPP在堆内存分配方面和Mono最大的不同主要是Reserved Total是可以下降的,而Mono的Reserved Total只会上升不会下降。
Mesh
Q:Prefab包含了多个Sub Mesh,当在场景中初始化该Prefab时,这些Sub Mesh进行了合并,怎么避免它们合并?
A:取消勾选Import Settings里面的“Weld Vertices“试试。该选项会自动合并位置相同的顶点,并且默认开启。
UGUI
Q:看了一些UGUI优化的文章,都提到TEXT里不要勾选Best Fit属性。但是我在Profiler里的Frame Debugger里没有找到相关的Text_OnPopulateMesh消耗数值。是不是意味着当前UI里勾选的Best Fit并没有造成太大的性能消耗?或者说在哪能查到当前UI里Best Fit相关的消耗?
PS:内存那块也没有看到相应的变化。
A:Best Fit主要功能是文本框内的字号会随着文本框大小改变而自动适配,通常来说,会带来两个问题: 1.游戏中的字号不统一,比如21、22、23、24都有可能,由于每个字号下新生成的字都会在对应的Font Texture上占用一个字的大小,所以容易导致Font Texture内存占用过大; 2.运行过程中动态修改文本框大小导致的额外开销,在某些项目中遇到过会对文本框大小进行动态调整(比如文字动画),如果这类文本勾选了Best Fit,就会有一个额外的CPU耗时。 Font Texture的尺寸会受字体种类、字号、文本内容多少影响,如果看到没有发生变化可能是内容还没有超过512*1024的范围,或者看一下是否生成了另一张Font Texture?BestFit对这个的影响主要还是字号不统一,如果勾选了但字号没有变化,也不会造成影响。
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
官方技术QQ群:793972859(原群已满员)
封面图来源:Unity UI Framework
https://lab.uwa4d.com/lab/5b5d24a5d7f10a201feac572以上所述就是小编给大家介绍的《按钮穿透点击实现方式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
WWW信息体系结构(影印版第2版)
Louis Rosenfeld / 清华大学出版社 / 2003-6 / 49.8
如今的网站和内联网已经变得比以前越来越大,越来越有价值,而且越来越复杂,同时其用户也变得更忙,也更加不能容忍错误的发生。数目庞大的信息、快速的变化、新兴的技术和公司策略是设计师、信息体系结构构建师和网站管理员必须面对的事情,而这些已经让某些网让看起来像是个快速增长却规划很差的城市——到处都是路,却无法导航。规划精良的信息体系结构当前正是最关键性的。 本书介绍的是如何使用美学和机械学的理念创建......一起来看看 《WWW信息体系结构(影印版第2版)》 这本书的介绍吧!