工欲善其事必先利其器
引言: 在项目开发中,编辑器扩展为开发者提供了开发自定义工具的功能,让开发者更加便利地使用编辑器开发项目。如若博客中存在错误,还请不吝赐教。所有参考的博客或者视频来源将在文末展示。
开发版本: Unity 2018.1.3f1
相关博客传送门
一、编辑器开发入门
二、编辑器的相关特性
三、自定义Inspector面板
四、创建编辑器窗体
五、Gizmos辅助调试工具
六、扩展Scene视图
七、数组或list集合的显示方式
八、EditorPrefs、ScriptableObject、Undo
九、GUIStyle、GUISkin
十、AssetPostprocessor资源导入管线
Unity编辑器提供了大量的特性,帮助开发者更加便利地开发项目,这里主要介绍三种类别常用的特性,需要注意一些特性属于System、UnityEngine空间,一些又属于UnityEditor空间,并提供一个自定义属性绘制器的案例。此案例来自泰课的Unity编辑器扩展开发精讲。
[COntextMenuItem("Reset Value","Reset")]
public int intValue = 100;
private void Reset()
{
intValue = 0;
}
P.S. 多个特性可以用逗号隔开,例如:[SerializeField, Range(0,5)]
using UnityEngine;
//定义特性
public class ShowTimeAttribute : PropertyAttribute
{
public readonly bool ShowHour;
//定义构造函数
public ShowTimeAttribute(bool isShowHour = false)
{
ShowHour = isShowHour;
}
}
using UnityEngine;
using UnityEditor;
//用于绘制特性,该类需要放到Editor中
[CustomPropertyDrawer(typeof(ShowTimeAttribute))]
public class TimeDrawer : PropertyDrawer
{
//设置绘制的区域高度
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
return EditorGUI.GetPropertyHeight(property) * 2;
}
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
if (property.propertyType == SerializedPropertyType.Integer)
{
property.intValue = EditorGUI.IntField(new Rect(position.x, position.y, position.width, position.height / 2), label, Mathf.Max(0, property.intValue));
EditorGUI.LabelField(new Rect(position.x, position.y + position.height / 2, position.width, position.height / 2), "", TimeConvert(property.intValue));
}
else
{
EditorGUI.HelpBox(position, "To use the Time Atribute," + label.ToString() + "must be int", MessageType.Error);
}
}
private string TimeConvert(int value)
{
ShowTimeAttribute time = attribute as ShowTimeAttribute;
if (time != null)
{
if (time.ShowHour)
{
int hours = value / (60 * 60);
int minutes = (value % (60 * 60)) / 60;
int seconds = value % 60;
return string.Format("{0}:{1}:{2}(H:M:S)", hours, minutes.ToString().PadLeft(2, '0'), seconds.ToString().PadLeft(2, '0'));
}
}
else
{
int minutes = (value % (60 * 60)) / 60;
int seconds = value % 60;
return string.Format("{0}:{1}(M:S)", minutes.ToString().PadLeft(2, '0'), seconds.ToString().PadLeft(2, '0'));
}
return string.Empty;
}
}
//测试
public class Test : MonoBehaviour
{
[ShowTime(true)]
public int time = 3605;
}
Unity 特性(Attribute)总览