首页 > 其他分享 >Unity___编辑器开发

Unity___编辑器开发

时间:2023-08-18 17:55:23浏览次数:40  
标签:void Unity private 编辑器 static Debug ___ public rect

在Editor模式中执行组件内部的public字段/方法

1.确定绑定的组件

  1. 创建GUI按钮
[CustomEditor(typeof(Camera))]
public class TestInspector : Editor
{

    /// <summary>
    /// Inspector扩展,在对应的组件中添加按钮,可以点击后调用方法
    /// </summary>
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        if (GUILayout.Button("Test1"))
        {
           Camera camera=  this.target as Camera;
            if (camera != null)
            {
                camera.depth++;
            }
        }
    }
}

扩展组件设置菜单

例如给Transform组件添加一个设置位置的方法

/// <summary>
/// 扩展组件的菜单,例如在Transform下添加一个SetPositon
/// </summary>
public class TestInspectorContext : MonoBehaviour
{

    [MenuItem("CONTEXT/Transform/SetPosition")]
    static void SetPosition(MenuCommand command)
    {
        Transform transform = command.context as Transform;
        if (transform != null)
        {
            transform.position += Vector3.one;
        }
        Debug.Log("SetPosition");
    }
}

绘制Gizmos

主要用来标识物体

/// <summary>
/// 选中某对象后可以绘制一些东西标识物体
/// </summary>
    public Color color;

#if UNITY_EDITOR
    private void OnDrawGizmosSelected()
    {
        Gizmos.color = color;
        Gizmos.DrawLine(transform.position, transform.position + Vector3.up);
        Gizmos.DrawSphere(transform.position, 1);
    }
    private void OnDrawGizmos()
    {
        //不选中也能绘制
    }
#endif

添加菜单

 static bool isValidate = true;
    /// <summary>
    /// 至少需要子路径,只有根路径会报错,根路径可以是已有的比如“GameObject”,第三个参数标识优先级
    /// 快捷键%=Ctrl,#=Shift,&=Alt,上下左右=UP/DOWN/LEFT/RIGHT
    /// </summary>
    [MenuItem("Liudas/Text1 %#m",false,1)]
   static void Test1()
    {
        isValidate = !isValidate;
        TestWindow testWindow= EditorWindow.GetWindow<TestWindow>();
        testWindow.Show();
        Debug.LogError("测试菜单栏");
    }
    /// <summary>
    ///  添加true表示是否是验证函数Test1
    /// </summary>
    /// <returns></returns>
    [MenuItem("Liudas/Text1", true)]
    static bool Test1Validate()
    {
        //判断逻辑。。。。

        return isValidate;
    }

监听资源的变化

包括监听创建,保存,移动,删除,改动资源


public class TestProjectEvent : UnityEditor.AssetModificationProcessor
{
    public static void OnWillCreateAsset(string path)
    {
        Debug.LogFormat("创建资源{0}",path);

    }
    public static string[] OnWillSaveAssets(string[] paths)
    {
        for(int i = 0; i  < paths.Length; i++)
        {
            Debug.Log($"保存资源:{paths[i]}");
        }
        return paths;
    }
    public static AssetMoveResult OnWillMoveAsset(string oldPath,string newPath)
    {
        Debug.Log($"移动资源:{oldPath}--->{newPath}");
        return AssetMoveResult.DidNotMove;//可以移动
        //AssetMoveResult.DidMove;//不可以移动
    }
    public static AssetDeleteResult OnWillDeleteAsset(string path,RemoveAssetOptions options)
    {
        Debug.Log($"删除资源:{path} Option:{1}");
        //AssetDatabase.MoveAssetsToTrash();//将资源拖入回收站
        return AssetDeleteResult.DidNotDelete; 
    }
    [InitializeOnLoadMethod]
    public void InitOnLoad()
    {
        EditorApplication.projectChanged += () =>
        {
            Debug.LogError("资源发生改变");
        };
    }
}

编辑模式中执行

[ExecuteInEditMode]
public class TestGame : MonoBehaviour
{
    private void OnGUI()
    {
        if (GUILayout.Button("test1", GUILayout.Width(100)))
        {
            Debug.Log("test");
        }
    }
}

在GameObject/Asset窗口中添加菜单选项

[MenuItem("GameObject/Test",false,0)]
    static void Test()
    {
        Debug.Log("Test project ");
    }
[MenuItem("Asset/Test1")]
    static void Test1()
    {
        Debug.LogError("Project视图菜单");
    }

快速删除物体

hierarchy


[InitializeOnLoadMethod]
static void InitializeOnLoad()
    {

        //在Scene中右击弹出菜单栏,自定义菜单选项
        EditorApplication.hierarchyWindowItemOnGUI+= (InstanceID, rect) =>
        {
            if (Selection.activeObject != null&&InstanceID==Selection.activeObject.GetInstanceID())
            {
                    rect.x = rect.width - 50;
                    rect.width = 100;
                    if (GUI.Button(rect, "delete"))
                    {
                        DestroyImmediate((Selection.activeObject));
                        Debug.LogError($"删除物体:{Selection.activeObject},成功");
                    }
            }
        };
    }

project

    [InitializeOnLoadMethod]
    static void InitializeOnLoad()
    {

        //在Scene中右击弹出菜单栏,自定义菜单选项
        EditorApplication.projectWindowItemOnGUI += (guid, rect) =>
        {
            if (Selection.activeObject != null)
            {
                string active_guid= AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(Selection.activeObject));
                if (guid == active_guid&&string.IsNullOrEmpty(active_guid))
                {
                    rect.x = rect.width - 100;
                    rect.width = 100;
                  if(  GUI.Button(rect, "delete")) {
                        AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(Selection.activeObject));
                        Debug.LogError($"删除文件:{AssetDatabase.GetAssetPath(Selection.activeObject)},成功");
                    }
                }
                
            }
        };
    }

制作一个预览窗口

首先需要继承EditorWindow

public class TestPreview : EditorWindow
{

    private Object obj;
    private Object lastObj;
    private Editor previewObj;
    private void OnGUI()
    {
       obj=EditorGUILayout.ObjectField(obj, typeof(Object), false);
        if (obj != null&&obj!=lastObj)
        {
            previewObj = Editor.CreateEditor(obj);
            lastObj = obj;
        }

        if (previewObj!=null&& previewObj.HasPreviewGUI())
        {
            previewObj.OnPreviewGUI(GUILayoutUtility.GetRect(400,400),EditorStyles.label);
        }
    }
}
// 打开方式
    [MenuItem("Liudas/Test2 ", false, 2)]
    static void Test2()
    {
        TestPreview testWindow = EditorWindow.GetWindow<TestPreview>();
        testWindow.Show();
    }

窗口的一些监听方法


public class TestWindow : EditorWindow,IHasCustomMenu
{

    private bool isOpen = false;
    private void OnGUI()
    {
        if (GUILayout.Button("testWindow"))
        {
            Debug.Log("testwindow");
        }

    }
    private void Awake()
    {
        
    }
    private void OnDestroy()
    {
        
    }
   

    private void OnFocus()
    {
        

    }

    private void Update()
    {
        
    }
    private void OnLostFocus()
    {
        
    }


    /// <summary>
    /// 窗口下拉菜单
    /// </summary>
    /// <param name="menu"></param>
    public void AddItemsToMenu(GenericMenu menu)
    {
        menu.AddItem(new GUIContent("test1"), isOpen, () =>
        {
            Debug.Log("test1");
            isOpen = !isOpen;
        });
        //menu.AddDisabledItem()
    
}
}

标签:void,Unity,private,编辑器,static,Debug,___,public,rect
From: https://www.cnblogs.com/lxp-blog/p/17638747.html

相关文章

  • noglob 和 wildcard
    wildcard百搭、通配符在shell中使用noglob前缀,则停用通配符功能例如:$noglobscrapyshell-sUSER_AGENT='Mozilla/5.0(Macintosh;IntelMacOSX10_15_7)AppleWebKit/537.36(KHTML,likeGecko)Chrome/116.0.0.0Safari/537.36'https://tv.cctv.com/2023/08/18/......
  • [AT_ABC106_A]题解(C++)
    PartIPreface原题目$\text{(Luogu)}$原题目$\text{(AtCoder)}$PartIISketch给定整数$a,b$,输出$(a-1)\times(b-1)$。$2\leqa,b\leq100$。PartIIIAnalysis运用小学知识,进行平移,把几块地拼接在一起。不难看出长为$a-1$,宽为$b-1$,面积为$(a-1)\tim......
  • 【树】树上动态规划
    目录引入树形dp树上递推先序遍历(关键词:到根)后序遍历(关键词:子树)求直径(树上最长路径)换根DP法树上背包链式前向星引入考虑这样一个问题(P1352没有上司的舞会):一棵树,每个节点\(i\)都有价值\(v_i\),对于每个子节点,不能和父节点同时选择,求最大价值和。令dp[x][0]为在x的子树中......
  • java.sql.SQLException: Access denied for user 'root'@'localhost' (using password
    场景:使用mybatis-plus和SpringBoot,用Druid连接,查询数据库时出现异常用户访问被拒绝java.sql.SQLException:Accessdeniedforuser'root'@'localhost'(usingpassword:YES)在application.yml中核对过用户名密码后发现连接数据库密码是正确的,问题出在哪儿呢?appliation.yml......
  • 浅谈架构
    1     引言    笔者从事架构师工作多年,发现虽然软件开发人员人人都知道架构,但架构真正做什么,确很少有人能说的清楚。    大部分普通开发人员所想到的架构是框架的搭建以及各种架构技术比如缓存、消息队列、多线程等等,笔者曾经面试过一个应聘架构师岗位的......
  • .net5 npoi扩展 获取单元格合并区域
    核心逻辑为通过sheet.GetMergedRegion(i)获取所有的合并区域信息,随后检测单元格是否在此区域内新增对象识别合并单元格的开始、结束位置///<summary>///获取指定行列的数据///</summary>///<paramname="row"></param>///<paramname......
  • 微信开发之一键撤回消息的技术实现
    撤回消息请求URL:http://域名地址/revokeMsg请求方式:POST请求头Headers:Content-Type:application/jsonAuthorization:login接口返回参数:参数名必选类型说明wId是string登录实例标识wcId否string接收方微信id/群idmsgId是long消息msgId(发送类接......
  • 负载均衡压力测试的方法
    四层负载均衡采用开源软件LVS(LinuxVirtualServer)结合Keepalived的方式实现负载均衡,七层负载均衡由Tengine实现负载均衡。压力测试建议在进行压力测试时,配置建议如下:压测负载均衡转发能力建议使用短连接。一般来说压测除了验证会话保持和均衡性等功能外,主要是验证负载均衡的......
  • EF跟踪与非跟踪查询
    EF跟踪查询非跟踪查询  EntityFrameworkCore使用语言集成查询(LINQ)来查询数据库中的数据。  跟踪行为控制EntityFrameworkCore是否在其更改跟踪器中保留有关实体实例的信息。如果跟踪实体,在期间 SaveChanges,实体中检测到的任何更改将保存到数据库中。跟踪查询......
  • JS入门第一节
    <!DOCTYPE><html><head><!--注意两个标签之间不能有任何内容,否则会导致页面失效--><scriptsrc="my.js"></script></head><body><!--行内JS--><buttononclick="alert('努力,奋斗')">点......