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博客