关于如何在 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显示时间的控件 有默认宽高,不用设置数据源和代理 如何 ...
随机推荐
- kvm虚拟机配置被克隆rhel6客户机的网卡
例子:配置被克隆rhel6客户机的网卡 rhel6的网卡是通过udev规则来进行命名每个网卡都有不一样的macudev规则是根据网卡的mac来进行识别克隆出来的客户机,为了遵守每个网卡的mac都是全球 ...
- Visual Studio Code 如何编写运行 C、C++ 程序?
0. 前言 VS Code 是微软发布一款跨平台的源代码编辑器,其拥有强大的功能和丰富的扩展,使之能适合编写许多语言. 本文面向初学者(但不是纯小白),分享一点我配置C/C++的经验. 本文所有内容均 ...
- [Luogu 1197] JSOI2008 星球大战
[Luogu 1197] JSOI2008 星球大战 我算是真的沦为联赛选手了. 并查集裸题. 比较麻烦的是删点. 但是从后往前加点就好操作很多. 所以考虑离线,先存图,然后没被删的点之间,有边就合并 ...
- .net core 集成 autofac.
1. Install Install-Package Autofac Install-Package Autofac.Extensions.DependencyInjection 2.Startup ...
- php输出日志的实现
php输出日志的实现 思想:在想要输出log日志的地方,使用php的写入文件函数,把数据写入到事先定义好的文件中. php代码如下: //输出日志 public function outputLog( ...
- 03.WebView演练-iOS开发Demo(示例程序)源代码
技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong //转载请注明出处--本文永久链接:h ...
- 1030 大数进制转换(51Nod + JAVA)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1030 题目: 代码实现如下: import java.mat ...
- javascript 中的 this 关键字详解
1.javascript 中 什么是 this? this 指的是当前行为执行的主体,或者是当前方法执行的主体 context:是当前行为或者方法执行的环境 实例: xx 去北京饭店吃东西:上下文是“ ...
- $.when()方法翻译2
mac不知道为何,文章字数一多,浏览器就重启.只好分开写了. In the event a Deferred was resolved with no value, the corresponding ...
- python基础===将Flask用于实现Mock-server
from flask import Flask from flask import request, Response, jsonify import random import string app ...