user2565280
user2565280

Reputation: 357

How to access another variable C#

I have to access variable ammoMagazine from this class

public class Pistol : MonoBehaviour {
    public int ammoMagazine = 7;
}

then i tried this code :

public class AmmoCounter : MonoBehaviour {

    public int ammo;
    private Pistol _pistol;     

    void Start () {
        _pistol = GetComponentInChildren<Pistol>();
    }

    void Update () {
        ammo = _pistol.ammoMagazine;
        guiText.text = "Pistol: " + ammo + "/7";
    }
}

Why there's NullReferenceException: Object reference not set to an instance of an object ? Thanks, im new in C#

Upvotes: 1

Views: 7262

Answers (4)

Carrvin
Carrvin

Reputation: 54

public class AmmoCounter : MonoBehaviour {

    public int ammo;
    private Pistol _pistol = GetComponentInChildren<Pistol>();     

    void Update () {
        ammo = _pistol.ammoMagazine;
        guiText.text = "Pistol: " + ammo + "/7";
    }
}

Initialize the _pistol-variable before calling the update-function (Check if the GetComponentInChildren()-function returns null)

Upvotes: 2

Boomer Rogers
Boomer Rogers

Reputation: 1015

I know this has already been answered..but I think there will be some roadblocks ahead for you if you code everything with private variables like the accepted answer. Usually to get a reference in Unity you need to have an object in the scene with the desired attached script. So first you would re-write the script:

public class AmmoCounter : MonoBehaviour {
    public int ammo;
    public GameObject _pistol;     
    void Start( ){
        ammo = _pistol.GetComponent< Pistol >( );
    }
    void Update( ) {
        guiText.text = "Pistol: " + ammo + "/7";
    }
}

In the scene you want an object with the Pistol script attached, then in the editor ( inspector ) you should drag that object into the _Pistol slot. There are several reasons for doing this but two important ones are 1) You're shortening the code and referencing the script once ( the current answer is duplicating the reference ) and 2) Using GetComponentInChildren is inefficient; Unity searches through every game object underneath a parent to get your component. Thus, a direct object reference is better. Also using this type of object reference will save you several headaches in the future, most notably easy reference and making it easier to follow your own code in the future ( you can see the reference in the editor rather than looking through code -- trust me magical references can be a nightmare ).

If you don't want to reference through objects read up on the static type in C#, this allows you to reference items without using GameObjects. However, static types are finicky creatures, so be careful and know what you're doing before using them

edit: grammar

Upvotes: 1

Rik
Rik

Reputation: 29243

There is probably no value assigned to the _pistol field, so either you didn't call Start before you called Update, or GetComponentInChildren<Pistol>() returned null.

Upvotes: 7

AssafR
AssafR

Reputation: 61

Note that it's NullReferenceException. I think for some reason Update() is being called before Start().

Upvotes: 1

Related Questions