Unity3D的菜單及編輯器擴展

1、菜單欄擴展

  先看一下咱們要實現的效果:編輯器

  也就是在Unity3D的菜單欄中添加屬於咱們本身的菜單。同理你也能夠把子菜單添加進系統菜單來定製屬於自已開發習慣的功能。ide

  下面咱們來看代碼:this

  

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");
    }
}

  我遇到的坑:spa

    首先要導入命名空間using UnityEditor;3d

    [MenuItem]後的true是不可用 false是可用。code

    同理後面的值也是控制子菜單的順序的,值越小,越在上面。blog

 

2、編輯器擴展

  先看一下結果:ip

  這組代碼實現的就是上面的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()
        {

        }
    }
}

  最後一個類是用枚舉來實現下拉列表的。今天就到這裏了,在寫代碼中遇到任何問題請聯繫我。get

相關文章
相關標籤/搜索