ugui非常不友好!自定义控件创建流程

2023-11-08


layout: post
title: Unity ugui非常不友好!自定义控件创建流程。
key: 201905232043
tags: unity ugui

刚接触unity ugui,以下几点非常不友好

  1. 好的工具软件都有顺手的快捷键,为有如此编辑过程才能如行云流水,一挥即就。万万没想到!Unity居然没有创建控件的快捷键。目前都要从Hierarchy窗口右键->UI,或者菜单GameObject->UI创建控件。
  2. 很多控件不需要勾选raycastTarget。但默认创建的控件默认勾选raycastTarget。而选了raycastTarget的控件,会参与摄像机的UI事件计算。所以为了避免不必要的消耗,我们在每次创建控件后,都要手动关闭该选项。
  3. 各个游戏项目可能使用了各自的非默认字库。但默认的Text,使用了Arial.ttf字库。所以每次创建后,都要重新选择字库。

有如下几个方法解决上面问题

  1. 查看UnityEditor.UI是否允许设置自定义控件的创建过程
  2. 修改ugui源码。使用它满足我们项目的要求
  3. 覆盖创建控件的菜单命令

创建控件的代码在ui/UnityEditor.UI/UI/MenuOptions.cs1,我详细看了一下,未发现有可以委托创建控件的设定,即方法1不可行。修改源码的做法不够通用,实在办法时再来考虑方法2。而方法3比较容易实现.

定义菜单命令,需要用到UnityEditor.MenuItem特性,举个简单的例子为静态方法添加特性[MenuItem(“Menu1/item1”)],重新编译代码后,会在顶部菜单出现菜单项如下图

再添加字符#&t即可为Menu1/item1菜单命令绑定快捷键shift+alt+t,如[MenuItem("Menu1/item1 #&t")]。如果是#&a,即绑定为shift+alt+a。关于UnityEditor.MenuItem详细说明见官方文档2

英文字符 win按键 mac按键
% CTRL CMD
# Shift Shift
& alt alt

以下是简单创建Image控件示例,它覆盖了Unity原有的菜单命令GameObject/UI/Image并且绑定了快捷键shift+alt+i

[MenuItem("GameObject/UI/Image #&i")]
public static void CreateImage(MenuCommand menuCommand)
{
    GameObject go = new GameObject("Image", typeof(Image));
    go.GetComponent<Image>().raycastTarget = false;

    GameObjectUtility.SetParentAndAlign(go, menuCommand.context as GameObject);
    Undo.RegisterCreatedObjectUndo(go, "Create " + go.name);
    Selection.activeObject = go;
}

以下是另外一个做法。它复用了UGUI创建控件的原有代码,内部接口会将新创建的控件缓存在全局变量Selection.activeGameObject。当内部方法调用结束后,对Selection.activeGameObject对象稍加调整即可。由于内部接口声明为internal,以下用到了反射进行调用。

private static System.Type type = null;
public static System.Type GetMenuOptionsClass()
{
    if (type == null)
    {
        type = System.Type.GetType("UnityEditor.UI.MenuOptions,UnityEditor.UI");
    }

    return type;
}

private static Dictionary<string, System.Reflection.MethodInfo> dict = null;
public static GameObject Invoke(string funcName, MenuCommand menuCommand)
{
    if (string.IsNullOrEmpty(funcName))
    {
        return null;
    }

    if (!dict.ContainsKey(funcName))
    {
        System.Type type = System.Type.GetType("UnityEditor.UI.MenuOptions,UnityEditor.UI");
        System.Reflection.MethodInfo func = type.GetMethod(funcName);

        if (func != null)
        {
           dict.Add(funcName, func);
        }
        else
        {
            Debug.LogError("找不到方法: " + funcName);
            return null;
        }
    }

    dict[funcName].Invoke(null, new System.Object[] { menuCommand });
    return Selection.activeGameObject;
}

/// <summary>
/// 重写CreateImage,不勾选raycastTarget
/// </summary>
[MenuItem("GameObject/UI/Image")]
public static void CreateImage(MenuCommand menuCommand)
{
    GameObject go = Invoke("AddImage", menuCommand);
    if (go != null)
    {
        go.GetComponent<Image>().raycastTarget = false;
    }
}


原文:

https://lizijie.github.io/2019/05/23/ugui非常不友好-自定义控件创建流程.html

作者github:

https://github.com/lizijie


  1. https://bitbucket.org/Unity-Technologies/ui/src/0651862509331da4e85f519de88c99d0529493a5/UnityEditor.UI/UI/MenuOptions.cs?at=2018.3%2Fstaging ↩︎

  2. https://docs.unity3d.com/ScriptReference/MenuItem.html ↩︎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ugui非常不友好!自定义控件创建流程 的相关文章

  • 学习记录3:一个按键控制两盏灯,亮灯循环

    单片机SC95F8617 一个按键控制两盏灯 要求是按一下按键 1亮2灭 再按一下1灭2亮 再按一下1亮2亮 再按一下1灭2灭 然后又1亮2灭循环 其实列出来会发现这个亮灯的规律是一次转换一个灯 一次转换两个灯 循环 如下表所示 第一次的转

随机推荐

  • linux下重新安装python

    linux下重新安装python 1 移除旧版本 之前版本过低 yum erase y python3 2 下载新版本安装包 在自己的电脑上下载好再传输到云服务器上 直接在服务器上下载 wget https www python org f
  • 照片怎么换背景?这几个方法或许能帮到你

    大学上就业指导课的时候 老师让我们制作一个自己的简历 并要求了头像需要是蓝底的一寸照 课后 在制作简历的过程中 我并没有被简历的内容给难住 而是被如何获得一个蓝底的证件照给拖了后腿 这时候 我的舍友就给我介绍了几个方法来实现抠图换纯色背景
  • parse:uParse修复​​版,优化表格,css等,html富文本加载

    https ext dcloud net cn plugin id 364 自己搞微信小程序遇到的 uniapp 搞得 后台textarea富文本便捷器 录入的客户端显示 试了好几种都不行 尤其是表格图片排版的 https ext dclo
  • 【C语言】如何自动控制输出空格的个数

    include
  • ant design Table实现可编辑的单元格

    欢迎点击领取 前端面试题进阶指南 前端登顶之巅 最全面的前端知识点梳理总结 分享一个使用比较久的 需求 最近接到的一个需求 在table栏中实现属性的可编辑单元格 并且table内部可动态删减的单元格 外部操作新增或删除一行新旧数据的操作
  • idea怎么转换为中文

    搜索chinses 然后安装后 重启idea即可
  • 微信小程序发布审核基本步骤(带图)

    本文作为烂笔头记录或小白感性认识或为客户做基础说明 复杂性时间等 大佬请勿费神 微信小程序源码编辑与调试略 微信小程序注册略 一 安装微信开发者工具 微信开发者工具下载地址与更新日志 微信开放文档 二 绑定微信小程序开发者 1 登录微信公众
  • springBoot+mybatisPlus表名字段自动映射,时间字段值自动注入,序列化java对象到json显示时间

    mybatisPlus依赖引入
  • CTF.show:misc入门1-23

    八神爷爷出的题 很适合新手入门 我只是记录一下自己做题过程 没啥技术含量 目录 图片篇 基础操作 misc1 misc2 misc3 misc4 图片篇 信息附加 misc5 misc6 misc7 misc8 misc9 misc10 m
  • web开发中cab文件 使用

    百度百科中有cab文件的介绍 连接为http baike baidu com view 534677 htm 简单来说是压缩包文件 存储多个压缩文件的单个压缩包文件 这些文件通常用于软件安装 还用来减小文件大小和缩短 Web 内容的相关下载
  • java添加字符串数组_java – 如何将字符串数组的元素添加到字符串数组列表?...

    你已经有了内置的方法 List species Arrays asList speciesArr 注意 您应该使用List lt String gt 不是ArrayList lt String gt 种类 Arrays asList返回一个
  • 支付宝固定备注固定金额收款码

    目录 文章目录 目录 源码说明 独立项目结构 页面效果 部分源码 云盘下载 源码说明 提供支付宝收款码生成源码 包括生成的链接原理和生成二维码的代码都有 收款码特点是 固定金额 固定备注 独立项目结构 页面效果 部分源码
  • MyBatisPlus学习(1)—— 初始化环境配置 + BaseMapper

    一 添加依赖 首先创建springboot工程 然后在pom xml中添加mybatis plus相关依赖
  • BottomNavigationView取消水波纹动画

    BottomNavigationView取消水波纹动画 不得不说 BottomNavigationView 以下简称BNV fragment ViewPager用来实现一些基础的项目效果实在是不错 但BNV自带的缩放动画 水波纹动画使得用户
  • 解决用C#操作mysql数据库出错无法回滚的问题

    mysql同时执行多条命令 部分成功部分失败 返回的结果是操作失败 但是成功的部分不会自动回滚 网上搜到解决方法 可以判断返回值 只要有一条语句操作失败返回值就会是0 此时调用回滚 相关代码有很多 可以百度到 我一开始按照上述流程始终无法回
  • 什么是死锁?如何避免和解决死锁问题?

    1 什么是死锁 如何避免和解决死锁问题 死锁是指在多线程或多进程环境中 两个或多个进程 或线程 互相持有对方所需资源 导致它们都无法继续执行的一种状态 死锁问题通常涉及以下四个必要条件 互斥条件 资源只能被一个进程 或线程 占用 请求与保持
  • ContextCapture导入点云进行重建

    ContextCapture导入点云进行重建 ContextCapture导入点云进行重建 点云 PointCloud 导入点云 静态站点云 移动测量点云 输入文件 数据属性 字段 Fields ContextCapture的坐标系 管理点
  • 理解Java中的抽象

    在计算机科学中 抽象是一种过程 在这个过程中 数据和程序定义的形式与代表的内涵语言相似 同时隐藏了实现细节 抽象 一个概念或者想法不和任何特定的具体实例绑死 目录 什么是抽象 抽象的形式 如何在Java中使用抽象 什么是抽象 简单地说 抽象
  • SpringBoot事务注解@transactional无法生效的七个场景

    1 数据库引擎不支持事务 这里以 MySQL 为例 其 MyISAM 引擎是不支持事务操作的 InnoDB 才是支持事务的引擎 一般要支持事务都会使用 InnoDB 2 没有被 Spring 管理 Service public class
  • ugui非常不友好!自定义控件创建流程

    layout post title Unity ugui非常不友好 自定义控件创建流程 key 201905232043 tags unity ugui 刚接触unity ugui 以下几点非常不友好 好的工具软件都有顺手的快捷键 为有如此