unity3d - GetComponent <Image>().enabled和.SetActive(false)之间有什么区别?团结一致

原文 标签 unity3d gameobject

我一直在尝试使用SetActive ()打开和关闭GameObjects。

我无法弄清楚,最终使用了:

 GameObject.Find ("ObjectName").GetComponent<Image> ().enabled = false;

关闭图像。

我不尝试使用相同的脚本来关闭其中嵌套有多个动画的GameObject。
GameObject.Find ("ObjectName").GetComponent<???> ().enabled = false;
GameObject.Find ("ObjectName").SetActive (false);

我不确定<>中有什么内容,但是我已经阅读到可以使用SetActive ()来做到这一点,但这似乎不起作用,并给了我"Object Reference not set to object"错误。

那么这两者之间有什么区别,我将如何正确使用它们?

最佳答案

使用GetComponent可以启用/禁用游戏对象上的特定组件并与之交互。

例如,您可能需要在某个时候禁用GameObject的刚体,但是您仍然希望该对象及其上的所有其他功能都处于 Activity 状态。因此,您可以简单地说:

GameObject.Find("MyObject").GetComponent<Rigidbody>().enabled = false;

请注意,“<>”内的是您要与之交互的组件的类名。

例如,如果您有一个脚本,您已经在一个名为MyScript的游戏对象上编写了自己,则可以像这样抓住它:
MyScript script = GamesObject.Find("MyObject").GetComponent<MyScript>().enabled = true;

另外,GetComponent的另一个很好的用途是从对象上的脚本读取信息。

例如,如果您有一个名为Health的脚本,其对象上带有一个公共变量HitPoints,则另一个脚本可以使用GetComponent来访问该信息。
if( enemyGameObject.GetComponent<Health>().HitPoints < 0 )
{
    enemyGameObject.SetActive(false);
}

使用SetActive将完全启用和禁用GameObject。这比删除/创建新对象便宜,因此经常用于Object Pooling之类的技术中。

例如,如果您有一个需要禁用的GameObject,但是您知道很快就要使用它,那么调用它的成本要便宜得多
MyGameObject.SetActive(false);

...

MyGameObject.SetActive(true);

比起完全删除该对象,然后在准备好该对象时再创建一个新对象而言。

关于unity3d - GetComponent <Image>().enabled和.SetActive(false)之间有什么区别?团结一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34908890/

相关文章:

c# - 将uintptr_t转换为id <MTLTexture>

c# - Unity Circle计算

objective-c - iOS中的UIButton AddTarget(不崩溃)

c# - unity : 3D movement/Collision detection failure (AddForce, MovePosition, transform.localPosition)

ios - Unity3D和XCode 9 Beta-卡在编译 Assets 目录中

c# - Unity3D C#-将 Sprite 存储在struct/class中吗?

c# - 如何从另一个脚本Unity C#2D访问任何创建的游戏对象的属性

c# - 如何实例化 : monobehaviour script from another GameObject

c# - Unity 5 GameObject序列化

c# - Unity GetComponent <Type>返回值