按钮穿透点击实现方式

按钮穿透点击实现方式

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