自动根据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); //开始申请
}
[CreateAssetMenu(menuName = "ScriptObject/RoadsSetting")]
public class Test{}
[MenuItem("Tools/做一件事",priority = 0)]
void Todo(){
Debug.Log("做一件事");
}
其中priority为排序优先级
将脚本注册到Compoment菜单里面
[ContextMenu("自动补空",false,0)]
void AutoAddNull(){
Debug.Log("做一件事");
}
第一个是显示的名称
第二个是“是否为验证函数”,即在为true同名方法执行前会先执行这个函数
第三个是排序优先级
该方法用于在场景中实例化指定路径的预制体,并返回实例化后的游戏对象。
GameObject go = PrefabUtility.InstantiatePrefab((Object)nullPrefabs, transform) as GameObject;
该方法用于在场景中实例化指定的预制体,并返回实例化后的游戏对象。
using UnityEditor;
using UnityEngine;
public class MyScript : MonoBehaviour
{
public GameObject prefab;
[MenuItem("Example/Instantiate Prefab")]
private static void InstantiatePrefab()
{
GameObject prefab = AssetDatabase.LoadAssetAtPath("Assets/Prefabs/MyPrefab.prefab");
if (prefab != null)
{
GameObject instance = PrefabUtility.InstantiatePrefab(prefab) as GameObject;
if (instance != null)
{
// 在场景中实例化预制体后的处理逻辑
}
}
}
}
该方法用于将游戏对象替换为指定的预制体,并返回替换后的预制体。
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)
{
// 替换为预制体后的处理逻辑
}
}
}
该方法用于将游戏对象连接到指定的预制体,并将其标记为预制体的实例。
using UnityEditor;
using UnityEngine;
public class MyScript : MonoBehaviour
{
public GameObject prefab;
[ContextMenu("Connect to Prefab")]
private void ConnectToPrefab()
{
PrefabUtility.ConnectGameObjectToPrefab(gameObject, prefab);
// 将游戏对象连接到预制体后的处理逻辑
}
}
该方法用于将游戏对象从预制体实例断开连接,并将其转换为普通的游戏对象。
using UnityEditor;
using UnityEngine;
public class MyScript : MonoBehaviour
{
[ContextMenu("Disconnect Prefab Instance")]
private void DisconnectPrefabInstance()
{
PrefabUtility.DisconnectPrefabInstance(gameObject);
// 断开游戏对象与预制体实例关联后的处理逻辑
}
}
当预制体实例更新时触发的事件。可以通过订阅此事件,以在预制体实例发生更改时执行自定义逻辑。
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);
}
}
可以使用此事件来执行延迟调用的逻辑。
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 方法中,我们简单地输出一条日志来表示延迟调用的方法已被执行。
可以通过订阅此事件,在播放模式开始、结束或暂停时执行自定义逻辑。
与上述事件相同,但使用委托(delegate)订阅。
可以通过订阅此事件,在场景被打开后执行自定义逻辑。
可以通过订阅此事件,在场景关闭前执行自定义逻辑。
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();
if (obj != null)
{
obj.OnTransformChildrenChanged();
}
}
}
}
}