Translated by Xdestiny
2018/2/25
日文原文地址:http://anchan828.github.io/editor-manual/web/part2-standardextension.html。
渣翻,有些东西相当不确定,禁止转载
Unity内部已经使用了各种各样的Editor扩展功能。用户只要添加上特性标签,就能够自由的使用这些扩展功能。在这一章节中,会使用那些已经准备好的扩展功能,同时了解一下Editor功能扩展是怎么一回事。
这个关键字使得用户可以使用Slider对类似于int
,float
,long
,double
这一类的数值类型进行改变。
开发的时候,有些变量的设置是有一定限制的。在通常的Inspector上,数值的表示有可能是不合适的。这个的解决方法之一是使用slider进行操作。并且该方法能够增加操作性。
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour
{
[Range(1, 10)]
public int num1;
[Range(1, 10)]
public float num2;
[Range(1, 10)]
public long num3;
[Range(1, 10)]
public double num4;
}
Textfile
默认情况下是只有一行的,但同时也能变成复数行显示的TextArea
。Multiline
和TextArea
功能大致上相同,不过Multiline
有着[无法依据宽度自动换行]和[不能使用scroll表示]的限制
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour
{
[Multiline(5)]
public string multiline;
[TextArea(3, 5)]
public string textArea;
}
能够对在Inspector上表示的变量追加Context Menu
。另外,在Component
中虽然有对整体进行reset的功能,但没有对于单个变量进行reset的功能。因此,这时候就需要使用ContextMenuItem
添加这个功能
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
[ContextMenuItem ("Random", "RandomNumber")]
[ContextMenuItem ("Reset", "ResetNumber")]
public int number;
void RandomNumber ()
{
number = Random.Range (0, 100);
}
void ResetNumber ()
{
number = 0;
}
}
颜色的修改可以使用颜色拾取器。ColorUsage
不但可以设置Alpha通道是否开启,还可以变更为用于HDR的颜色拾取器。
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
public Color color1;
[ColorUsage (false)]
public Color color2;
[ColorUsage (true, true, 0, 8, 0.125f, 3)]
public Color color3;
}
虽然无法直接对属性产生作用,但让Inspector的外观更加容易观察是可能的
在属性上添加一定程度的标题,会让人更加容易理解
![image]http://anchan828.github.io/editor-manual/web/images/part2-standardextension/ss03.png)
using UnityEngine;
using System;
public class NewBehaviourScript : MonoBehaviour
{
[Header("Player Settings")]
public Player player;
[Serializable]
public class Player
{
public string name;
[Range(1,100)]
public int hp;
}
[Header("Game Settings")]
public Color background;
}
可以任意留白。在属性之间留白,看起来会更容易一些
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
[Space(16)]
public string str1;
[Space(48)]
public string str2;
}
想要在Inspector上确认属性的说明时可以使用
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
[Tooltip("これはツールチップです")]
public long tooltip;
}
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
public string str1;
[HideInInspector]
public string str2;
}
这个是用来限制某个Component
至少有一个要添加上来。
对于需要其他Component
的Script
来说,经常会用到这个。例如,与Animator
相关的Script
,肯定需要一个Animator
的Component
。如果不小心忘掉添加必要的Component
,肯定会报错。为了事先防止这种错误,就可以使用RequireCompoment。
带有RequireComponent的Script
被添加上来的时候,被RequireComponent指定的Component
也会自动的添加上去。如果已经添加过了,那么什么都不会发什么。并且,如果尝试删除指定的Component
的话,会弹出一个对话框显示[无法删除]
using UnityEngine;
[RequireComponent(typeof(Animator))]
public class NewBehaviourScript : MonoBehaviour
{
Animator animator;
void Awake ()
{
animator = GetComponent ();
}
}
这个属性用来禁止在一个GameObject
上添加多个同样的Component
有的Component
只要添加一个就好,但有时会不小心添加两个相同的Component。添加两个相同的Component
很容易陷入[明明代码是对的但为什么效果不对]这种原因不明的状态。并且这样的原因是很难被发现的。想要回避这个问题就需要使用DisallowMultipleComponent。
子类也能够发挥DisallowMultipleComponent的效果
using UnityEngine;
public class NewBehaviourScript : Base
{
}
using UnityEngine;
[DisallowMultipleComponent]
public class Base : MonoBehaviour
{
}
这个属性是在修改变量名的时候,将数据从旧的变量名复制到新的变量名里面去。
为了在Inspector上表示,序列化的数据通过变量进行保存。因此,修改变量名后,序列化的数据并不会被继承过去,而是成为初始化的值。为了避免这个问题可以使用FormelrluSerializedAs
。
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
[SerializeField]
string hoge;
}
在Inspector上输入值
将变量名由hoge
改成fuga
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
[SerializeField]
string fuga;
}
紧接着在Inspector上的文本没有被继承,什么都没有显示
在这里使用FormerlySerializedAs
,数据就变得可以继承了。
using UnityEngine;
using UnityEngine.Serialization;
public class NewBehaviourScript : MonoBehaviour
{
[SerializeField]
[FormerlySerializedAs("hoge")]
string fuga;
}
在这里需要注意一点,就是变量名的需改、FormerlySerializedAs属性的添加以及旧变量名的指定必须是同时进行的。在Script
编译时,无论是不小心把所需要的数据给废弃了,还是修改了变量名(第一次编译时),忘了添加上FormerlySerializedAs
。虽然慌慌张张的添加上(第二次编译),但是所有的数据还是都丢失了。
在Component
菜单中添加项目
全部的Script
都集中在了Component/Scripts下面。但是制作常用ScriptComponent
的时,有时会想要将它们整理到一个目录底下。比如制作与UI相关的Script
的时候。
这个时候使用AddComponentMenu就能够生成菜单。添加了AddComponentMenu
的Script
会显示在其他地方的菜单中,而在Component/Scripts会被删除
using UnityEngine;
[AddComponentMenu("MyUI/Tween Color")]
public class TweenColor : MonoBehaviour
{
}
这个属性可以使即使没有运行游戏,继承了MonoBehaviour
的Component
中的主要函数也能够运行。调用的时机是GameObject
被更新的时候。双击场景资源,引擎就会加载场景,此时不但Awake
、Start
函数以及Inspector上的参数会发生变化,并且也会调用Update
。另外,OnGUI
也会运行,因此在编辑器上会周期性的绘制GUI,使得GUI在编辑器上保持一直显示。
using UnityEngine;
[ExecuteInEditMode]
public class NewBehaviourScript : MonoBehaviour
{
[Range(0,10)]
public int number;
void Awake ()
{
Debug.Log ("Awake");
}
void Start ()
{
Debug.Log ("Start");
}
void Update ()
{
Debug.Log ("Update");
}
}
从Component
的ContextMenu
中选择方法实行。虽然和ContextMentItem
的名字和功能都很相似,不过添加ContextMenu
的地方不太一样。
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
[Range (0, 10)]
public int number;
[ContextMenu ("RandomNumber")]
void RandomNumber ()
{
number = Random.Range (0, 100);
}
[ContextMenu ("ResetNumber")]
void ResetNumber ()
{
number = 0;
}
}
译注:本节无法复现原文所说的功能。但
SelectionBase
还是有它自己的效果的
在SceneView
中选中Object
的时候,需要实现[高亮被选中的物体][决定GameObject
的选择顺序]之类的功能的时候使用。
通常,在SceneView
中选中GameObejct
的时候,是GameObject
的根物体会高亮显示。
编写下面的Script
,并添加到子物体上。
using UnityEngine;
[SelectionBase]
public class NewBehaviourScript : MonoBehaviour
{
}
接下来单击根物体,会发现变成子物体被选中。
接下来再次单击GameObject
,会发现根物体被选中。像这样,通过添加SelectionBase
属性,使得GameObject
从最下层开始被选中。