Unity 编辑器常用方法

unity编辑器开发

脚本注解

1. RuntimeInitializeOnLoadMethod

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

  • AfterSceneLoad
    在场景加载之后初始化子系统。这意味着子系统将在场景加载完成后进行初始化,并在场景加载后的脚本执行时可用。
  • BeforeSceneLoad
    在场景加载之前初始化子系统。这意味着子系统将在场景加载之前进行初始化,并在加载场景时可用。
  • AfterAssembliesLoaded
    在程序集加载完成后初始化子系统。这意味着子系统将在 Unity 引擎加载所有程序集后进行初始化,并在加载完所有程序集后的脚本执行时可用。
  • BeforeSplashScreen
    在显示启动画面(Splash Screen)之前初始化子系统。这意味着子系统将在显示启动画面之前进行初始化,并在启动画面显示前的脚本执行时可用。
  • SubsystemRegistration
    以便在子系统注册时触发相应的初始化方法。
    [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

[CreateAssetMenu(menuName = "ScriptObject/RoadsSetting")]
public class Test{}

菜单栏注解

1. MenuItem

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

其中priority为排序优先级

2.AddComponentMenu

将脚本注册到Compoment菜单里面

脚本右键注解

1. ContextMenu

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

第一个是显示的名称
第二个是“是否为验证函数”,即在为true同名方法执行前会先执行这个函数
第三个是排序优先级

PrefabUtility 预制体工具

1.常用方法:

1. InstantiatePrefab(PrefabAssetPath):

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

GameObject go = PrefabUtility.InstantiatePrefab((Object)nullPrefabs, transform) as GameObject;

2. InstantiatePrefabAsGameObject(PrefabAsset):

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

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):

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

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):

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

using UnityEditor;
using UnityEngine;

public class MyScript : MonoBehaviour
{
    public GameObject prefab;

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

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

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

using UnityEditor;
using UnityEngine;

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

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

2.常用事件:

1. prefabInstanceUpdated:

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

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: 在指定的延迟时间后触发的事件。

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

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中的结构发生改变时触发

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();
                }
            }
            
        }
        
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值