Unity使用脚本动态设置物体的icon图标|SceneView,修改select icon

前言

在Scene场景中,有一个个方便定位观察调试物体的小功能。它可以为Gameobject添加一个图标或标签,这样就能很清晰的找到对应的Gameobject。

通常我们的操作是在Inspector面板中手动设置。但这对于动态临时生成的物体是不可操作的,好在Unity开放了这块的代码接口,可以让我们动态的在脚本里面设置物体的icon。

脚本动态设置

创建脚本 EditorGizmosIconManager,并编写以下内容:

using System;
using System.Reflection;
using UnityEditor;
using UnityEngine;
/// <summary>
/// 对象GizmosIcon管理器
/// </summary>
public class EditorGizmosIconManager
{
    #region 数据定义
    private static GUIContent[] labelIcons;
    private static GUIContent[] largeIcons;

    public enum LabelIcon
    {
        Gray = 0,
        Blue,
        Teal,
        Green,
        Yellow,
        Orange,
        Red,
        Purple
    }

    public enum Icon
    {
        CircleGray = 0,
        CircleBlue,
        CircleTeal,
        CircleGreen,
        CircleYellow,
        CircleOrange,
        CircleRed,
        CirclePurple,
        DiamondGray,
        DiamondBlue,
        DiamondTeal,
        DiamondGreen,
        DiamondYellow,
        DiamondOrange,
        DiamondRed,
        DiamondPurple
    }
    #endregion

    public static void SetIcon(GameObject node, LabelIcon icon)
    {
        if (labelIcons == null)
        {
            labelIcons = GetTextures("sv_label_", string.Empty, 0, 8);
        }
        SetIcon(node, labelIcons[(int)icon].image as Texture2D);
    }
    public static void SetIcon(GameObject node, Icon icon)
    {
        if (largeIcons == null)
        {
            largeIcons = GetTextures("sv_icon_dot", "_pix16_gizmo", 0, 16);
        }
        SetIcon(node, largeIcons[(int)icon].image as Texture2D);
    }
    private static void SetIcon(GameObject node, Texture2D texture)
    {
        EditorGUIUtility.SetIconForObject(node, texture);
    }
    private static GUIContent[] GetTextures(string baseName, string postFix, int startIndex, int count)
    {
        GUIContent[] guiContentArray = new GUIContent[count];

        for (int index = 0; index < count; ++index)
        {
            guiContentArray[index] = EditorGUIUtility.IconContent(baseName + (startIndex + index) + postFix);
        }
        return guiContentArray;
    }
}

LabelIcon枚举定义了标签类型的图标种类

Icon枚举定义了贴图\图片类型的图标种类

SetIcon:调用SetIcon函数,传递游戏对象及图标标识更改游戏物体在SceneView下的图标。

EditorGUIUtility.SetIconForObject(node, texture); EditorGUIUtility.SetIconForObject函数用于设置物体图标的贴图。

EditorGUIUtility.IconContent(baseName + (startIndex + index) + postFix); EditorGUIUtility.IconContent函数用于获取Unity内置的图标贴图,Unity内置的这些图标贴图的文件名是有一定的命名规则的。可以查看GitHub - halak/unity-editor-icons ,该仓库下的README阅读说明文件 说明了所有内置的图标贴图名称以及对应的贴图文件FileID。

修改Meta

除了使用唯一的命名获取贴图,也可以通过更改物体对应的meta文件或场景对应的meta文件下对应物体对象的icon属性中的fileid和guid。该方法只适用于修改预制件、脚本和"静态"(编译后非运行)场景中的物体ICON。通常用于批量处理信息。

以脚本为例,脚本文件对应的meta文件icon属性默认如下所示:

图中的icon,填的“instanceID = 0”即为默认显示

修改或添加icon属性中的fileid和guid,即可。如下图所示

 

 

作者:Miracle
来源:麦瑞克博客
链接:https://www.unitymake.com/archives/unity/unity_technologyshare/2933
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议,转载请注明!
THE END
分享
打赏
海报
Unity使用脚本动态设置物体的icon图标|SceneView,修改select icon
设置inspector的icon。通常我们的操作是在Inspector面板中手动设置。但这对于动态临时生成的物体是不可操作的,好在Unity开放了这块的代码接口,可以让我们动态的在脚本里面设置物体的icon。
<<上一篇
下一篇>>
文章目录
关闭
目 录