Unity 编辑器常用方法

unity编辑器开发

  • 脚本注解
    • [1. RuntimeInitializeOnLoadMethod](#1. RuntimeInitializeOnLoadMethod)
    • [2. ColorUsage](#2. ColorUsage)
    • [3. Header](#3. Header)
    • [4. SerializeField](#4. SerializeField)
    • [5. HideInInspector](#5. HideInInspector)
    • [6. Space](#6. Space)
    • [7. Range](#7. Range)
    • [8. Multiline](#8. Multiline)
    • 9.[RequireComponent(typeof())]
    • 10.HelpURL
  • 右键菜单注解
    • [1. CreateAssetMenu - 针对ScriptableObject](#1. CreateAssetMenu - 针对ScriptableObject)
  • 菜单栏注解
  • 脚本右键注解
    • [1. ContextMenu](#1. ContextMenu)
  • [PrefabUtility 预制体工具](#PrefabUtility 预制体工具)
    • 1.常用方法:
      • [1. InstantiatePrefab(PrefabAssetPath):](#1. InstantiatePrefab(PrefabAssetPath):)
      • [2. InstantiatePrefabAsGameObject(PrefabAsset):](#2. InstantiatePrefabAsGameObject(PrefabAsset):)
      • [3. ReplacePrefab(GameObject, PrefabAsset, ReplacePrefabOptions):](#3. ReplacePrefab(GameObject, PrefabAsset, ReplacePrefabOptions):)
      • [4. ConnectGameObjectToPrefab(GameObject, PrefabAsset):](#4. ConnectGameObjectToPrefab(GameObject, PrefabAsset):)
    • 2.常用事件:
      • [1. prefabInstanceUpdated:](#1. prefabInstanceUpdated:)
  • [EditorApplication 编辑器](#EditorApplication 编辑器)
    • 1.常用方法:
      • [1. Play: 启动游戏模式,将编辑器切换到播放模式。](#1. Play: 启动游戏模式,将编辑器切换到播放模式。)
      • [3. Pause: 将游戏暂停,如果游戏正在播放中。](#3. Pause: 将游戏暂停,如果游戏正在播放中。)
      • [4. IsPlaying: 返回一个布尔值,指示当前是否处于播放模式。](#4. IsPlaying: 返回一个布尔值,指示当前是否处于播放模式。)
      • [5. IsPaused: 返回一个布尔值,指示当前是否处于暂停状态(播放模式下)。](#5. IsPaused: 返回一个布尔值,指示当前是否处于暂停状态(播放模式下)。)
      • [6. IsPlayingOrWillChangePlaymode: 返回一个布尔值指示当前是否处于播放模式或正在切换到播放模式。](#6. IsPlayingOrWillChangePlaymode: 返回一个布尔值指示当前是否处于播放模式或正在切换到播放模式。)
      • [7. ExitPlaymode: 退出播放模式。](#7. ExitPlaymode: 退出播放模式。)
      • [8. OpenScene(string scenePath): 打开指定路径的场景。](#8. OpenScene(string scenePath): 打开指定路径的场景。)
      • [9. SaveScene: 保存当前场景。](#9. SaveScene: 保存当前场景。)
      • [10. ReloadLevel: 重新加载当前场景。](#10. ReloadLevel: 重新加载当前场景。)
    • 2.常用事件:
      • [1.delayCall: 在指定的延迟时间后触发的事件。](#1.delayCall: 在指定的延迟时间后触发的事件。)
      • [2. playModeStateChanged: 当播放模式的状态发生变化时触发的事件。](#2. playModeStateChanged: 当播放模式的状态发生变化时触发的事件。)
      • [3. playModeStateChanged (delegate):](#3. playModeStateChanged (delegate):)
      • [4. sceneOpened: 当场景被打开时触发的事件。](#4. sceneOpened: 当场景被打开时触发的事件。)
      • [5. sceneClosing: 当场景即将关闭时触发的事件。](#5. sceneClosing: 当场景即将关闭时触发的事件。)
      • [6. hierarchyChanged:当hierarchy中的结构发生改变时触发](#6. hierarchyChanged:当hierarchy中的结构发生改变时触发)

脚本注解

1. RuntimeInitializeOnLoadMethod

自动根据RuntimeInitializeLoadType选择一个时机执行。静态方法

  • AfterSceneLoad
    在场景加载之后初始化子系统。这意味着子系统将在场景加载完成后进行初始化,并在场景加载后的脚本执行时可用。
  • BeforeSceneLoad
    在场景加载之前初始化子系统。这意味着子系统将在场景加载之前进行初始化,并在加载场景时可用。
  • AfterAssembliesLoaded
    在程序集加载完成后初始化子系统。这意味着子系统将在 Unity 引擎加载所有程序集后进行初始化,并在加载完所有程序集后的脚本执行时可用。
  • BeforeSplashScreen
    在显示启动画面(Splash Screen)之前初始化子系统。这意味着子系统将在显示启动画面之前进行初始化,并在启动画面显示前的脚本执行时可用。
  • SubsystemRegistration
    以便在子系统注册时触发相应的初始化方法。
C# 复制代码
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    public static void Init()
    {
        Debug.Log("先把权限添加进列表,然后申请");
        //AndroidPermissionMgr.permissionList.Add("android.permission.WRITE_SETTINGS"); 红米10X不能获取到此权限
    }
    void Start(){
      AndroidPermissionMgr.StartCheckPermission(0.02f); //开始申请
    }

2. ColorUsage

  • 高级版拾色器,[ColorUsage(showAlpha: true, hdr: true)]

3. Header

  • 给这个变量加上一个加粗的标题显示在编辑器中的属性蓝中

4. SerializeField

  • 该变量显示到 Inspector 面板中

5. HideInInspector

  • 在 Inspector 面板中,隐藏任何类型的变量

6. Space

  • 在Inspector 中与上一个变量分割一段距离,网上推荐取值 10

7. Range

  • 限制数值型变量的范围

8. Multiline

  • 单行string变为多行文本输入

9.[RequireComponent(typeof())]

  • 在inspector中添加此脚本时必须要有要求的脚本

10.HelpURL

  • 脚本右上角的疑问Url地址

右键菜单注解

1. CreateAssetMenu - 针对ScriptableObject

C# 复制代码
[CreateAssetMenu(menuName = "ScriptObject/RoadsSetting")]
public class Test{}

菜单栏注解

C# 复制代码
	[MenuItem("Tools/做一件事",priority = 0)]
	void Todo(){
		Debug.Log("做一件事");
	}

其中priority为排序优先级

2.AddComponentMenu

将脚本注册到Compoment菜单里面

脚本右键注解

1. ContextMenu

C# 复制代码
    [ContextMenu("自动补空",false,0)]
    void AutoAddNull(){
    	Debug.Log("做一件事");
    }

第一个是显示的名称

第二个是"是否为验证函数",即在为true同名方法执行前会先执行这个函数

第三个是排序优先级

PrefabUtility 预制体工具

1.常用方法:

1. InstantiatePrefab(PrefabAssetPath):

该方法用于在场景中实例化指定路径的预制体,并返回实例化后的游戏对象。

C# 复制代码
GameObject go = PrefabUtility.InstantiatePrefab((Object)nullPrefabs, transform) as GameObject;

2. InstantiatePrefabAsGameObject(PrefabAsset):

该方法用于在场景中实例化指定的预制体,并返回实例化后的游戏对象。

C# 复制代码
using UnityEditor;
using UnityEngine;

public class MyScript : MonoBehaviour
{
    public GameObject prefab;

    [MenuItem("Example/Instantiate Prefab")]
    private static void InstantiatePrefab()
    {
        GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Prefabs/MyPrefab.prefab");
        if (prefab != null)
        {
            GameObject instance = PrefabUtility.InstantiatePrefab(prefab) as GameObject;
            if (instance != null)
            {
                // 在场景中实例化预制体后的处理逻辑
            }
        }
    }
}

3. ReplacePrefab(GameObject, PrefabAsset, ReplacePrefabOptions):

该方法用于将游戏对象替换为指定的预制体,并返回替换后的预制体。

C# 复制代码
using UnityEditor;
using UnityEngine;

public class MyScript : MonoBehaviour
{
    public GameObject prefab;

    [ContextMenu("Replace With Prefab")]
    private void ReplaceWithPrefab()
    {
        GameObject prefabInstance = PrefabUtility.ReplacePrefab(
        		gameObject, 
        		prefab, 
        		ReplacePrefabOptions.Default);
        if (prefabInstance != null)
        {
            // 替换为预制体后的处理逻辑
        }
    }
}

4. ConnectGameObjectToPrefab(GameObject, PrefabAsset):

该方法用于将游戏对象连接到指定的预制体,并将其标记为预制体的实例。

C# 复制代码
using UnityEditor;
using UnityEngine;

public class MyScript : MonoBehaviour
{
    public GameObject prefab;

    [ContextMenu("Connect to Prefab")]
    private void ConnectToPrefab()
    {
        PrefabUtility.ConnectGameObjectToPrefab(gameObject, prefab);

        // 将游戏对象连接到预制体后的处理逻辑
    }
}
  • DisconnectPrefabInstance(GameObject):

该方法用于将游戏对象从预制体实例断开连接,并将其转换为普通的游戏对象。

C# 复制代码
using UnityEditor;
using UnityEngine;

public class MyScript : MonoBehaviour
{
    [ContextMenu("Disconnect Prefab Instance")]
    private void DisconnectPrefabInstance()
    {
        PrefabUtility.DisconnectPrefabInstance(gameObject);

        // 断开游戏对象与预制体实例关联后的处理逻辑
    }
}

2.常用事件:

1. prefabInstanceUpdated:

当预制体实例更新时触发的事件。可以通过订阅此事件,以在预制体实例发生更改时执行自定义逻辑。

C# 复制代码
using UnityEditor;
using UnityEngine;

public class MyScript : MonoBehaviour
{
    private void OnEnable()
    {
        PrefabUtility.prefabInstanceUpdated += PrefabInstanceUpdatedHandler;
    }

    private void OnDisable()
    {
        PrefabUtility.prefabInstanceUpdated -= PrefabInstanceUpdatedHandler;
    }

    private void PrefabInstanceUpdatedHandler(GameObject instance)
    {
        // 预制体实例更新事件处理逻辑
        Debug.Log("Prefab instance updated: " + instance.name);
    }
}

EditorApplication 编辑器

1.常用方法:

1. Play: 启动游戏模式,将编辑器切换到播放模式。

3. Pause: 将游戏暂停,如果游戏正在播放中。

4. IsPlaying: 返回一个布尔值,指示当前是否处于播放模式。

5. IsPaused: 返回一个布尔值,指示当前是否处于暂停状态(播放模式下)。

6. IsPlayingOrWillChangePlaymode: 返回一个布尔值指示当前是否处于播放模式或正在切换到播放模式。

7. ExitPlaymode: 退出播放模式。

8. OpenScene(string scenePath): 打开指定路径的场景。

9. SaveScene: 保存当前场景。

10. ReloadLevel: 重新加载当前场景。

2.常用事件:

1.delayCall: 在指定的延迟时间后触发的事件。

可以使用此事件来执行延迟调用的逻辑。

C# 复制代码
using UnityEditor;
using UnityEngine;

public class MyScript : MonoBehaviour
{
    [MenuItem("MyMenu/Delayed Method")]
    private static void DelayedMethod()
    {
        EditorApplication.delayCall += DelayedCallback;
    }

    private static void DelayedCallback()
    {
        Debug.Log("Delayed Method called.");
    }
}

在上述示例中,我们使用 [MenuItem] 特性为自定义菜单项添加了一个 "Delayed Method" 选项。当点击该菜单项时,DelayedMethod 方法会被调用。

在 DelayedMethod 方法中,我们订阅了 EditorApplication.delayCall 事件,并将其回调方法设置为 DelayedCallback。这意味着 DelayedCallback 方法将在下一帧或稍后时间被调用。

在 DelayedCallback 方法中,我们简单地输出一条日志来表示延迟调用的方法已被执行。

2. playModeStateChanged: 当播放模式的状态发生变化时触发的事件。

可以通过订阅此事件,在播放模式开始、结束或暂停时执行自定义逻辑。

3. playModeStateChanged (delegate):

与上述事件相同,但使用委托(delegate)订阅。

4. sceneOpened: 当场景被打开时触发的事件。

可以通过订阅此事件,在场景被打开后执行自定义逻辑。

5. sceneClosing: 当场景即将关闭时触发的事件。

可以通过订阅此事件,在场景关闭前执行自定义逻辑。

6. hierarchyChanged:当hierarchy中的结构发生改变时触发

C# 复制代码
using UnityEditor;
using UnityEngine;

public class MyCustomEditor : EditorWindow
{
    [InitializeOnLoadMethod]
    private static void Initialize()
    {
        EditorApplication.hierarchyChanged += OnHierarchyChanged;
    }

    private static void OnHierarchyChanged()
    {
        // 预制体更新事件发生时执行的逻辑
        //Debug.Log(Selection.activeGameObject.name);
        if (Selection.activeGameObject)
        {
            if (Selection.activeGameObject.transform.parent)
            {
                var obj = Selection.activeGameObject.transform.parent.GetComponent<AutoLayout>();
                if (obj != null)
                {
                    obj.OnTransformChildrenChanged();
                }
            }
            
        }
        
    }
}
相关推荐
XiaoLiuLB8 小时前
ChatGPT Canvas:交互式对话编辑器
人工智能·自然语言处理·chatgpt·编辑器·aigc
五花肉村长1 天前
数据结构-队列
c语言·开发语言·数据结构·算法·visualstudio·编辑器
嵌入式小能手1 天前
开发环境搭建之VScode的安装及使用
vscode·编辑器
Artistation Game1 天前
九、怪物行为逻辑
游戏·unity·游戏引擎
百里香酚兰1 天前
【AI学习笔记】基于Unity+DeepSeek开发的一些BUG记录&解决方案
人工智能·学习·unity·大模型·deepseek
妙为1 天前
unreal engine5制作动作类游戏时,我们使用刀剑等武器攻击怪物或敌方单位时,发现攻击特效、伤害等没有触发
游戏·游戏引擎·虚幻·碰撞预设
dangoxiba1 天前
[Unity Demo]从零开始制作空洞骑士Hollow Knight第十三集:制作小骑士的接触地刺复活机制以及完善地图的可交互对象
游戏·unity·visualstudio·c#·游戏引擎
电子科技圈1 天前
IAR全面支持国科环宇AS32X系列RISC-V车规MCU
人工智能·嵌入式硬件·mcu·编辑器
先生沉默先2 天前
使用Materialize制作unity的贴图,Materialize的简单教程,Materialize学习日志
学习·unity·贴图
安冬的码畜日常2 天前
【工欲善其事】巧用 Sublime Text 生成带格式的 HTML 片段
编辑器·html·typora·sublime text·代码片段·snippet