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中的结构发生改变时触发
右键菜单注解
- CreateAssetMenu - 针对ScriptableObject
[CreateAssetMenu(menuName = "ScriptObject/RoadsSetting")]
public class Test{}
菜单栏注解
- MenuItem
[MenuItem("Tools/做一件事",priority = 0)]void Todo(){Debug.Log("做一件事");}
其中priority为排序优先级
脚本右键注解
- 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();}}}}
}