- Home /
Using Invoke method from another class return NullReferenceException
Hi,
I'm trying to use method in other class that uses Invoke method but I always get a NullReferenceException. If I use methodBOne directly, Invoke's method works well.
Can anyone explain me why this happens and any solution?
Example code:
public class A{
public void methodA(){
B classBInstance = new B();
classBInstance.methodBOne();
}
}
public class B
{
public void methodBOne()
{
Invoke("methodBTw0", time);
}
public void methodBTw0()
{
//Do something
}
}
Thanks!
Answer by PatriceVignola · Aug 03, 2015 at 06:38 PM
What you didn't show in your code snippet is that class B is a MonoBehaviour
(since it's able to call the Invoke method), and you should never call the constructor of a MonoBehaviour
in Unity. The either have to drag the script to a prefab in a scene, or you instantiate it at runtime with the Instatiate()
method.
For your code to work, you should have a reference to your class B in your class A, and then call classBInstance.methodBOne()
. Remove the B classBInstance = new B();
line (Unity will warn you at runtime otherwise) since it can lead to unexpected behavior.
I don't know that of $$anonymous$$onoBehaviiour constructors. Thank you very much.
@Skied - There is not really a "$$anonymous$$onoBehaviour" constructor. Unlike other classes, Unity uses their own instantiating techniques under the hood to create an instance of the $$anonymous$$onoBehaviour objects, and how you tell Unity to do that is by dragging it on a prefab in your scene. Then, you add a public variable of the same type at the top of your class A and simply drag the prefab on the slot in the inspector:
public class A : $$anonymous$$onoBehaviour
{
public B classBInstance;
public void methodA(){
classBInstance.methodBOne();
}
}
public class B : $$anonymous$$onoBehaviour
{
public void methodBOne()
{
Invoke("methodBTw0", time);
}
public void methodBTw0()
{
//Do something
}
}
Answer by Positive7 · Aug 03, 2015 at 09:35 PM
using UnityEngine;
using System.Collections;
public class A : MonoBehaviour {
public B classBInstance;
void Start(){
classBInstance = GetComponent<B>();
methodA();
}
public void methodA(){
classBInstance.methodBOne();
}
}
using UnityEngine;
using System.Collections;
public class B : MonoBehaviour
{
public void methodBOne()
{
Invoke("methodBTw0", 1f);
}
public void methodBTw0()
{
Debug.Log("Executed");
}
}