- Home /
NullReferenceException thrown when trying to access a function from another GameObject
I'm trying to access the increaseScore() function in the ScoreManager class when there is a collision in the kidController class. I created a ScoreManager GameObject in the kidController class, but a NullReferenceException is thrown when I try to access the increaseScore() function with the message "Object reference not set to an instance of an object." I'm new to unity and C# and I've been having trouble with accessing different GameObjects from within scripts. I saw another post where you had to take out the GetComponent line because it was confusing things with the inspector, but I commented that line out and still got the same error on the scoreManager.increaseScore() line.
Here's the kidController class:
using UnityEngine;
using System.Collections;
public class kidController : MonoBehaviour {
ScoreManager scoreManager;
void Start () {
scoreManager = GetComponent<ScoreManager>();
}
void OnCollisionEnter2D(Collision2D coll){
if(coll.gameObject.tag == "sloppyJoe"){
scoreManager.inscreaseScore();
print(scoreManager.score);
}
}
}
And here's the ScoreManager class:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class ScoreManager : MonoBehaviour {
public int score;
public Text scoreLabel;
void Start () {
score = 0;
}
void Update () {
scoreLabel.text = score.ToString ();
}
public void inscreaseScore(){
score++;
print ("increaseScore func: " + score);
}
}
PS neither of the print lines work
Answer by DoTA_KAMIKADzE · May 04, 2015 at 05:12 AM
From what you say I guess that your ScoreManager script is a component of the other object than the object which contains kidController, hence your GetComponent in Start function will return null. You can verify my guess just like that:
void Start()
{
scoreManager = GetComponent<ScoreManager>();
Debug.Log(scoreManager == null);
}
Now in order to properly get reference to your script you have 3 general ways:
1) Make your scoreManager variable either public or add [SerializeField] and then drag and drop object which contains your kidController script right onto it in Inspector view.
2) Find your object and get componenet from it:
For example if you have only 1 instance of kidController script in whole scene you can get it like that:
ScoreManager scoreManager;
void Start()
{
scoreManager = FindObjectOfType<ScoreManager>();
}
3) Assign scoreManager to a static variable and then access through it wherever and whenever you want.
Choose whichever way you like more.
Answer by samiam618 · May 04, 2015 at 11:23 PM
Ok I got everything to work. The kidController class looks like this:
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(AudioSource))]
public class kidController : MonoBehaviour {
public GameObject scoreManager;
void Start () {
scoreManager = GameObject.FindGameObjectWithTag("score");
}
void OnCollisionEnter2D(Collision2D coll){
if(coll.gameObject.tag == "sloppyJoe"){
ScoreManager.inscreaseScore();
}
}
}
And the ScoreManager class looks like this:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class ScoreManager : MonoBehaviour {
public static int score;
public Text scoreLabel;
void Start () {
score = 0;
}
void Update () {
scoreLabel.text = score.ToString ();
}
public static void inscreaseScore(){
score++;
print ("increaseScore func: " + score);
}
}
Your answer
![](https://koobas.hobune.stream/wayback/20220613194714im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Why this Error when trying to add a score using the new GUI ? 0 Answers
Having trouble updating the text in my GUI 2 Answers
NullReference Exception when adding a class 2 Answers
NullReferenceException 1 Answer
Raycasthit NullRException 1 Answer