【Unity编辑器扩展入门】第 2 章 标准编辑器编辑器

目录

2.1 更改检查员的外观

Range 滑块/限制范围

Multiline / TextArea 多行文本

2.2 添加要在检查器中处理的功能

ContextMenuItem 给变量增加方法

ColorUsage 更改颜色alpha、HDR。

2.3 使 Inspector 看起来像

Header 标题

Space可以提供垂直边距。

Tooltip 当鼠标光标移入显示提示

HideInInspector 在监视面板隐藏

2.4 使 Inspector 更有用

RequireComponent 该属性具有“ 必须附加至少一个指定组件 ” 的限制

DisallowMultipleComponent  禁止将同一组件附加到多个游戏对象。

FormerlySerializedAs 更改变量名称时将数据迁移到新变量名称。

AddComponentMenu

2.5 简化游戏开发

ExecuteInEditMode

ContextMenu

SelectionBase


2.1 更改检查员的外观

Range 滑块/限制范围

这是一个函数,可以使用滑块更改数值,如 int, float, long, double 等

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 多行文本

默认值为单行 TextField,但您可以将其更改为多行 TextArea。 Multiline 和TextArea 具有几乎相同的功能,但 Multiline 具有诸如“自动换行不适合宽度”和“无滚动条”等限制。除非有特殊原因,否则我建议使用 TextArea。

using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour
{
[Multiline(5)]
public string multiline;
[TextArea(3, 5)]
public string textArea;
}

2.2 添加要在检查器中处理的功能

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。

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

2.3 使 Inspector 看起来像

它不直接作用于属性,但可以使其更加明显或装饰性。

通过在一定数量的属性中添加标题,可以使其易于理解。

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可以提供垂直边距。

using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
[Space(16)]
public string str1;
[Space(48)]
public string str2;
}

Tooltip 当鼠标光标移入显示提示

如果要在检查器中检查属性的描述,请使用此选项。

using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
[Tooltip("当鼠标光标放在【工具提示】上时显示工具提示")]
public long tooltip;
}

HideInInspector 在监视面板隐藏

using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
public string str1;
[HideInInspector]
public string str2;
}

2.4 使 Inspector 更有用

RequireComponent 该属性具有“ 必须附加至少一个指定组件 ” 的限制

使用 RequireComponent 附加脚本会自动附加 RequireComponent 指定的组件。如果它已经附加,它什么都不做。如果您尝试删除指定的组件,将显示一个对话框,显示“无法删除”。

using UnityEngine;
[RequireComponent(typeof(Animator))]
public class NewBehaviourScript : MonoBehaviour
{
Animator animator;
void Awake ()
{
animator = GetComponent<Animator> ();
}}

DisallowMultipleComponent  禁止将同一组件附加到多个游戏对象。

即使对于继承的类, DisallowMultipleComponent 运行良好。

using UnityEngine;
public class NewBehaviourScript : Base
{ }
using UnityEngine;
[DisallowMultipleComponent]
public class Base : MonoBehaviour
{ }

FormerlySerializedAs 更改变量名称时将数据迁移到新变量名称。

已经序列化的数据(如检查器中所示)以变量名称作为路径存储。如果在此处更改变量名称,则序列化数据将被初始化而不会被接管。这是因为路径不能引用该值。无法检测到变量名称已被更改,这是一个令人生畏的问题。使用FormerlySerializedAs 来解决此问题。

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

在检查器上输入值。

将变量名称从 hoge 更改为 fuga。

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

然后,将不会继承在检查器中输入的字符串,也不会显示任何内容。

因此,它将通过使用 FormerlySerializedAs 来接管。
 

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

这里应该注意, 更改变量名,添加 FormerlySerializedAs 属性和指定 oldName必须同时完成。编译脚本会导致丢弃不必要的数据,尽管更改了变量名(第一次编译),我忘了指定 FormerlySerializedAs,即使添加了它(第二次编译),数据已经是它已被摧毁。第二次编译将破坏数据。

AddComponentMenu

将一个菜单项添加到“ 组件”菜单。

2.5 简化游戏开发

ExecuteInEditMode

即使游戏没有播放,也会调用继承 MonoBehaviour 的组件的主要功能。在更新游戏对象时调用它。通过双击场景资源加载场景时,将调用 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");
}
}

ContextMenu

从组件的上下文菜单中运行该方法。 ContextMenuItem 名称和功能类似,但要添加的上下文菜单的位置不同。

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

当在场景视图中选择对象时,在“指定所选游戏对象”和“ 确定游戏对象的选择顺序 ”时使用它。
通常,在场景视图中选择对象时,会选择根游戏对象。

using UnityEngine;
[SelectionBase]
public class NewBehaviourScript : MonoBehaviour
{

}

测试:

1.新建空物体,在空物体下创建Cube,Scene窗口下连续点击Cube,空物体不会被选中,只能选中Cube

2.空物体加上加上带SelectionBase便签的脚本,Scene窗口下连续点击Cube,空物体和Cube轮流切换选中状态

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack Yan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值