如何在Unity中防止“public”?

3
作为一名学生,在完成我的学业后,我研究了Unity在C#中的发展,以学习如何使用引擎,但更重要的是为了好玩。
Unity的一个优点是你可以直接拖放游戏对象参数,但是为了实现这一点,必须将该变量设置为公共的,这与我在课堂上学到的相反(尽可能将属性设置为私有)。
我的问题是,如何确保使用私有属性获得相同的结果,即手动恢复游戏对象而不使用拖放系统?
提前感谢您,对我的英语水平表示抱歉。

enter image description here


在Unity中,使所有内容都是私有的原因比一般的C#要少得多,大多数情况下,你可以将几乎所有内容都设置为公共的,而不会付出任何代价(除了一些混乱)。 - zambari
1个回答

9

在编辑器中显示变量并不需要将其标记为public。只需在private变量顶部添加SerializeField属性即可让它出现在编辑器中。

[SerializeField]
private GameObject cam1;

您还可以采取相反的方式,即使public变量不在编辑器中显示。这可以使用HideInInspector属性来完成。
[HideInInspector]
public GameObject cam1;

但是在Unity中,还有另一种方法可以获得GameObject而避免拖放吗?

是的。有很多种方法。

如果GameObject已经存在于场景中,则您可以使用以下其中之一的 GameObject.FindXXX 函数之一,例如 GameObject.Find GameObject.FindGameObjectWithTag

例如,

[HideInInspector]
public GameObject cam1;

// Use this for initialization
void Start()
{
    cam1 = GameObject.Find("Name of GameObject");
}

如果GameObject只是一个预制体,则将预制体放在名为Resources的文件夹中,然后使用Resources.Load来加载它。有关更详细的示例,请参见此处
最后,如果您只想获取该GameObject的组件,就像您的变量cam1一样(它不是GameObject而是组件),首先像上面那样找到GameObject,然后使用GetComponent函数从中获取组件。
private Camera cam1;

// Use this for initialization
void Start()
{
    GameObject obj = GameObject.Find("Main Camera");
    cam1 = obj.GetComponent<Camera>();
}

哦,谢谢你的快速回答。 但是在Unity中有另一种方法可以获取GameObject,而无需拖放吗?我的意思是用“经典”方法,例如编码?示例(完全错误,只是为了说明):cam1 = 访问GameObject的代码 - Quentin
1
非常感谢您的回答,对我来说真的很有帮助 :) - Quentin
1
我注意到你可能也想初始化像 cam1 这样的组件。请查看我的另一个编辑。不客气! - Programmer
2
精彩的答案! - fulvio
1
回答得很好,@程序员。 - Milan Egon Votrubec
你也可以使用Unity的标签功能更高效地查找物品。很高兴看到人们对访问修饰符的正确使用感兴趣。你可能想了解一下“依赖注入”的概念。 - pseudoabdul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接