編輯器擴展之Inspector面板可視化調整

有些時候我們需要將數值暴露在面板中,有時候,只需要用public聲明變量就可以了,或者序列化,但是這2種方法很笨,而且範圍有限,不如用編輯器擴展得方法,下面演示編輯器inspector面板上得可視化用法

首先,新建一個腳本,聲明需要調值得變量:

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{

    public int id;

    public string playerName;
    public string backStory;
    public float health;
    public float damage;

    public float weaponDamage1, weaponDamage2;

    public string shoeName;
    public int shoeSize;
    public string shoeType;

    void Start()
    {
        health = 50;
    }
}

寫完之後,inspector面板上是這樣的:

 

 

然後,寫一個編輯擴展腳本:

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

//CustomEditor(typeof()) 用於關聯你要自定義的腳本
[CustomEditor(typeof(Player))]
//必須要讓該類繼承自Editor,且不需要導入UnityEditor程序集
public class PlayerInspector : Editor
{

    Player player;
    bool showWeapons;

    void OnEnable()
    {
        //獲取當前編輯自定義Inspector的對象
        player = (Player)target;
    }

    //執行這一個函數來一個自定義檢視面板
    public override void OnInspectorGUI()
    {
        //設置整個界面是以垂直方向來佈局
        EditorGUILayout.BeginVertical();

        //空兩行
        EditorGUILayout.Space();
        EditorGUILayout.Space();

        //繪製palyer的基本信息
        EditorGUILayout.LabelField("Base Info");
        player.id = EditorGUILayout.IntField("Player ID", player.id);
        player.playerName = EditorGUILayout.TextField("PlayerName", player.playerName);

        //空三行
        EditorGUILayout.Space();
        EditorGUILayout.Space();
        EditorGUILayout.Space();

        //繪製Player的背景故事
        EditorGUILayout.LabelField("Back Story");
        player.backStory = EditorGUILayout.TextArea(player.backStory, GUILayout.MinHeight(100));

        //空三行
        EditorGUILayout.Space();
        EditorGUILayout.Space();
        EditorGUILayout.Space();

        //使用滑塊繪製 Player 生命值
        player.health = EditorGUILayout.Slider("Health", player.health, 0, 100);

        //根據生命值設置生命條的背景顏色
        if (player.health < 20)
        {
            GUI.color = Color.red;
        }
        else if (player.health > 80)
        {
            GUI.color = Color.green;
        }
        else
        {
            GUI.color = Color.gray;
        }

        //指定生命值的寬高
        Rect progressRect = GUILayoutUtility.GetRect(50, 50);

        //繪製生命條
        EditorGUI.ProgressBar(progressRect, player.health / 100.0f, "Health");

        //用此處理,以防上面的顏色變化會影響到下面的顏色變化
        GUI.color = Color.white;

        //空三行
        EditorGUILayout.Space();
        EditorGUILayout.Space();
        EditorGUILayout.Space();

        //使用滑塊繪製傷害值
        player.damage = EditorGUILayout.Slider("Damage", player.damage, 0, 20);

        //根據傷害值的大小設置顯示的類型和提示語
        if (player.damage < 10)
        {
            EditorGUILayout.HelpBox("傷害太低了吧!!", MessageType.Error);
        }
        else if (player.damage > 15)
        {
            EditorGUILayout.HelpBox("傷害有點高啊!!", MessageType.Warning);
        }
        else
        {
            EditorGUILayout.HelpBox("傷害適中!!", MessageType.Info);
        }

        //空三行
        EditorGUILayout.Space();
        EditorGUILayout.Space();
        EditorGUILayout.Space();

        //設置內容摺疊
        showWeapons = EditorGUILayout.Foldout(showWeapons, "Weapons");
        if (showWeapons)
        {
            player.weaponDamage1 = EditorGUILayout.FloatField("Weapon 1 Damage", player.weaponDamage1);
            player.weaponDamage2 = EditorGUILayout.FloatField("Weapon 2 Damage", player.weaponDamage2);
        }

        //空三行
        EditorGUILayout.Space();
        EditorGUILayout.Space();
        EditorGUILayout.Space();

        //繪製鞋子信息
        EditorGUILayout.LabelField("Shoe");
        //以水平方向繪製
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Name", GUILayout.MaxWidth(50));
        player.shoeName = EditorGUILayout.TextField(player.shoeName);
        EditorGUILayout.LabelField("Size", GUILayout.MaxWidth(50));
        player.shoeSize = EditorGUILayout.IntField(player.shoeSize);
        EditorGUILayout.LabelField("Type", GUILayout.MaxWidth(50));
        player.shoeType = EditorGUILayout.TextField(player.shoeType);
        EditorGUILayout.EndHorizontal(); 
        EditorGUILayout.EndVertical();
    }

}

寫完之後inspector面板上是這樣的

 



作者:Jtro
鏈接:https://www.jianshu.com/p/2f686da4905c
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章