按钮穿透点击实现方式

栏目: C++ · 发布时间: 7年前

内容简介:这是第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;
                    }
                }
            }
        }
    }
}
感谢贾伟昊@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

以上所述就是小编给大家介绍的《按钮穿透点击实现方式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Building Social Web Applications

Building Social Web Applications

Gavin Bell / O'Reilly Media / 2009-10-1 / USD 34.99

Building a social web application that attracts and retains regular visitors, and gets them to interact, isn't easy to do. This book walks you through the tough questions you'll face if you're to crea......一起来看看 《Building Social Web Applications》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

SHA 加密
SHA 加密

SHA 加密工具