Sarah
Sarah

Reputation: 305

Unity SetActive(True) Not working?

so I've been spending the past 9 hours trying to fix this. I have a weapon attached to a plane. I want this weapon to appear and be functional, after I get a specific number of kills. It does dissapear when I want it to, but it does not appear back. Also, I cannot use it while it is not visible.

Suggestions? Anyone who can see the problem here, is my saviour!

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
    }

Upvotes: 1

Views: 8342

Answers (4)

Pouria
Pouria

Reputation: 1

you must convert the GameObject weapon_rocket to

GameObject weapon_rocket = null;

Upvotes: -2

DRapp
DRapp

Reputation: 48129

It's been a while since I have been in Unity, and still somewhat new to it myself. However, from what I remember there was an issue of a deprecated feature/object/method about setting the visibility of a game object. What it ended up being moved to was to the "BEHAVIOR" of a control and setting it from there.

So, that said, and that it HAS been a while, you can probably search on unity "Behavior"

But looking at this Unity link, it also states that if the parent object is not active, neither will any child under it.

So, I hope this can help further identify and resolve your issue. I will check back on this later tonight after work if not already resolved by then.

Upvotes: 0

HoloLady
HoloLady

Reputation: 1043

If you just want to make the object invisible, you could consider just disabling the mesh renderer instead of the entire object. And see if that allows it to be set to true and bring it back.

Upvotes: 1

Aizen
Aizen

Reputation: 1825

null Reference Exception Already gave you a hint.

C# has a Garbage Collector as well as Java and any other programs.

Meaning, if your GameObject is Inactive and there is no Pointer/ Reference on it. It will be eligible to be garbage collected and destroyed to free some memory. It is Automatic unless you override the Finalize() function. Which I don't recommend if you don't know how CLR C# works.

To simply fix your problem. I recommend Referencing it first so the Garbage collector will ignore it.

In your Start(), you already Reference your Object so that is not going to be Garbage collected.

But I would bet that in your Editor. Your GameObject is grayed already. Meaning you have set it by InActive by default. That is why your GameObject.Find is throwing an Exception already. Make sure it is active So GameObject.Find can reference the Object First "BEFORE" Setting it to inactive. Or else. It is Garbage Collected already. Or worse, not even going to be Instantiated in the first place.

Upvotes: 2

Related Questions