Unity3D--拓展编辑器

本文详细介绍了如何拓展Unity3D的编辑器功能,包括Project视图、Hierarchy视图、Inspector视图和Scene视图等的拓展,如自定义菜单、监听事件、组件编辑权限及场景辅助元素等,旨在提升开发效率。
摘要由CSDN通过智能技术生成

更改Unity编辑器(一共就3步)
第一步
在这里插入图片描述
第二步
在这里插入图片描述
第三步
在这里插入图片描述
打开即可,over。

一、拓展Project视图

1.拓展右键菜单

编辑器使用的代码应该仅限于编辑模式下,正式的游戏包不应该包含这些代码。
Unity提供了一个规则:

  • 如果属于编辑模式下的代码,需要放在Editor文件夹下;
  • 如果属于执行时执行的代码,放在任意非Editor文件夹下;

注:Editor文件夹是在Create->Folder时重命名的,Editor文件夹可以放在任意位置

在这里插入图片描述
在Editor文件夹下创建一个C#脚本文件

using UnityEngine;
using UnityEditor;
public class Script_03_01  {
   

	[MenuItem("Assets/My Tools/Tools 1",false,2)]     //双引号里为菜单路径
	static void MyTools1()
	{
   
		Debug.Log(Selection.activeObject.name);
	}
    [MenuItem("Assets/My Tools/Tools 2", false, 1)]     //当需要添加多个菜单时,第三个参数值越小,菜单就越靠前
    static void MyTools2()
    {
   
        Debug.Log(Selection.activeObject.name);
    }
    [MenuItem("Assets/My Tools/Tools 3", false, 3)]
    static void MyTools3()
    {
   
        Debug.Log(Selection.activeObject.name);
    }
}


在这里插入图片描述

2.创建菜单

与上一方法类似,直接在MenuItem方法中添加路径即可

using UnityEngine;
using UnityEditor;
public class Script_03_02  {
   
    
    [MenuItem("Assets/Create/My Create/Cube", false, 2)]
    static void CreateCube()
    {
   
        GameObject.CreatePrimitive(PrimitiveType.Cube);//创建立方体
    }
    [MenuItem("Assets/Create/My Create/Sphere", false, 1)]
    static void CreateSphere()
    {
   
        GameObject.CreatePrimitive(PrimitiveType.Sphere);//创建球体
    }
}

效果演示
在这里插入图片描述

3.拓展布局

当鼠标选中一个资源后,会出现拓展后的click按钮,带你加这个按钮,程序会自动在Console窗口中打印选中的资源名。

using UnityEngine;
using UnityEditor;
public class Script_03_03  {
   
    
    [InitializeOnLoadMethod]
    static void InitializeOnLoadMethod()
    {
   
        EditorApplication.projectWindowItemOnGUI = delegate (string guid, Rect selectionRect)
          {
   
            //在Project视图中选择一个资源
            if (Selection.activeObject && guid == AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(Selection.activeObject)))
              {
   
                  float width = 50f;
                  selectionRect.x += (selectionRect.width - width);
                  selectionRect.y += 2f;
                  selectionRect.width = width;
                  GUI.color = Color.yellow;
                //点击事件
                if (GUI.Button(selectionRect, "click"))
                  {
   
                      Debug.LogFormat("click:{0}", Selection.activeObject.name);
                  }
                  GUI.color = Color.white;
              }
          };       //这有个分号

    }
}

在这里插入图片描述
在这里插入图片描述

5.监听事件

Project视图中的资源比较多,如果不好好规划,资源就会很凌乱。所以我们需要借助程序来约束资源,这可以通过监听资源的创建、删除、移动和保存等事件来实现。

using UnityEngine;
using UnityEditor;
using System.Collections.Generic; 
    
    public class Script_03_04:UnityEditor.AssetModificationProcessor
    {
   
        [InitializeOnLoadMethod]
        static void InitializeOnLoadMethod()
        {
   
            //全局监听Project视图下的资源是否有变化(删除、移动、添加)
            EditorApplication.projectWindowChanged = delegate ()
              {
   
                  Debug.Log("change");
              };

        }
        //监听“双击鼠标左键,打开资源”事件
        public static bool IsOpenForEdit(string assetPath,out string message)
        {
   
            message = null;
            Debug.LogFormat("assetPath:{0}",assetPath);
            //true表示资源可以打开,false表示不允许在Unity中dak该资源
            return true;
        }
        //监听"资源即将被创建"事件
        public static void onWillCreateAsset(string path)
        {
   
            Debug.LogFormat("path:{0}", path);
        }
        //监听"资源即将被保存"事件
        public static string[] onWillSaveAssets(string[] paths)
        {
   
            if(paths!=null)
            {
   
                Debug.LogFormat("path:{0}", string.Join(",", paths));
            }
            return paths;
        }
        //监听"资源即将被移动"事件
        public static AssetMoveResult onWillMoveAsset(string oldPath,string newPath)
        {
   
            Debug.LogFormat("from:{0}to:{1}", oldPath, newPath);
            //AssetMoveResult.DidMove表示该资源可以移动
            return AssetMoveResult.DidMove;
        }
        //监听"资源即将被删除"事件
        public static AssetDeleteResult onWillDeleteAsset(string assetPath,RemoveAssetOptions option)
        {
   
            Debug.LogFormat("delete:{0}", assetPath);
            //AssetDeleteResult.DidNotDelete 表示该资源可以被删除
            return AssetDeleteResult.DidDelete;
        }
    }


二、拓展Hierarchy视图

Hierarchy视图中出现的都是游戏对象,这些对象之间同样具有一定的关联关系。一般用树状结构来表示对象之间复杂的父子关系。Hierarchy视图中的游戏对象会通过摄像机最终投影在发布的游戏中。

1.拓展菜单
using UnityEngine;
using UnityEditor;

public class Script_03_05
{
   
    [MenuItem("GameObject/My Create/Cube", false, 0)]
    static void CreateCube()
    {
   
        GameObject.CreatePrimitive(PrimitiveType.Cube);     //创建立方体
    }
}

在这里插入图片描述

2.拓展布局

using UnityEngine;
using UnityEditor;

public class Script_03_06
{
   
    [InitializeOnLoadMethod
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值