按钮穿透点击实现方式
- 作者:admin
- /
- 时间:2019年02月25日
- /
- 浏览:3963 次
- /
- 分类:厚积薄发
1)按钮穿透点击实现方式
2)根据Mesh名称查找其在FBX中的路径
3)使用IL2CPP后是否存在Mono内存
4)实例化Prefab时Mesh合并
5)UGUI TEXT里的Best Fit性能消耗
这是第149篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。
UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
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;
}
}
}
}
}
}
感谢贾伟昊@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c627f5d63826a332ad994fe
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;
}
该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c639ada2b3589332f1a4998
IL2CPP
Q:使用了IL2CPP后是否还存在Mono内存,使用IL2CPP后,通过Profiler工具获取的Manage Object(例如: Int32[])是哪种内存?
A:可以简单的认为,IL2CPP 只是替换掉了Mono的虚拟机实现,所以该分配堆内存的地方还是会一样的分配(可能会有某些细节的地方不一样)。
IL2CPP在堆内存分配方面和Mono最大的不同主要是Reserved Total是可以下降的,而Mono的Reserved Total只会上升不会下降。
该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5a0271297acd3ac1606d5d32
Mesh
Q:Prefab包含了多个Sub Mesh,当在场景中初始化该Prefab时,这些Sub Mesh进行了合并,怎么避免它们合并?
A:取消勾选Import Settings里面的“Weld Vertices“试试。该选项会自动合并位置相同的顶点,并且默认开启。
该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c64ef092b3589332f1a49fd
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提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c63b4ed2b3589332f1a4999
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
官方技术QQ群:793972859(原群已满员)
封面图来源:Unity UI Framework
https://lab.uwa4d.com/lab/5b5d24a5d7f10a201feac572