美文网首页UnityEditorunity
[Unity 3d] EditorButton (Inspect

[Unity 3d] EditorButton (Inspect

作者: 雨落随风 | 来源:发表于2019-05-29 23:48 被阅读67次

    在简书上整理一个与 Unity 有关的一系列 GitHub 仓库,希望能帮助到有心人。
    笔者计划以一篇文章一个功能点的方式展开,拾取超方便!

    简介

    笔者今天要推荐的仓库叫 EditorButton
    看名字就知道这个是编辑器模式下使用的啦!对,猜的没错,他就是在 Inspector 绘制按键的。
    不管是编辑器在运行时还是没有运行,button Mapping的逻辑都可以被执行。

    其具备以下特性:

    • Multiple arguments - 可指定多参数
    • Arguments can have default values - 支持带默认值的参数
    • Coroutines are automatically started - 支持携程的运行
    • Return values are printed to the console - 支持返回值(返回值将由 Console 输出)

    演示

    转载,侵立删

    使用

    只需要将属性[EditorButton]写在需要被测试的方法上方即可:

        [EditorButton]
        public void PrintStuff(float floatVal, int intVal, string stringVal, bool boolVal) 
        {
            Debug.Log("floatVal "+floatVal);
            Debug.Log("intVal "+intVal);
            Debug.Log("stringVal "+stringVal);
            Debug.Log("boolVal "+boolVal);
        }
    

    上面代码得到的 Inspector 绘制效果如下:



    指定好参数后执行,即可得到对应的输出:


    情景实战

    实际使用中,笔者多用于预制体动态配置和生成,以及场景文件的管理,因为播放时可以出效果但停止后会重置。
    实例:场景中存在N多模型,你要随机减一半去,然后呢,还要能恢复回去,那该怎么做呢?
    借助 EditorButton 原来可以如此简单:

    using System.Collections.Generic;
    using UnityEngine;
    
    public class NewBehaviourScript : MonoBehaviour
    {
        [SerializeField] Transform target;
        [SerializeField] List<Transform> HidedCubes; //记录被隐藏的对象(必须被序列化在面板上,只有这样才会记录在YAML文件中)
        //演示测试 Random.Range API (返回随机数包含最小值不含最大值)
        [EditorButton]
        private void TestRandom()
        {
            for (int i = 0; i < 20; i++)
            {
                Debug.Log(Random.Range(0, 2));
            }
        }
    
        //打散这些cube
        [EditorButton]
        private void SeparateCube()
        {
            foreach (Transform item in target)
            {
                item.position = new Vector3(Random.Range(0, 4), Random.Range(0, 4), Random.Range(0, 4));
            }
        }
        //随机隐掉一半左右的Cube
        [EditorButton]
        private void HideHalf()
        {
            foreach (Transform item in target)
            {
                if (Random.Range(0, 2) == 0)
                {
                    item.gameObject.SetActive(false);
                    HidedCubes.Add(item);
                }
            }
        }
        //将随机隐掉的一半在显出来
        [EditorButton]
        private void ShowHidedCube()
        {
            foreach (Transform item in HidedCubes)
            {
                item.gameObject.SetActive(true);
            }
            HidedCubes.Clear(); //清除记录
        }
    }
    
    

    效果如下:



    是不是挺有意思的:

    • 演示了 Random.Range API 的测试,
    • 演示了场景文件的管理 - Cube随机分布
    • 实现了上面提到的需求 - Cube随机隐藏一半且可恢复显示

    结语

    可以这么理解:EditorButton 就是直接在Inspector面板上给我们写的逻辑(方法)植入一个入口。
    这样一来,方便咱们对撰写的功能点做单例测试啦~

    链接

    EditorButton

    备注:该组件不能与 InspectorFoldoutGroup 等其他编辑器扩展 共存在工程中,因为它的存在会覆盖其他编辑器扩展的绘制。

    上面的内容童靴们还喜欢吗,本文集持续更新ing哦!

    相关文章

      网友评论

        本文标题:[Unity 3d] EditorButton (Inspect

        本文链接:https://www.haomeiwen.com/subject/cthptctx.html