码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Unity 编辑器常用方法


    unity编辑器开发

    • 脚本注解
      • 1. RuntimeInitializeOnLoadMethod
      • 2. ColorUsage
      • 3. Header
      • 4. SerializeField
      • 5. HideInInspector
      • 6. Space
      • 7. Range
      • 8. Multiline
      • 9.[RequireComponent(typeof())]
      • 10.HelpURL
    • 右键菜单注解
      • 1. CreateAssetMenu - 针对ScriptableObject
    • 菜单栏注解
      • 1. MenuItem
      • 2.AddComponentMenu
    • 脚本右键注解
      • 1. ContextMenu
    • 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. 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); //开始申请
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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
    • 2

    菜单栏注解

    1. MenuItem

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

    其中priority为排序优先级

    2.AddComponentMenu

    将脚本注册到Compoment菜单里面

    脚本右键注解

    1. ContextMenu

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

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

    PrefabUtility 预制体工具

    1.常用方法:

    1. InstantiatePrefab(PrefabAssetPath):

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

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

    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("Assets/Prefabs/MyPrefab.prefab");
            if (prefab != null)
            {
                GameObject instance = PrefabUtility.InstantiatePrefab(prefab) as GameObject;
                if (instance != null)
                {
                    // 在场景中实例化预制体后的处理逻辑
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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)
            {
                // 替换为预制体后的处理逻辑
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    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);
    
            // 将游戏对象连接到预制体后的处理逻辑
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • DisconnectPrefabInstance(GameObject):

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

    using UnityEditor;
    using UnityEngine;
    
    public class MyScript : MonoBehaviour
    {
        [ContextMenu("Disconnect Prefab Instance")]
        private void DisconnectPrefabInstance()
        {
            PrefabUtility.DisconnectPrefabInstance(gameObject);
    
            // 断开游戏对象与预制体实例关联后的处理逻辑
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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.");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在上述示例中,我们使用 [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();
                    if (obj != null)
                    {
                        obj.OnTransformChildrenChanged();
                    }
                }
                
            }
            
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    【深入理解Kotlin协程】CoroutineScope.launch源码追踪扒皮
    我把MySQL运行在Docker上,差点完了……
    1.4_28 Axure RP 9 for mac 高保真原型图 - 案例27【中继器 - 后台管理系统5】功能-弹窗修改数据
    JS 之 事件Event对象详解(属性、方法、自定义事件)
    详解编译和链接!
    Unity C#随笔:关于GC(垃圾回收)
    【Python百日进阶-数据分析】Day119 - Plotly Figure参数: 散点图(一)
    RapidLayout:中英文版面分析推理库
    lvgl 画好一个圆弧arc 要了解的相关知识
    C#实现堆栈结构的定义、入栈、出栈
  • 原文地址:https://blog.csdn.net/a1092484359/article/details/133023848
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号