Administrator
发布于 2024-08-13 / 12 阅读
0
0

Unity Editor/Unity编辑器拓展

Editor

Build-In Attribute

官方文档: Unity - Scripting API: AddComponentMenu (unity3d.com)

AddComponentMenu

AddComponentMenu 属性允许将一个脚本添加到 Component 菜单中,然后你便可以通过 Component ->(你设置的名字)为一个选中的游戏对象创建该脚本,如下所示:

RequireComponent()

RequireComponent()属性会自动帮你添加你需要的组件,如果已经存在则不再重复添加,且不能移除

经过测试,我发现一个问题,如果脚本已经挂在物体身上,然后再修改脚本,为添加 RequireComponent 属性的话,完全不起作用,因此建议大家在用此属性的时候要注意。

ContextMenu()

ContextMenu()属性允许添加一个命令到该组件上,你可以通过右键或者点击设置图标来调用到它(一般用于函数),且是在非运行状态下执行该函数

HelpURL()

HelpURL()提供一个自定义的文档链接,点击组件上的文档图标既能打开到你指定的链接

填写链接时,一定要写上 http:// 或者 https://,否则将无任何反应。

第9行,我们使用了 [Header("BaseInfo")] 为其设置了标题(为“BaseInfo”),如上图所示。

    2. 第10行,我们使用了 [Multiline(5)] 为其 name 属性添加了5行输入,如上图所示,明显输入框变大了

    3. 第12行,我们使用了 [Range(-2,2)] 为其 age 属性指定了一个(-2,2)的范围,并且为其添加了一个滑块

Tooltip()、Space()

Tooptip()属性用于在 Inspector 面板中,当鼠标停留在设置了Tooptip()的属性添加指定的提示;Space()用于为在 Inspector 面板两属性之间添加指定的距离

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[HelpURL("http://139.199.223.9/")]
[AddComponentMenu("Learning/People")]
[RequireComponent(typeof(Rigidbody))]
public class People : MonoBehaviour
{
    // Start is called before the first frame update
    [Header("BaseInfo")]
    [Multiline(5)]
    public string name;
    [Range(-2,2)]
    public int age;
    [ContextMenu("OutputInfo")]
    void OutputInfo()
    {
        print(name + "|" + age);
    }
    
    [Space(100)]
    [Tooltip("用于设置性别")]
    public string sex;
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

Inspector属性面板

EditorGUILayout 编辑器界面布局
这是一个编辑器类,如果想使用它你需要把它放到工程目录下的Assets/Editor文件夹下。编辑器类在UnityEditor命名空间下。所以当使用C#脚本时,你需要在脚本前面加上 “using UnityEditor”引用。

有以下的函数

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
//用于关联脚本
[CustomEditor(typeof(Player))]
//必须继承自Editor,且不需要导入UnityEditor程序集
/*
 *  
 */
public class PlayerInspector : Editor
{
    // Start is called before the first frame update
    Player player;
    bool showWeapons;
    void OnEnable()
    {
        //获取当前编译自定义Inspector的对象
        player = (Player)target;

    }
    public override void OnInspectorGUI()
    {
        //设置整个界面是以垂直方向来布局
        EditorGUILayout.BeginVertical();
        //空行
        EditorGUILayout.Space();
        EditorGUILayout.Space();
        //绘制player的基本信息,新建的输入口,
        EditorGUILayout.LabelField("Base Info");
        player.id= EditorGUILayout.IntField("Player ID", player.id);
        player.playerName = EditorGUILayout.TextField("PlayerNe", player.playerName);
         //空三行
        EditorGUILayout.Space();
        EditorGUILayout.Space();
        EditorGUILayout.Space();

        //绘制Player的背景故事,一片可以写Text的地方
        EditorGUILayout.LabelField("Back Story");
        player.backStory = EditorGUILayout.TextArea(player.backStory, GUILayout.MinHeight(100));

        //空三行
        EditorGUILayout.Space();
        EditorGUILayout.Space();
        EditorGUILayout.Space();
        //使用滑块绘制 Player 生命值,以一个slider的形式
        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();
    }
}

UnityEditor<三>自定义窗口 案例2_guilayoututility.getrect-CSDN博客

Unity动态加载资源和动态脚本挂载的方式_unity动态挂载脚本-CSDN博客

Unity编辑器拓展(一)-MenuItem的使用_unity menuitem-CSDN博客

Unity 编辑器扩展(五)Selection_unity中selection-CSDN博客

Unity 中 Pivot 与 Center,重置模型物体的轴心为中心_unity pivot-CSDN博客


评论