11.Inspector窗口可编辑的变量

11.Unity脚本基础-Inspector窗口可编辑的变量


11.1 知识点

Inspector窗口显示的可编辑内容就是脚本的成员变量

私有和保护的变量无法在 Inspector 窗口显示编辑

private int privateInt1;
protected string protectedStr1;
  • 无法在 Inspector 窗口显示编辑。

[SerializeField] 特性让私有和保护的变量也可以在 Inspector 窗口显示编辑

[SerializeField]
private int privateInt2;

[SerializeField]
protected string protectedStr2;
  • 可以在 Inspector 窗口显示编辑。
  • 在 Inspector 窗口修改变量的值,在 Start 函数打印,可以看到打印的是修改后的值。

公共的变量可以在 Inspector 窗口显示编辑

public int publicInt3 = 10;
public bool publicBool3 = false;
  • 可以在 Inspector 窗口显示编辑。

[HideInInspector]特性让公共的变量无法在 Inspector 窗口显示编辑

[HideInInspector]
public int publicInt4 = 50;
  • 无法在 Inspector 窗口显示编辑。

大部分类型都能在 Inspector 窗口显示编辑

// 在类语句块外声明自定义枚举、结构体、类
public enum E_TestEnum
{
    normalSoldier,
    Player,
    Monster
}

public struct MyStruct
{
    public int age;
    public bool sex;
}

public class MyClass
{
    public int age;
    public bool sex;
}

// 在类语句块内声明一些数据结构
public int[] intArray5;
public List<int> intList5;
public E_TestEnum myTestEnum5;
public GameObject gameObj5;
  • 部分数据结构类型可以在 Inspector 窗口显示编辑。

序列化特性 [System.Serializable] 让自定义类型可以在 Inspector 窗口显示编辑

// 在类语句块外声明自定义结构体、类,并加上序列化特性
[System.Serializable]
public struct YourStruct
{
    public int age;
    public bool sex;
}

[System.Serializable]
public class YourClass
{
    public int age;
    public bool sex;
}

// 在类语句块内加上序列化特性,可以让自定义类型在 Inspector 窗口显示编辑
// 要引用命名空间 System
public YourStruct YourStruct6;
public YourClass YourClass6;

一些辅助特性

分组说明特性 Header

// 为成员分组
// Header特性
//[Header("分组说明")]
[Header("基础属性")]
public int age;
public bool sex;
[Header("战斗属性")]
public int atk;
public int def;

悬停注释 Tooltip

// 悬停注释Tooltip
// 为变量添加说明
//[Tooltip("说明内容")]
[Tooltip("闪避")]
public int miss;

间隔特性 Space

// 间隔特性Space
// 让两个字段间出现间隔
//[Space()]
[Space()]
public int crit;

修饰数值的滑条范围 Range

// 修饰数值的滑条范围Range
//[Range(最小值, 最大值)]
[Range(0, 10)]
public float luck;

多行显示字符串 Multiline

// 多行显示字符串Multiline
// 默认不写参数显示3行
//[Multiline()]
// 写参数就是对应行
[Multiline(5)]
public string tips;

滚动条显示字符串 TextArea

// 滚动条显示字符串TextArea 
// 默认不写参数就是超过3行显示滚动条
//[TextArea()]
// 最少显示3行,最多4行,超过4行就显示滚动条
[TextArea(3, 4)]
public string myLife;

为变量添加快捷方法 ContextMenuItem

// 为变量添加快捷方法ContextMenuItem
//[ContextMenuItem("显示按钮名", "方法名")]
//参数1 显示按钮名
//参数2 方法名 不能有参数和返回值
[ContextMenuItem("重置钱", "SetMoney")]
public int money;

private void SetMoney()
{
    money = 666;
}
// 在Inspector窗口对应的变量右键就会显示添加的快捷方法

为方法添加特性能够在 Inspector 中执行 ContextMenu

// 为方法添加特性能够在Inspector中执行ContextMenu
[ContextMenu("执行测试函数")]
private void TestFun()
{
    print("测试方法");
}

Inspector窗口可编辑的变量机制

  • Inspector窗口中的变量关联的就是对象的成员变量,运行时改变它们就是在改变成员变量。

    • 声明一个变量在Update中每帧打印

      public int int注意 = 100;
      
      private void Update()
      {
          print(int注意);
      }
      
    • 在运行时修改变量时,打印出来的值也会相应修改。

  • 脚本拖曳到 GameObject 对象后,变量会显示默认值。再改变代码中变量默认值,界面上不会改变。想改变界面上的值只能自己手动改变或者让对象卸载脚本后重新加载。

  • 运行中修改的信息不会保存,在运行结束后会恢复运行前的默认值。如果想在运行结束后保持修改,可以在运行时复制组件,运行结束后粘贴组件值。


11.2 知识点代码

using System.Collections.Generic;
using UnityEngine;

//类语句块外
#region 知识点五 大部分类型都能在Inspector窗口显示编辑

//声明自定义枚举,结构体,类
public enum E_TestEnum
{
    normalSoldier,
    Player,
    Monster
}


public struct MyStruct
{
    public int age;
    public bool sex;
}


public class MyClass
{
    public int age;
    public bool sex;
}

#endregion

#region 知识点六 加上序列化特性[System.Serializable]让自定义类型可以在Inspector窗口显示编辑

//声明自定义结构体,类

[System.Serializable]
public struct YourStruct
{
    public int age;
    public bool sex;
}

[System.Serializable]
public class YourClass
{
    public int age;
    public bool sex;
}

#endregion


public class Lesson11_Inspector窗口可编辑的变量 : MonoBehaviour
{


    #region 注意:Inspector窗口显示的可编辑内容就是脚本的成员变量

    #endregion

    #region 知识点一 私有和保护的变量无法在Inspector窗口显示编辑

    private int privateInt1;
    protected string protectedStr1;

    #endregion

    #region 知识点二 添加[SerializeField]特性让私有和保护的变量也可以在Inspector窗口显示编辑

    //加上强制序列化字段特性
    //[SerializeField]
    //所谓序列化就是把一个对象保存到一个文件或数据库字段中去
    [SerializeField]
    private int privateInt2;
    [SerializeField]
    protected string protectedStr2;

    #endregion

    #region 知识点三 公共的变量可以在Inspector窗口显示编辑

    public int publicInt3 = 10;
    public bool publicBool3 = false;

    #endregion

    #region 知识点四  添加[HideInInspector]特性让公共的变量无法在Inspector窗口显示编辑

    //在变量前加上特性
    //[HideInInspector]
    [HideInInspector]
    public int publicInt4 = 50;

    #endregion

    //类语句块内

    #region 知识点五 大部分类型都能在Inspector窗口显示编辑

    //声明一些数据结构 都可以在Inspector窗口显示编辑
    public int[] intArray5;
    public List<int> intList5;
    public E_TestEnum myTestEnum5;
    public GameObject gameObj5;

    //字典不能在Inspector窗口显示编辑
    public Dictionary<int, string> intAndStringDic5;

    //自定义类型变量不能在Inspector窗口显示编辑
    public MyStruct myStruct5;
    public MyClass myClass5;

    #endregion

    #region 知识点六 加上序列化特性[System.Serializable]让自定义类型可以在Inspector窗口显示编辑

    //加上序列化特性[System.Serializable] 可以让自定义类型在Inspector窗口显示编辑
    //要引用命名空间System
    public YourStruct YourStruct6;
    public YourClass YourClass6;
    //字典加上序列化特性[System.Serializable]也不能在Inspector窗口显示编辑

    #endregion

    #region 知识点七 一些辅助特性

    //1.分组说明特性Header
    //为成员分组
    //Header特性
    //[Header("分组说明")]
    [Header("基础属性")]
    public int age;
    public bool sex;
    [Header("战斗属性")]
    public int atk;
    public int def;

    //2.悬停注释Tooltip
    //为变量添加说明
    //[Tooltip("说明内容")]
    [Tooltip("闪避")]
    public int miss;

    //3.间隔特性Space
    //让两个字段间出现间隔
    //[Space()]
    [Space()]
    public int crit;

    //4.修饰数值的滑条范围Range
    //[Range(最小值, 最大值)]
    [Range(0, 10)]
    public float luck;

    //5.多行显示字符串Multiline
    //默认不写参数显示3行
    //[Multiline()]
    //写参数就是对应行
    [Multiline(5)]
    public string tips;

    //6.滚动条显示字符串TextArea 
    //默认不写参数就是超过3行显示滚动条
    //[TextArea()]
    //最少显示3行,最多4行,超过4行就显示滚动条
    [TextArea(3, 4)]
    public string myLife;

    //7.为变量添加快捷方法ContextMenuItem
    //[ContextMenuItem("显示按钮名", "方法名")]
    //参数1 显示按钮名
    //参数2 方法名 不能有参数和返回值
    [ContextMenuItem("重置钱", "SetMoney")]
    public int money;
    private void SetMoney()
    {
        money = 666;
    }
    //在Inspector窗口对应的变量右键就会显示添加的快捷方法

    //8.为方法添加特性能够在Inspector中执行ContextMenu
    [ContextMenu("执行测试函数")]
    private void TestFun()
    {
        print("测试方法");
    }
    #endregion

    #region 注意:Inspector窗口可编辑的变量机制
    //1.Inspector窗口中的变量关联的就是对象的成员变量,运行时改变他们就是在改变成员变量
    public int int注意 = 100;
    //2.脚本拖曳到GameObject对象后,变量会显示默认值,再改变脚本中变量默认值,界面上不会改变,想改变界面上的值只能自己手动改变或者让对象卸载脚本后重新加载
    //3.运行中修改的信息不会保存,运行结束会恢复运行前的默认值。想运行结束后改变可以在运行时赋值组件,运行结束后粘贴组件值
    #endregion

    #region 生命周期函数
    private void Start()
    {
        print(privateInt2);
        print(protectedStr2);
    }

    private void Update()
    {
        print(int注意);
    }

    #endregion
}

11.3 练习题

如何让公共成员不在Inspector面板上设置,如何让私有或保护成员可以在Inspector面板上设置

  1. 公共成员不在Inspector面板上设置:将公共成员标记为[HideInInspector]特性,这样就不会在Inspector面板上显示。
  2. 私有或保护成员可以在Inspector面板上设置:将私有或保护成员标记为[SerializeField]特性,这样就可以在Inspector面板上设置它们的值。

为什么加不同的特性,在Inspector窗口上会有不同的效果,请说出你的理解

在Unity中,通过反射获取类的信息,在Inspector窗口中显示字段信息。当字段具有特定的特性时,Unity会根据这些特性做出相应的处理,从而产生不同的效果。

例如,当字段标记为[HideInInspector]特性时,Unity将不会在Inspector面板上显示该字段,而当字段标记为[SerializeField]特性时,Unity允许在Inspector面板上编辑该字段的值。不同的特性触发了不同的处理逻辑,从而实现了在Inspector窗口上的不同效果。



转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏