Unity-编辑器扩展-入门篇

目前包含功能主要有:

  1. 设置预制tag
  2. 设置预制字体。
  3. 右键复制对象路径(绝对路径和相对路径)

面板截图如下:

直接上代码:

using System.IO;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

public class ToolsExtend : EditorWindow
{
    [MenuItem("Tools/Tools Extend")]
    public static void ShowPanel()
    {
        GetWindow<ToolsExtend>().Show();
    }

    private void OnGUI()
    {
        DrawSetTagGizmos();
        DrawSetFontGizmos();
    }

    #region Set Tag
    private static bool isSetChildTag = false;
    private static string newTag = string.Empty;
    private static GameObject prefabTag = null;

    private void DrawSetTagGizmos()
    {
        GUILayout.Label("设置预制Tag:");

        GUILayout.BeginHorizontal();
        GUILayout.Label("Target:", GUILayout.Width(60));
        prefabTag = (GameObject)EditorGUILayout.ObjectField(prefabTag, typeof(GameObject), true);
        GUILayout.EndHorizontal();

        GUILayout.BeginHorizontal();
        GUILayout.Label("Tag:", GUILayout.Width(60));
        newTag = EditorGUILayout.TextField(newTag);
        GUILayout.EndHorizontal();

        isSetChildTag = EditorGUILayout.Toggle("是否设置子节点:", isSetChildTag);

        if (GUILayout.Button("设置预制Tag"))
        {
            if (string.IsNullOrEmpty(newTag))
            {
                Debug.LogError("Tag can't be null or empty!");
                return;
            }

            if (prefabTag == null)
            {
                Debug.LogError("Prefab can't be null!");
                return;
            }

            prefabTag.tag = newTag;
            if (isSetChildTag)
            {
                SetChildTags(prefabTag.transform);
            }
        }

        GUILayout.Space(20);
    }

    private static void SetChildTags(Transform target)
    {
        if (target == null)
        {
            return;
        }

        foreach (Transform item in target)
        {
            item.tag = newTag;
            SetChildTags(item);
        }
    }
    #endregion

    #region Set Font
    private static Font font = null;
    private static bool isSetChildFont = false;
    private static GameObject prefabFont = null;

    private void DrawSetFontGizmos()
    {
        GUILayout.Label("设置预制字体:");

        GUILayout.BeginHorizontal();
        GUILayout.Label("Target:", GUILayout.Width(60));
        prefabFont = (GameObject)EditorGUILayout.ObjectField(prefabFont, typeof(GameObject), true);
        GUILayout.EndHorizontal();

        GUILayout.BeginHorizontal();
        GUILayout.Label("Font:", GUILayout.Width(60));
        font = (Font)EditorGUILayout.ObjectField(font, typeof(Font), true);
        GUILayout.EndHorizontal();

        isSetChildFont = EditorGUILayout.Toggle("是否设置子节点:", isSetChildFont);

        if (GUILayout.Button("设置预制Font"))
        {
            if (font == null)
            {
                Debug.LogError("Font can't be null!");
                return;
            }

            if (prefabFont == null)
            {
                Debug.LogError("Prefab can't be null!");
                return;
            }

            var text = prefabFont.GetComponent<Text>();
            if (text)
            {
                text.font = font;
            }

            if (isSetChildFont)
            {
                SetChildFont(prefabFont.transform);
            }

            Debug.Log("设置预制Font成功!");
        }

        GUILayout.Space(20);
    }

    private static void SetChildFont(Transform target)
    {
        if (target == null)
        {
            return;
        }

        foreach (Transform item in target)
        {
            var text = item.GetComponent<Text>();
            if (text)
            {
                text.font = font;
            }

            SetChildFont(item);
        }
    }
    #endregion

    #region Copy Path
    [MenuItem("Assets/My Tools/Copy GameObject Full Path", false, 152)]
    private static void CopyFullPath()
    {
        var path = AssetDatabase.GetAssetOrScenePath(Selection.activeGameObject);
        GUIUtility.systemCopyBuffer = Path.GetFullPath(path);
    }

    [MenuItem("Assets/My Tools/Copy GameObject Relative Path", false, 152)]
    private static void CopyRelativePath()
    {
        var path = AssetDatabase.GetAssetOrScenePath(Selection.activeGameObject).Replace('/', '\\');
        GUIUtility.systemCopyBuffer = path;
    }
    #endregion
}

备注:如果提交时发现预制未修改,但是在inspector面板却已经改变的情况下,在编辑器中直接Ctrl+s保存一下就好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity动画编辑器扩展是一种在Unity引擎中使用的功能,用于增强和定制动画编辑器的能力。通过扩展动画编辑器,开发者可以根据自己的需求添加新的功能和工具,使动画制作过程更加高效和便捷。 在扩展动画编辑器的过程中,开发者可以使用Unity的插件框架和API来创建自定义的窗口、工具栏、菜单和面板等界面元素。可以添加自定义的动画组件和控制器,以增加一些特殊的动画效果或行为。还可以编写脚本来实现自定义的动画算法、运动捕捉、路径编辑等功能,以满足不同类型的动画需求。 通过扩展动画编辑器,开发者可以更好地管理和组织动画资源,例如创建动画层级、动画事件管理,设置动画的播放速度和循环等。还可以进行动画的剪辑、合并、复制、粘贴和删除等操作,以快速调整动画的内容和表现效果。 另外,通过扩展动画编辑器,还可以实现与其他外部工具或软件的集成,例如使用第三方模型编辑器创建和导入动画,与物理引擎结合实现更逼真的动画效果,或者与VR/AR设备结合实现交互式的虚拟现实动画。 总之,Unity动画编辑器扩展为开发者提供了灵活和可定制的工具,使他们能够更加自由地创造各种精彩和富有表现力的动画作品。无论是游戏开发还是影视制作,扩展动画编辑器都能够为艺术家和开发者们提供更多的创作空间和可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值