Unity Editor扩展入门(2) Unity Editor扩展功能的标准使用

Unity Editor扩展入门(2) Unity Editor扩展功能的标准使用

Translated by Xdestiny
2018/2/25

日文原文地址:http://anchan828.github.io/editor-manual/web/part2-standardextension.html

渣翻,有些东西相当不确定,禁止转载

Unity内部已经使用了各种各样的Editor扩展功能。用户只要添加上特性标签,就能够自由的使用这些扩展功能。在这一章节中,会使用那些已经准备好的扩展功能,同时了解一下Editor功能扩展是怎么一回事。

2.1 改变Inspector的表现形式

Range

这个关键字使得用户可以使用Slider对类似于intfloatlongdouble这一类的数值类型进行改变。
开发的时候,有些变量的设置是有一定限制的。在通常的Inspector上,数值的表示有可能是不合适的。这个的解决方法之一是使用slider进行操作。并且该方法能够增加操作性。
image

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;
}

Multiline / TextArea

Textfile默认情况下是只有一行的,但同时也能变成复数行显示的TextAreaMultilineTextArea功能大致上相同,不过Multiline有着[无法依据宽度自动换行]和[不能使用scroll表示]的限制
image

using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour
{
    [Multiline(5)]
    public string multiline;

    [TextArea(3, 5)]
    public string textArea;
}

在Inspector上追加功能

ContextMenuItem

能够对在Inspector上表示的变量追加Context Menu。另外,在Component中虽然有对整体进行reset的功能,但没有对于单个变量进行reset的功能。因此,这时候就需要使用ContextMenuItem添加这个功能
image

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

颜色的修改可以使用颜色拾取器。ColorUsage不但可以设置Alpha通道是否开启,还可以变更为用于HDR的颜色拾取器。
image

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的外观

虽然无法直接对属性产生作用,但让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;
}

Space

可以任意留白。在属性之间留白,看起来会更容易一些
image

using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    [Space(16)]
    public string str1;

    [Space(48)]
    public string str2;
}

Tooltip

想要在Inspector上确认属性的说明时可以使用
image

using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    [Tooltip("これはツールチップです")]
    public long tooltip;
}

HideInInspector

image

using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    public string str1;

    [HideInInspector]
    public string str2;
}

让Inspector更加便利

RequireComponent

这个是用来限制某个Component至少有一个要添加上来。
对于需要其他ComponentScript来说,经常会用到这个。例如,与Animator相关的Script,肯定需要一个AnimatorComponent。如果不小心忘掉添加必要的Component,肯定会报错。为了事先防止这种错误,就可以使用RequireCompoment。
带有RequireComponent的Script被添加上来的时候,被RequireComponent指定的Component也会自动的添加上去。如果已经添加过了,那么什么都不会发什么。并且,如果尝试删除指定的Component的话,会弹出一个对话框显示[无法删除]
image

using UnityEngine;

[RequireComponent(typeof(Animator))]
public class NewBehaviourScript : MonoBehaviour
{
    Animator animator;

    void Awake ()
    {
        animator = GetComponent<Animator> ();
    }
}

DisallowMultipleComponent

这个属性用来禁止在一个GameObject上添加多个同样的Component
有的Component只要添加一个就好,但有时会不小心添加两个相同的Component。添加两个相同的Component很容易陷入[明明代码是对的但为什么效果不对]这种原因不明的状态。并且这样的原因是很难被发现的。想要回避这个问题就需要使用DisallowMultipleComponent。
image
子类也能够发挥DisallowMultipleComponent的效果

using UnityEngine;

public class NewBehaviourScript : Base
{
}
using UnityEngine;

[DisallowMultipleComponent]
public class Base : MonoBehaviour
{
}

FormerlySerializedAs

这个属性是在修改变量名的时候,将数据从旧的变量名复制到新的变量名里面去。
为了在Inspector上表示,序列化的数据通过变量进行保存。因此,修改变量名后,序列化的数据并不会被继承过去,而是成为初始化的值。为了避免这个问题可以使用FormelrluSerializedAs

using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    [SerializeField]
    string hoge;
}

在Inspector上输入值
image
将变量名由hoge改成fuga

using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    [SerializeField]
    string fuga;
}

紧接着在Inspector上的文本没有被继承,什么都没有显示
image
在这里使用FormerlySerializedAs,数据就变得可以继承了。

using UnityEngine;
using UnityEngine.Serialization;

public class NewBehaviourScript : MonoBehaviour
{
    [SerializeField]
    [FormerlySerializedAs("hoge")]
    string fuga;
}

image
在这里需要注意一点,就是变量名的需改、FormerlySerializedAs属性的添加以及旧变量名的指定必须是同时进行的。在Script编译时,无论是不小心把所需要的数据给废弃了,还是修改了变量名(第一次编译时),忘了添加上FormerlySerializedAs。虽然慌慌张张的添加上(第二次编译),但是所有的数据还是都丢失了。

AddComponentMenu

Component菜单中添加项目
全部的Script都集中在了Component/Scripts下面。但是制作常用ScriptComponent的时,有时会想要将它们整理到一个目录底下。比如制作与UI相关的Script的时候。
image
这个时候使用AddComponentMenu就能够生成菜单。添加了AddComponentMenuScript会显示在其他地方的菜单中,而在Component/Scripts会被删除

using UnityEngine;

[AddComponentMenu("MyUI/Tween Color")]
public class TweenColor : MonoBehaviour
{
}

image

享受游戏开发

ExecuteInEditMode

这个属性可以使即使没有运行游戏,继承了MonoBehaviourComponent中的主要函数也能够运行。调用的时机是GameObject被更新的时候。双击场景资源,引擎就会加载场景,此时不但AwakeStart函数以及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");
    }
}

ContextMenu

ComponentContextMenu中选择方法实行。虽然和ContextMentItem的名字和功能都很相似,不过添加ContextMenu的地方不太一样。
image

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

译注:本节无法复现原文所说的功能。但SelectionBase还是有它自己的效果的

SceneView中选中Object的时候,需要实现[高亮被选中的物体][决定GameObject的选择顺序]之类的功能的时候使用。
通常,在SceneView中选中GameObejct的时候,是GameObject的根物体会高亮显示。
image
编写下面的Script,并添加到子物体上。

using UnityEngine;

[SelectionBase]
public class NewBehaviourScript : MonoBehaviour
{
}

接下来单击根物体,会发现变成子物体被选中。
image
接下来再次单击GameObject,会发现根物体被选中。像这样,通过添加SelectionBase属性,使得GameObject从最下层开始被选中。
image

Unity Editor扩展是指通过编写代码来扩展Unity编辑器的功能。通过创建自定义的编辑器窗口、工具栏按钮、菜单项和面板等,开发者可以为自己的项目添加一些定制化功能,以提高开发效率和用户体验。 Unity提供了一套API来实现编辑器扩展,开发者可以利用这些API去创建自定义的编辑器界面。首先,我们需要创建一个继承自EditorWindow或Editor类的脚本,然后在这个脚本中实现我们想要的功能。比如,我们可以在自定义的编辑器窗口中创建一些GUI元素,如按钮、文本框、下拉菜单等,用于控制场景中的对象、调整参数或执行特定的操作。 另外,Unity还提供了一些常用的工具类,如SerializedObject、SerializedProperty等,以便开发者可以访问和修改Unity对象的属性。使用这些工具类,我们可以在编辑器扩展中实现对象的序列化、反序列化和检查等功能。 在开发过程中,Unity的编辑器扩展还可以与自定义的脚本进行交互。通过注册自定义的菜单项、工具栏按钮或快捷键,我们可以在编辑器中快速调用脚本的功能,并在自定义界面中显示脚本的运行结果。 总结来说,Unity Editor扩展是一种强大的工具,它可以帮助开发者提高开发效率和用户体验。通过编写代码,我们可以创建出各种各样的自定义编辑器界面,以满足不同项目的需求。无论是增加交互性、优化工作流程还是增加特定的功能Unity的编辑器扩展都能提供灵活和强大的解决方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值