【问题标题】:Hiding an object in Unity via SetActive()通过 SetActive() 在 Unity 中隐藏对象
【发布时间】:2020-08-31 19:56:28
【问题描述】:

我正在使用 Unity 引擎 2019.3.9f1。现在我正试图通过 SetActive(false) 隐藏一个对象,但也许我做错了,或者没有预料到什么。

现在我在场景中有一个名为“TILE_LARGE_1”的游戏对象。

通过按键盘上的“D”,我想使用 SetActive(false) 隐藏对象。脚本编译得很好,但是当我按“D”时,对象并没有隐藏。使用这种方法有什么我不知道的警告吗?

using UnityEngine;
using System.Collections;

[AddComponentMenu("Utilities/VisObjects1")]
public class VisObjects1 : MonoBehaviour
{
    public GameObject TILE_LARGE_1;

    void Start()
    {
        TILE_LARGE_1.SetActive(true); // false to hide, true to show
    }


   void Update()
    {
        if (Input.GetKeyDown(KeyCode.D))
         {

            TILE_LARGE_1.SetActive(false); // false to hide, true to show
         }
    }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您将代码放在Start 方法中,该方法仅在对象生命周期开始时调用一次。你应该把它放在每帧调用的Update 方法中:

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.D))
        {
            TILE_LARGE_1.SetActive(false); // false to hide, true to show
        }
    }
    

    【讨论】:

    • 哦……我明白了。我已经更改了它,但现在当我按“D”时,我似乎收到了 NullReferenceException 错误。我错过了什么吗?它说:“NullReferenceException:对象引用未设置为对象的实例”
    • TILE_LARGE_1 可能从未设置,这就是它为空的原因。您需要通过在 Start 方法中查找对象或将场景中的游戏对象拖到编辑器中的组件上来为其赋值。
    • 嗯,也许我理解错了。我更新了上面的脚本,所以你可以看到我尝试了什么。正如您所指出的,我添加了一个 Start 方法,并将 GameObject 设置为活动状态,但我似乎仍然遇到同样的错误。我误解了吗?
    • 你不能在TILE_LARGE_1 上调用任何东西,除非它被设置为引用一个实际的游戏对象。你不能只在你的类中添加一个 GameObject 字段,然后让 Unity 神奇地了解你想要使用哪个游戏对象。
    • 我应该提到我将脚本 (VisObjects1) 拖到了“TILE_LARGE_1”游戏对象上。
    【解决方案2】:

    正如@Abion47 所指出的,我没有指出游戏对象在哪里/是什么。解决方法如下:

                GameObject TILE_LARGE_1 = GameObject.Find("TILE_LARGE_1");
                TILE_LARGE_1.GetComponent<Renderer>().enabled = false;
    

    【讨论】:

      猜你喜欢
      • 2021-03-11
      • 2018-11-20
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多