所以我在过去的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
}
答案 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;