unity编辑器拓展

Editor下的脚本资源都不会打包。

优先级相隔11就有有中线分割,每一个菜单栏的priority优先级默认为1000

=>扩展在脚本上点击右键执行修改脚本属性的方法

[MenuItem("CONTEXT/PlayerHealth/InitHealthAndSpeed")]// CONTEXT 组件名 按钮名
    static void InitHealthAndSpeed(MenuCommand cmd)//menucommand是当前正在操作的组件
    {
        //Debug.Log(cmd.context.GetType().FullName);
        CompleteProject.PlayerHealth health = cmd.context as CompleteProject.PlayerHealth;
        health.startingHealth = 200;
        health.flashSpeed = 10;
        Debug.Log("Init");
    }

学习使用selection获取选择的游戏物体,制作删除功能(可以撤销的)删除操作

[MenuItem("GameObject/my delete", false, 11)]
    static void Mydelete()
    {
        foreach (Object o in Selection.objects)
        {
            //GameObject.DestroyImmediate(o);
            Undo.DestroyObjectImmediate(o);//利用Undo进行的删除操作 是可以撤销的
        }
        //需要把删除操作注册到 操作记录里面
    }

给菜单项添加快捷键:

//%=ctrl #=shift &=alt
    [MenuItem("Tools/test2 %q",false,100)]
    static void Test2()
    {
        Debug.Log("Test2");
    }
    [MenuItem("Tools/test3 %t",false,0)]
    static void Test3()
    {
        Debug.Log("Test3");
    }

==》》控制菜单项是否启用的功能

[MenuItem("GameObject/my delete", true, 11)]
    static bool MyDeleteValidate()
    {
        if (Selection.objects.Length > 0)
            return true;
        else
            return false;
    }

    [MenuItem("GameObject/my delete", false, 11)]
    static void Mydelete()
    {
        foreach (Object o in Selection.objects)
        {
            //GameObject.DestroyImmediate(o);
            Undo.DestroyObjectImmediate(o);//利用Undo进行的删除操作 是可以撤销的
        }
        //需要把删除操作注册到 操作记录里面
    }


    [MenuItem("Assets/PackageTools/SetCastShadowsOff", priority = 506)]
    static void SetCastShadowsOff()
    {
        Debug.Log("SetCastShadowsOff");
        var select = Selection.activeObject;
        if (!select)
        {
            return;
        }
        var folderPath = AssetDatabase.GetAssetPath(select);
        if (Directory.Exists(folderPath))
        {

            var fbxs = Directory.GetFiles(folderPath, "*.FBX", SearchOption.AllDirectories);
            foreach (var item in fbxs)
            {
                Transform fbx = AssetDatabase.LoadAssetAtPath<Transform>(item);
                ///下面代码有点鬼畜,.On正常,.Off就只能在本级目录
                var renderers = fbx.GetComponentsInChildren<SkinnedMeshRenderer>();
                foreach (var one in renderers)
                {
                    string lowerChildName = one.transform.name.ToLower();
                    if (lowerChildName.Contains("head") || lowerChildName.Contains("face") || lowerChildName.Contains("lian"))
                    {
                        Debug.Log(fbx.name);
                        Debug.Log(lowerChildName);

                        one.shadowCastingMode = ShadowCastingMode.Off;
                        Debug.Log(one.shadowCastingMode);
                    }
                }
                AssetDatabase.SaveAssets();
            }

            var prefabs = Directory.GetFiles(folderPath, "*.prefab", SearchOption.AllDirectories);
            foreach (var item in prefabs)
            {
                Transform prefab = AssetDatabase.LoadAssetAtPath<Transform>(item);
                var renderers = prefab.GetComponentsInChildren<SkinnedMeshRenderer>();
                foreach (var one in renderers)
                {
                    string lowerChildName = one.transform.name.ToLower();
                    if (lowerChildName.Contains("head") || lowerChildName.Contains("face") || lowerChildName.Contains("lian"))
                    {
                        one.shadowCastingMode = ShadowCastingMode.Off;
                    }
                }
            }

            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
    }

    [MenuItem("Assets/PackageTools/FindIncorrectShader", priority = 507)]
    static void FindIncorrectShader()
    {
        Debug.Log("FindIncorrectShader");
        var select = Selection.activeObject;
        if (!select)
        {
            return;
        }
        var folderPath = AssetDatabase.GetAssetPath(select);
        if (Directory.Exists(folderPath))
        {
            var mats = Directory.GetFiles(folderPath, "*.mat", SearchOption.AllDirectories);
            foreach (var item in mats)
            {
                Material material = AssetDatabase.LoadAssetAtPath<Material>(item);
                
                if (material.shader.ToString().IndexOf("PJAQ/Character/ToonV5")==-1)
                {
                    Debug.Log(item.ToString());//
                }
            }
        }

    }

Unity编辑器拓展Editor Extension)可以通过自定义的脚本来扩展Unity编辑器的功能和界面,以满足特定项目的需求。通过编辑器拓展,开发者可以创建自定义的编辑器窗口、工具栏按钮、菜单项、检视面板等,来增强Unity编辑器的功能和流程。 要创建一个Unity编辑器拓展,你可以使用C#编写一个继承自Editor类的脚本。这个脚本可以通过Unity的Inspector面板来设置相关的属性和行为。以下是一个简单的示例: ```csharp using UnityEngine; using UnityEditor; public class MyEditorExtension : EditorWindow { [MenuItem("Custom Tools/My Editor Window")] public static void OpenWindow() { // 创建并打开一个自定义的编辑器窗口 MyEditorExtension window = (MyEditorExtension)EditorWindow.GetWindow(typeof(MyEditorExtension)); window.Show(); } private void OnGUI() { // 在编辑器窗口中绘制UI元素 GUILayout.Label("Hello, I am a custom editor window!"); if (GUILayout.Button("Click Me")) { Debug.Log("Button clicked!"); } } } ``` 上述代码创建了一个自定义的编辑器窗口,并在窗口中绘制了一个标签和一个按钮。通过在Unity编辑器中点击"Custom Tools"菜单下的"My Editor Window",可以打开这个自定义的编辑器窗口。 除了编辑器窗口,你还可以通过继承Editor类来创建自定义的检视面板、菜单项等。Unity官方文档中有更详细的教程和示例,可以帮助你更深入地了解和使用Unity编辑器拓展
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kerven_HKW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值