Unity SetActive(True)不工作?

时间:2015-03-23 05:27:02

标签: c# object unity3d visibility

所以我在过去的9个小时里一直试图解决这个问题。我有一个附在飞机上的武器。在我获得特定数量的杀戮后,我希望这种武器能够出现并起作用。当我想要它时它会消失,但它不会出现。此外,我不能在不可见时使用它。

连连呢?任何可以在这里看到问题的人都是我的救星!

private GameManager game;
GameObject weapon_rocket;

 // This works - Start class removes the object any creates any necessary referances 
public void Start ()
    {
        weapon_rocket = GameObject.Find("weapon_rocket");
        weapon_rocket.SetActive(false);

        GameObject Player = GameObject.Find("Player");
        game = (GameManager)GameObject.FindObjectOfType (typeof(GameManager));
        GameManager gameManager = Player.GetComponent<GameManager> ();
    }

 // Here it doesn't recognise SetActive(True)

     public void SwitchWeapon ()
    {   
      if (game.Killed >= 1) {
      weapon_rocket.SetActive (true); // this does not make the weapon reappear for some reason
      CurrentWeapon = 3; // this makes the weapon usable - doesn't work when the weapon is not visible
    }

4 个答案:

答案 0 :(得分:3)

null参考例外已经给你一个提示。

C#有一个垃圾收集器以及Java和任何其他程序。

意思是,如果您的GameObject处于非活动状态且没有指针/参考。它将有资格被垃圾收集和销毁以释放一些内存。除非您覆盖Finalize()函数,否则它是自动的。如果您不知道CLR C#是如何工作的,我不建议这样做。

简单地解决您的问题。我建议先引用它,这样垃圾收集器就会忽略它。

在你的Start()中,你已经引用了你的对象,这样就不会收集垃圾了。

但我敢在你的编辑中打赌。您的GameObject已经变灰了。这意味着默认情况下您已通过InActive进行设置。这就是你的GameObject.Find已经抛出异常的原因。确保它是活动的所以GameObject.Find可以引用Object First“BEFORE”将其设置为非活动状态。要不然。它已经收集了垃圾。或者更糟糕的是,甚至不会首先实例化。

答案 1 :(得分:1)

如果您只想让对象不可见,您可以考虑禁用网格渲染器而不是整个对象。并查看是否允许将其设置为true并将其恢复。

答案 2 :(得分:0)

自从我进入Unity之后已经有一段时间了,而且我自己还有点新鲜。但是,根据我的记忆,有一个关于设置游戏对象可见性的不推荐使用的功能/对象/方法的问题。它最终被转移到了&#34; BEHAVIOR&#34;控制并从那里设置它。

所以,那说,并且它已经有一段时间了,你可以搜索团结&#34;行为&#34;

但是看this Unity link,它还说明如果父对象不活跃,那么它下面的任何一个孩子都不会。

所以,我希望这有助于进一步确定和解决您的问题。如果当时还没有解决,我会在今晚晚些时候再检查一下。

答案 3 :(得分:-2)

您必须将GameObject weapon_rocket转换为

GameObject weapon_rocket = null;