如何使字段在检查器中可见(可附加),但无法通过代码访问(类似私有)?


9

假设我有一个名为buttontype 的变量,Button它当然是System.Serializable

我希望该变量可以通过检查器分配,所以我做到了public

public class SomeScript : MonoBehaviour{
    public Button button;
}

这给了我:

在此处输入图片说明

现在,我想保持代码的干净和安全(井井有条),这是我需要保留封装的真实原因。

我知道有多种方法可以像在运行时那样检索组件,transform.Find("Some/Genius/TypeUnsafe/Path")或者GameObject.Find("3 seconds scene iteration").GetComponent(...).我想避免这种情况。

如何搭配一个变量private access与它的public access的检查?


为什么要使此字段“安全” /这是什么意思?请注意,我将其用引号引起来,因为如果代码在客户端计算机上运行,​​则客户端可以使用它执行几乎所有的操作。 private并不是要真正阻止第三方进入某个领域,而是要提供一种说法,即“不要隐瞒我真正在做的事情”-也就是说,这主要是一种阻止访问它。
Clockwork-Muse

是的,我知道封装是做什么用的!:DI建立某种UI/ API MVC/ MVVM一个巨大的应用程序模式(游戏客户端实际上),我不得不分开UIAPI。我只需要通过检查器原因来分配值-没有其他方法。Find()方法是不安全的类型,通过拖放将它们放在一起比较容易。要构建经典的OOP框架确实非常困难,Unity而且您必须寻找像这样的棘手问题。
雅各布

请记住,private不能确保变量不受其他脚本的影响。您驾驶室akways与反射或某些指针弄虚作假实现它
巴林特

Answers:


19

您正在寻找SerializeField属性

从文档:

强制Unity序列化一个私有字段。

您几乎永远不需要它。Unity序列化脚本时,它将仅序列化公共字段。除此之外,如果您还希望Unity序列化您的私有字段之一,则可以将SerializeField属性添加到该字段。

您的代码将如下所示:

public class SomeScript : MonoBehaviour{
    [SerializeField]
    private Button button;
}

6
为了提高可读性,我通常将它们全部写在一行上:[SerializeField] private Button button; 当一行中有一堆字段时,我发现这更容易扫描。另外,将文档的名称固定为“您将几乎不需要”。我一直都这样做。
飞速

1

您可以通过在变量之前添加SerializeField属性来显示私有变量。像这样

[SerializeField]
private Button button;

上面的变量将显示给您的检查器,但其他类将无法获取它。相反,您也可以通过HideInInspector属性在检查器中隐藏公共文件。像这样

[HideInInspector]
public Button button;

您上面的变量将由您的其他脚本访问,但不会显示给检查器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.