除了在 Unity3D 中使用“Assets/Gizmos”之外,如何拥有自定义脚本图标

2024-05-12

我知道这个问题可能被问过很多次了..但它经常被回答错误。

我想要的是:

Use a custom icon for specific components/scripts in the Inspector (e.g. Figure 2 and Figure 3) and the ProjectView (e.g. Figure 1) alt text

到目前为止我所做的:

对于每个应具有图标的组件/类,我在文件夹中都有一个相应的图标文件

Assets/Gizmos/<Path>/<To>/<Namespace>/<ClassName> icon

并在Import Settigns set TextureType to Editor GUI and Legacy GUI

这工作正常..到目前为止,这是我实现这一目标的唯一方法(考虑到以下部分我绝对不想要的).


But

然而,我想知道是否真的没有更好的方法必须为每个脚本都有一个唯一的图标文件。这使得项目/UnityPackage变得不必要的巨大。另外,如果我重命名一个类,我总是必须重命名相应的图标文件......这意味着感觉不对!

大多数 Unity 内置行为和组件都有一个独特的图标。而且来自新 PackageManager 的外部包也有内置图标,有时还有一个Gizmos文件夹,但它不遵循上述命名规则......所以显然图标是为它们配置的。

因此我的问题是:
有没有更好的方法来为脚本/组件提供这些图标?

最好编写脚本并重复使用一个图标文件,而不是在多个不同名称的文件中使用相同的图标。

和/或还有这些图标是在哪里/如何为来自 PackageManager 的脚本定义的?


!笔记!我绝对不想要的是:

在 SceneView 中也为所有人显示图标GameObjects连接这些组件(例如图 4)。这是由于通过检查器选择该脚本的图标造成的,如图 5 所示(如始终建议的,例如这个帖子 https://answers.unity.com/questions/32307/how-can-i-change-the-icon-of-a-script-within-the-p.html or here https://stackoverflow.com/questions/25343084/how-to-create-a-script-icon-in-unity3d甚至由Unity - 分配图标 https://docs.unity3d.com/Manual/AssigningIcons.html)或使用OnDrawGizmos https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnDrawGizmos.html or 绘制小工具 https://docs.unity3d.com/ScriptReference/DrawGizmo-ctor.html. 使用我当前使用的方法不会发生这种情况Gizmos folder!

Update

因为这是在这个答案 https://stackoverflow.com/a/55149774/7111561:我也知道我可以这样做并通过Gizmos场景视图的设置。But想象一下我有大约 25 个不同的模块,每个模块都有各种不同的图标。我不想在每个项目的 SceneView 设置中一一禁用它们的 Gizmos!即使提供的脚本似乎也是一个巨大的黑客解决方案。反思将是我采取的最后手段。另外,我什至宁愿不让这些图标显示为可能的小发明,而不是将它们全部禁用。


您可以使用图 5 设置图标,然后从小工具下拉列表中关闭该图标的小工具。

Edit:根据上述步骤,您可以尝试源自以下脚本here https://answers.unity.com/questions/837247/uncheck-all-in-gizmos-menu-in-scene-view.html它使用反射来查找负责关闭小工具和图标的类。每当您的脚本重新编译以保持这些图标关闭时,或者您向自动隐藏图标文件添加任何新图标时,都会执行此操作。Note:对于内置组件,scriptClass 将是一个空字符串,例如Camera、AudoSource

using UnityEditor;
using System;
using System.Reflection;

public class DisableAllGizmos
{
    [UnityEditor.Callbacks.DidReloadScripts]
    private static void OnScriptsReloaded()
    {
        var Annotation = Type.GetType("UnityEditor.Annotation, UnityEditor");
        var ClassId = Annotation.GetField("classID");
        var ScriptClass = Annotation.GetField("scriptClass");
        var Flags = Annotation.GetField("flags");
        var IconEnabled = Annotation.GetField("iconEnabled");

        Type AnnotationUtility = Type.GetType("UnityEditor.AnnotationUtility, UnityEditor");
        var GetAnnotations = AnnotationUtility.GetMethod("GetAnnotations", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
        var SetIconEnabled = AnnotationUtility.GetMethod("SetIconEnabled", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);

        Array annotations = (Array)GetAnnotations.Invoke(null, null);
        foreach (var a in annotations)
        {
            int classId = (int)ClassId.GetValue(a);
            string scriptClass = (string)ScriptClass.GetValue(a);
            int flags = (int)Flags.GetValue(a);
            int iconEnabled = (int)IconEnabled.GetValue(a);

            // this is done to ignore any built in types
            if (string.IsNullOrEmpty(scriptClass))
            {
                continue;
            }

            // load a json or text file with class names

            const int HasIcon = 1;
            bool hasIconFlag = (flags & HasIcon) == HasIcon;

            // Added for refrence
            //const int HasGizmo = 2;
            //bool hasGizmoFlag = (flags & HasGizmo) == HasGizmo;

            if (/*Compare class names in file to scriptClass == true*/)
            {
                if (hasIconFlag && (iconEnabled != 0))
                {
                    UnityEngine.Debug.LogWarning(string.Format("Script:'{0}' is not ment to show its icon in the scene view and will auto hide now. " +
                        "Icon auto hide is checked on script recompile, if you'd like to change this please remove it from the config",scriptClass));
                    SetIconEnabled.Invoke(null, new object[] { classId, scriptClass, 0 });
                }
            }
        }
    }
}
  1. 在检查器中显示有一个小工具

  2. 从小工具下拉列表中隐藏图标

  3. 图标仍然出现在检查器和项目视图中,但不会出现在场景中

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

除了在 Unity3D 中使用“Assets/Gizmos”之外,如何拥有自定义脚本图标 的相关文章

  • Unity Transform.LookAt 仅在一个轴上

    我一直在开发一款游戏 进展非常顺利 从这里得到了一些帮助 我再次需要它 所以我正在制作一个 2D 自上而下的射击游戏 我需要我的敌人看着玩家 显然敌人会在所有轴上旋转 因此是无敌的 或者看起来很奇怪 那么 如何让它只在Z轴上旋转呢 另外 如
  • 如何在 Three.js 场景中包含 OVRManager?

    我创建了几个 Three js Javascript 演示应用程序 正在我的新 Oculus Go 中进行试验 我正在尝试让 Go 控制器在我的应用程序中执行某些操作 根据 Oculus 开发人员中心的说法 最好的办法是将 OVRManag
  • 如何自定义 ckeditor 4.2 内置插件(如链接)?

    如果我想向链接插件添加选项卡 最佳实践方法是什么 我不想更改发布代码 只需用带有我的自定义的版本覆盖它即可 因此 很容易更新新版本 CKEDITOR 4 2 有这方面的操作方法吗 我正在使用新的内联样式工具栏 如果我获得源代码 我可以在没有
  • foreach 循环为 Unity 中的按钮赋值时出现问题

    我正在尝试在 Unity 中为我的游戏制作一个类似 Candy Crush 的地图 我正在尝试将所有按钮收集到一个数组中 然后设置其 onclick 属性 这样当我单击它们时 我就可以达到我想要的级别 我正在使用 Foreach 循环来实现
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 使用 Unity 在 iOS 应用程序上发送电子邮件时出错

    我正在开展一个学校项目 我正在尝试记录从我统一制作的游戏中存储的数据 我的问题是我想通过电子邮件将数据发送到应用程序 一切正常 电子邮件与数据一起发送等 但是当我将应用程序构建到 iOS 设备时 它不会发送电子邮件 我在 Unity 中没有
  • 你好,我最近正在开发我的新游戏,我遇到了*无限跳跃*的问题

    所以基本上当我按跳跃 空格键时我会跳跃但是如果我连续按空格键它 只是跳啊跳啊跳等等 我不想要我只想它跳一次 code if Input GetKeyDown space isGrounded velocity y Mathf Sqrt ju
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • Unity c# 四元数:将 y 轴与 z 轴交换

    我需要旋转一个对象以相对于现实世界进行精确旋转 因此调用Input gyro attitude返回表示设备位置的四元数 另一方面 这迫使我根据这个四元数作为默认旋转来计算每个旋转 将某些对象设置为朝上的简单方法如下 Vector3 up I
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • Unity 2018.3 android dex合并问题

    在您决定将这篇文章视为 重复 而不阅读它之前 请了解我已经查看了大量与此主题相关的帖子 但我找不到适合我的实例的解决方案 包括 StackOverflow 建议的所有解决方案 大多数帖子都是针对 Android Studio 而不是 Uni
  • Unity3D如何连接NavMesh和NavMeshAgent

    我在编辑器中收到此错误 SetDestination can only be called on an active agent that has been placed on a NavMesh 这些是我在解决问题时尝试的步骤 将 Nav
  • 如何更改 UIActivityIndi​​catorView 以设置自定义图像?

    好吧 我正在寻找一种方法来更改我的微调器图像并使用自定义图像 有什么建议吗 我创建了一个UIActivityIndi catorView 的子类 https github com cncool CDActivityIndicatorView
  • 查找周边上的点来表示边界/形状

    我有一个简单的二维网格 其格式为myGrid x y 我正在尝试找到一种方法来找到所选网格周围的周长 这样我就有了所选网格的形状 这是我的意思的一个例子 这里的想法是找到所有相关的 角点 也就是图像周边的红点 放入一个列表中 这样我就可以从
  • IBM Watson 对话服务错误:无法从“方法组”转换为“conversation.onMessage”

    我正在尝试运行 IBM Watson会话服务团结和下面是代码片段 https github com watson developer cloud unity sdk conversation private Conversation m C
  • 空合并运算符分配给 self

    我目前在 Unity 中设置了两个脚本来处理一些 UI 音频 一个是管理器 另一个是为特定 UI 元素播放声音 我所拥有的简化版本是这样的 public class AudioUIManager MonoBehaviour Only one
  • X 轴和 Z 轴上的 Quaternion.Slerp,无 Y 轴

    I am trying to rotate the Player about X Y and Z axis The Y axis should not move from last angle Example if I rotate 45
  • TextMeshPro 中不显示西里尔字母

    TextMeshPro 中不显示西里尔字母 显示方块而不是俄语字母 我在网上寻找其他人对同一问题的分析 但我什么也不明白 也没有帮助 在 Asset Creator 中 十六进制似乎被正确指示 但仍然没有 谁能帮我找出问题所在 在此输入图像
  • 将函数作为函数参数传递

    Unity C 似乎无法识别Func lt gt 作为函数委托的符号 那么 如何将函数作为函数参数传递呢 我有一个想法Invoke functionName 0 可能有帮助 但我不确定它是否实际上立即调用该函数 或者等待帧结束 还有别的办法
  • 模块中的类无法加载

    我正在开发一个 2D Unity android 游戏 其中我最近添加了 Firebase Beta SDK 但添加后FirebaseAnalytics unitypackage我面临的错误是 无法加载模块中的类 当我删除文件夹时Fireb

随机推荐