如何防止Unity中的"公共"?

Que*_*tin 3 c# oop unity-game-engine unityscript

作为一名学生并完成了我的学年,我研究了Unity在C#中的开发,以学习如何使用引擎,但最重要的是要玩得开心.

Unity的一个优点是你可以直接在拖放中传递一个游戏对象参数,但为了这个可能,所述变量必须是公开的,这与我在课堂上学到的相反(属性)必须尽可能私密).

我的问题是,如何确保与私有属性具有相同的结果,即,在不使用拖放系统的情况下手动恢复游戏对象?

提前致谢,对不起我的英语水平.

在此输入图像描述

Pro*_*mer 8

没有必要将变量标记public为使其显示在编辑器中.只需将SerializeField属性放在private变量的顶部,它就应该显示在编辑器中.

[SerializeField]
private GameObject cam1;
Run Code Online (Sandbox Code Playgroud)

您也可以执行相反的操作,即public在编辑器中不显示make 变量.这可以使用HideInInspector属性完成.

[HideInInspector]
public GameObject cam1;
Run Code Online (Sandbox Code Playgroud)

但是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");
}
Run Code Online (Sandbox Code Playgroud)

如果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>();
}
Run Code Online (Sandbox Code Playgroud)

  • 精彩回答! (2认同)