关于如何在 Unity 的 UI 菜单中默认创建出的控件 Raycast Target 属性默认为 false
关于如何在 Unity 的 UI 菜单中默认创建出的控件 Raycast Target 属性默认为 false
我们在 Unity 中通过 UI 菜单创建的各种控件,比如 Text, Image 等,它们的 Raycast Target 属性默认都是勾选的,这意味着他们会响应点击等时间,Unity 会将其加入到事件的响应队列,所以 UI 中这种控件数量很多时,是很影响性能的,确定不需要响应时间的都可以将改选项的勾选去掉。但是默认创建的都是全部勾选的,不过想要修改下这里面的细节又不破坏整体的使用习惯也是可行的。
UGUI 的源码打开找到 MenuOptions.cs 这里面就是实现 UI 菜单创建控件的代码。不过直接修改这部分的源码或者拷贝到项目里去修改,并且添加一系列新的 UI 菜单并不是我们希望的,我们希望直接接入原有 UI 菜单的创建过程,并且这部分源码并不是所有接口都在外部可访问,所以直接拷贝到项目也不一定可行,所以利用反射是一个好办法。
我们可以看到 UGUI 的源码中定义了各个菜单的位置,例如:[MenuItem("GameObject/UI/Text", false, 2000)],我们可以在自己的项目中重载此菜单的位置,也就是说如果我们在项目中定义了同样的 MenuItem,那么最终响应菜单点击事件的将是我们定义的函数。例如 我们在项目中创建 Editor 文件夹,创建一个 C# 文件,添加一个函数:
[MenuItem("GameObject/UI/Text", false, 2000)]
static public void AddText(MenuCommand menuCommand)
{
Debug.Log("This is an overrided AddText.");
}
编译完成后,点击菜单 GameObject/UI/Text 来创建一个 Text,会发现除了输出以上的 Log,什么也没创建,说明重载成功,接下来只需要利用反射,按照已有的 UGUI 源码按需求修改即可。例如如何重载创建一个 Raycast Target 为 false 的 Text 控件:
// Add by yaukey(https://github.com/yaukeywang) at 2017-10-11.
// Extend default ui menu.
using UnityEngine;
using UnityEngine.UI;
using UnityEditor;
using UnityEditor.UI;
using System.Collections;
using System.Collections.Generic;
using System;
using System.IO;
using System.Reflection;
[InitializeOnLoad]
static internal class UIMenuOptionsExtend
{
// The reflected dafault methods.
private static MethodInfo m_miGetDefaultResource = null;
private static MethodInfo m_miPlaceUIElementRoot = null;
static UIMenuOptionsExtend()
{
Initialize();
}
private static void Initialize()
{
// Get all loaded assemblies.
Assembly[] allAssemblies = AppDomain.CurrentDomain.GetAssemblies();
Assembly uiEditorAssembly = null;
foreach (Assembly assembly in allAssemblies)
{
AssemblyName assemblyName = assembly.GetName();
if ("UnityEditor.UI" == assemblyName.Name)
{
uiEditorAssembly = assembly;
break;
}
}
// Check if we find ui assembly.
if (null == uiEditorAssembly)
{
Debug.LogError("Can not find assembly: UnityEditor.UI.dll");
return;
}
// Get things we need.
Type menuOptionType = uiEditorAssembly.GetType("UnityEditor.UI.MenuOptions");
m_miGetDefaultResource = menuOptionType.GetMethod("GetStandardResources", BindingFlags.NonPublic | BindingFlags.Static);
m_miPlaceUIElementRoot = menuOptionType.GetMethod("PlaceUIElementRoot", BindingFlags.NonPublic | BindingFlags.Static);
}
[MenuItem("GameObject/UI/Text", false, 2000)]
static public void AddText(MenuCommand menuCommand)
{
GameObject go = DefaultControls.CreateText((DefaultControls.Resources)m_miGetDefaultResource.Invoke(null, null));
m_miPlaceUIElementRoot.Invoke(null, new object[] { go, menuCommand });
// Remove raycast target.
Text text = go.GetComponent<Text>();
text.raycastTarget = false;
}
}
此时点击菜单 GameObject/UI/Text 创建出的 Text,属性 Raycast Target 即为 false。这样就可以几乎无缝修改引擎自定义的行为,同时保留原有的使用习惯。
以上源码完整版下载地址:http://pan.baidu.com/s/1nvA6R0H,提取码:setx
关于如何在 Unity 的 UI 菜单中默认创建出的控件 Raycast Target 属性默认为 false的更多相关文章
- WPF 中动态创建和删除控件
原文:WPF 中动态创建和删除控件 动态创建控件 1.容器控件.RegisterName("Name",要注册的控件) //注册控件 2.容器控件.FindName(" ...
- WPF 中动态创建、删除控件,注册控件名字,根据名字查找控件
动态创建控件 1.容器控件.RegisterName("Name",要注册的控件) //注册控件 2.容器控件.FindName("Name") as 控 ...
- HTML5 UI框架Kendo UI Web中如何实现Grid网格控件本地化
Kendo UI Web包含数百个创建HTML5 web app的必备元素,包括UI组件.数据源.验证.一个MVVM框架.主题.模板等. 为了使得产品可以符合不同市场的本地化需求和语言,Kendo U ...
- HTML5 UI框架Kendo UI Web中如何创建自定义组件(二)
在前面的文章<HTML5 UI框架Kendo UI Web自定义组件(一)>中,对在Kendo UI Web中如何创建自定义组件作出了一些基础讲解,下面将继续前面的内容. 使用一个数据源 ...
- 如何在PB中调用 Microsoft WEB 浏览器 控件?
PB中使用Microsoft Web Browser控件步骤: 在pb的某窗口中加入OLE对象,选择Insert control(插入控件),然后选中"Microsoft WEB 浏览器&q ...
- ASP.NET MVC中加载WebForms用户控件(.ascx)
原文:ASP.NET MVC中加载WebForms用户控件(.ascx) 问题背景 博客园博客中的日历用的是ASP.NET WebForms的日历控件(System.Web.UI.WebControl ...
- .Net中使用无闪刷新控件时提示框不显示
今天做提示框的时候一直不显示,让我郁闷好久,晚上吃饭的时候问了同事一下,他给了一个思路, 他说可能是因为由于页面中的无闪刷新导致的结果:百度了一下真找到了解决方法 在页面中存在无闪刷新控件的时候提示框 ...
- ASP.NET中的Image和ImageButton控件
Image 控件用来显示图形.Image 控件可以显示来自位图.图标或元文件的图形,也可以显示增强的元文件.JPEG 或 GIF文件. ImageButton 控件用于显示可点击的图像. Image ...
- iOS开发UI篇—Date Picker和UITool Bar控件简单介绍
iOS开发UI篇—Date Picker和UITool Bar控件简单介绍 一.Date Picker控件 1.简单介绍: Date Picker显示时间的控件 有默认宽高,不用设置数据源和代理 如何 ...
随机推荐
- [LeetCode] 24. Swap Nodes in Pairs ☆
Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2-& ...
- Spring整合JMS(三)——MessageConverter介绍(转)
*注:别人那复制来的 1.4 消息转换器MessageConverter MessageConverter的作用主要有两方面,一方面它可以把我们的非标准化Message对象转换成我们的目标Me ...
- bzoj 2375: 疯狂的涂色
2375: 疯狂的涂色 Time Limit: 5 Sec Memory Limit: 128 MB Description 小t非常喜爱画画,但是他还是一个初学者.他最近费尽千辛万苦才拜到已仙逝的 ...
- Codeforces 803E - Roma and Poker
http://codeforces.com/problemset/problem/803/E E. Roma and Poker time limit per test 2 se ...
- Python学习笔记(三十四)—内置模块(3)base64
摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431954588 ...
- [csp-201809-3]元素选择器-编译原理
声明:同样是参考照抄hyh学长的代码!(有问题我马上删这篇emm 题目链接:http://118.190.20.162/view.page?gpid=T77 题面: 这棵树的样子(同样是来自学长的图) ...
- 【CodeForces】901 B. GCD of Polynomials
[题目]B. GCD of Polynomials [题意]给定n,要求两个最高次项不超过n的多项式(第一个>第二个),使得到它们GCD的辗转次数为n.n<=150. [算法]构造 [题解 ...
- 【leetcode 简单】第十九题 删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3-&g ...
- inviteflood 洪泛滥工具
inviteflood是一种通过UDP/IP执行SIP/SDP INVITE消息泛洪的工具,描述可以参考:inviteflood Package Description 使用inviteflood工具 ...
- 2017ACM暑期多校联合训练 - Team 4 1003 HDU 6069 Counting Divisors (区间素数筛选+因子数)
题目链接 Problem Description In mathematics, the function d(n) denotes the number of divisors of positiv ...