Unity 编辑器常用方法

news/2024/10/18 5:50:54/

unity编辑器开发

  • 右键菜单注解
  • 菜单栏注解
  • 脚本右键注解
  • PrefabUtility 预制体工具
    • 1.常用方法:
      • 1. InstantiatePrefab(PrefabAssetPath):
      • 2. InstantiatePrefabAsGameObject(PrefabAsset):
      • 3. ReplacePrefab(GameObject, PrefabAsset, ReplacePrefabOptions):
      • 4. ConnectGameObjectToPrefab(GameObject, PrefabAsset):
    • 2.常用事件:
      • 1. prefabInstanceUpdated:
  • 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: 在指定的延迟时间后触发的事件。
      • 2. playModeStateChanged: 当播放模式的状态发生变化时触发的事件。
      • 3. playModeStateChanged (delegate):
      • 4. sceneOpened: 当场景被打开时触发的事件。
      • 5. sceneClosing: 当场景即将关闭时触发的事件。
      • 6. hierarchyChanged:当hierarchy中的结构发生改变时触发

右键菜单注解

  1. CreateAssetMenu - 针对ScriptableObject
[CreateAssetMenu(menuName = "ScriptObject/RoadsSetting")]
public class Test{}

菜单栏注解

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

其中priority为排序优先级

脚本右键注解

  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();}}}}
}

http://www.ppmy.cn/news/1115791.html

相关文章

ArrayMap 和 HashMap的区别

ArrayMap 和 HashMap 都是在 Android 开发中常用的数据结构&#xff0c;用于存储键值对。它们之间的主要区别在于内部实现和适用场景。 内部实现: ArrayMap 使用两个数组&#xff0c;一个用于存储键&#xff0c;一个用于存储值&#xff0c;通过索引进行对应。这种实现方式使得 …

分布式锁/乐观锁/悲观锁/死锁

分布式锁 分布式锁是一种用于在分布式系统中实现并发控制的机制。在分布式环境中&#xff0c;多个节点或进程同时访问共享资源时&#xff0c;需要确保数据的一致性和正确性。分布式锁提供了一种方法来协调并发访问&#xff0c;以避免数据竞争和冲突。 目的&#xff1a;分布式锁…

在Android studio 创建Flutter项目运行出现问题总结

在Android studio 中配置Flutter出现的问题 A problem occurred configuring root project ‘android’出现这个问题。解决办法 首先找到flutter配置的位置 在D:\xxx\flutter\packages\flutter_tools\gradle位置中的flutter.gradle buildscript { repositories { googl…

element 搜索框静态查询

效果图 代码块 <template><div><!-- 1.产品搜索 --><div class"header"><div class"from"><el-form :inline"true" :model"formInline" class"demo-form-inline"><el-form-item l…

win11 新建markdown文件 添加到右键新建项 无反应(已解决)

需要操作 2 处注册表 1. win R输入【regedit】 定位路径 【计算机\HKEY_CLASSES_ROOT.md】 点击.md文件夹, 双击右侧(默认)项&#xff0c;将数值数据改为【Typora.md】 右键.md文件夹 > 新建 > 项&#xff0c;把新建的项命名为【ShellNew】 右键ShellNew > 新建 >…

thrift的简单使用

写在前面 本文一起看下一种由facebook出品的rpc框架thrift。 源码 。 1&#xff1a;开发步骤 1:编写thrift idl文件 2&#xff1a;根据thrift idl文件生成java模板代码 3&#xff1a;继承模板代码的*.Iface接口给出server的具体服务实现 4&#xff1a;使用模板的HelloWorldSe…

Java毕业设计-基于SpringBoot的租房网站的设计与实现

大家好&#xff0c;今天为大家打来的是基于SpringBoot的租房网站的设计与实现 博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 一、前言介绍二、主…

(超详解)堆排序+(图解)

目录&#xff1a; 1:如何建堆(两种方法) 2:两种方法建堆的时间复杂度分析与计算 3:不同类型的排序方式我们应该如何建堆 文章正式开始&#xff1a; 1&#xff1a;如何建堆 在实现堆排序之前我们必须得建堆&#xff0c;才能够实现堆排序 首先在讲解如何建堆之前让我们先来回顾一…