zoukankan      html  css  js  c++  java
  • Unity3D的菜单及编辑器扩展

    一、菜单栏扩展

      先看一下我们要实现的效果:

      也就是在Unity3D的菜单栏中添加属于我们自己的菜单。同理你也可以把子菜单添加进系统菜单来定制属于自已开发习惯的功能。

      下面我们来看代码:

      

    using UnityEditor;
    public class Editor : MonoBehaviour {
        [MenuItem("我是菜单/历史信息", false, 1)]
        static void Show() {
            print("历史信息");
        }
        [MenuItem("我是菜单/当前信息", false,2)]
        static void Current() {
            print("当前信息");
        }
    
        [MenuItem("我是菜单/随便信息",true, 1)]
        static void Historyt()
        {
            print("随便信息");
        }
        [MenuItem("我是菜单/我有子菜单/子菜单1")]
        static void Menu1() {
            print("子菜单1");
        }
        [MenuItem("我是菜单/我有子菜单/子菜单2")]
        static void Menu2() {
            print("子菜单2");
        }
    }

      我遇到的坑:

        首先要导入命名空间using UnityEditor;

        [MenuItem]后的true是不可用 false是可用。

        同理后面的值也是控制子菜单的顺序的,值越小,越在上面。

    二、编辑器扩展

      先看一下结果:

      这组代码实现的就是上面的InspectorMenu脚本上的功能了。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using Tool;
    
    public class InspectorMenu : MonoBehaviour {
        private Texture t;
        public Rect r;
        public string s;
        public float slider;
       
        [HideInInspector]
    
        [Range(0, 100)]
        public float health;
    
        public float t1;
        public float t2;
        public bool isOpen=true;
        public EType et = EType.up;
        public Texture T
        {
            get
            {
                return t;
            }
    
            set
            {
                t = value;
            }
        }
        [Range(0, 60)]
        public float demage;
        [Header("Weapon")]
        public string Weapon;
        public float weaponDamage;
        public string Discrip;
    
    }
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEditor;
    using Tool;
    [CustomEditor(typeof(InspectorMenu))]
    public class InpectorTest : Editor {
    
        bool isSelect;
        bool isO;
        bool isOpen=true;//控制一组属性
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
            InspectorMenu ins = (InspectorMenu)target;
            ins.T = EditorGUILayout.ObjectField("贴图",ins.T,typeof(Texture),true )as Texture;
            ins.r = EditorGUILayout.RectField("坐标", ins.r);
            ins.s = EditorGUILayout.TextField("备注",ins.s);
            ins.slider = EditorGUILayout.Slider("进度条",ins.slider,0f,1f);
            if (ins.health > 80) {
                GUI.color = Color.green;
            }
            if (ins.health < 20) {
                GUI.color = Color.red;
            }
            ins.health = EditorGUILayout.Slider("生命值", ins.health, 0, 100);
            GUI.color = Color.white;
            isSelect = EditorGUILayout.Toggle("是否开启", isSelect);
            GUILayout.Label("……附加信息……");
            isO = EditorGUILayout.BeginToggleGroup("是否开启", isO);
            ins.t1 = EditorGUILayout.FloatField("值1", ins.t1);
            ins.t2 = EditorGUILayout.FloatField("值2", ins.t2);
            ins.isOpen = EditorGUILayout.Toggle("开启", ins.isOpen);
            EditorGUILayout.EndToggleGroup();
            ins.et =(EType)EditorGUILayout.EnumPopup("方向", ins.et);
            //多行文本框
            EditorGUILayout.LabelField("描述");
            ins.Discrip = EditorGUILayout.TextArea(ins.Discrip);
    
            //控制伤害值来显示提示信息
            ins.demage = EditorGUILayout.Slider("伤害值", ins.demage, 0, 60f);
            if (ins.demage < 15) {
    
                EditorGUILayout.HelpBox("伤害值低",MessageType.Info);
            }
            if (ins.demage > 50) {
    
                EditorGUILayout.HelpBox("伤害值过低", MessageType.Warning);
            }
    
            //
            if (isOpen) {
    
                EditorGUI.indentLevel = 1;
                ins.Weapon = EditorGUILayout.TextField("武器名称:",ins.Weapon);
                EditorGUI.indentLevel = 2;
                ins.weaponDamage = EditorGUILayout.Slider("伤害值", ins.weaponDamage, 0, 100f);//失误一:注意菜单上的类型。
    
    
            }
            //一个人物选择按钮
            if (GUILayout.Button("人物选择")) {
                Debug.Log("您进入了人物选择系统");
            }
    
            
        }
    }
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    namespace Tool
    {
        public enum EType{
            up,
            down,
            left,
            right
        
        }
        public class EnumType : MonoBehaviour
        {
    
            // Use this for initialization
            void Start()
            {
    
            }
    
            // Update is called once per frame
            void Update()
            {
    
            }
        }
    }

      最后一个类是用枚举来实现下拉列表的。今天就到这里了,在写代码中遇到任何问题请联系我。

  • 相关阅读:
    LeetCode 42. Trapping Rain Water
    LeetCode 209. Minimum Size Subarray Sum
    LeetCode 50. Pow(x, n)
    LeetCode 80. Remove Duplicates from Sorted Array II
    Window10 激活
    Premiere 关键帧缩放
    AE 「酷酷的藤」特效字幕制作方法
    51Talk第一天 培训系列1
    Premiere 视频转场
    Premiere 暴徒生活Thug Life
  • 原文地址:https://www.cnblogs.com/shuanglu/p/8306479.html
Copyright © 2011-2022 走看看