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. MenuItem](#1. MenuItem)
- 2.AddComponentMenu
- 脚本右键注解
-
- [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{}
菜单栏注解
1. MenuItem
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();
}
}
}
}
}