NullReference on updating animator parameter
Im current new to Unity making my first 2D game,so please bear with me. The parameter playerCurrentBalloons on AnimatorController.cs is supposed to update everytime the OnTriggerEnter2D is triggered. But when it is triggered it gives me a NullReferenceError on this line.
anim.UpdateBalloonCount (playerCurrentBalloons);
I am sure the variable is not null cause i tried printing on the console. The animator component is on a child component. I tried changing getComponent
to getComponentInChildren
but the error still appears.
this is the error message
NullReferenceException: Object reference not set to an instance of an object PlayerBalloons.BalloonPopped (Single damage) (at Assets/PlayerBalloons.cs:23) EnemyDamage.OnTriggerEnter2D (UnityEngine.Collider2D other) (at Assets/EnemyDamage.cs:21)
Here is the script where the error appears
using UnityEngine;
using System.Collections;
public class PlayerBalloons : MonoBehaviour {
public float playerMaxBalloons;
float playerCurrentBalloons;
AnimatorController anim;
void Start () {
playerCurrentBalloons = playerMaxBalloons;
anim = AnimatorController.instance;
}
// Update is called once per frame
void Update () {
}
public void BalloonPopped(float damage){
playerCurrentBalloons -= damage;
Debug.Log (playerCurrentBalloons);
anim.UpdateBalloonCount (playerCurrentBalloons);
}
}
and here is the AnimatorController script
using UnityEngine;
using System.Collections;
public class AnimatorController : MonoBehaviour {
public static AnimatorController instance;
Transform myTrans;
Animator myAnim;
Vector3 artScaleCache;
void Start () {
instance = this;
myTrans = this.transform;
myAnim = this.gameObject.GetComponent<Animator>();
artScaleCache = myTrans.localScale;
}
void FlipArt(float currentSpeed){
if ((currentSpeed < 0 && artScaleCache.x==1)|| //going left and facing right
(currentSpeed > 0 && artScaleCache.x==-1)) // going right and facing left
{
artScaleCache.x *=-1;
myTrans.localScale = artScaleCache;
}
}
public void UpdateSpeed (float currentSpeed) {
myAnim.SetFloat ("Speed", currentSpeed);
FlipArt (currentSpeed);
}
public void UpdateIsGrounded(bool isGrounded){
myAnim.SetBool ("isGrounded", isGrounded);
}
public void UpdateBalloonCount(float playerCurrentBalloons){
myAnim.SetFloat ("playerCurrentBalloons", playerCurrentBalloons);
}
}
and this is the script with the OnTriggerEnter2D class
using UnityEngine;
using System.Collections;
public class EnemyDamage : MonoBehaviour {
public float damage;
PlayerBalloons player;
void Start () {
}
void Update () {
}
void OnTriggerEnter2D(Collider2D other){
if (other.tag == "Player") {
player = other.gameObject.GetComponent<PlayerBalloons>();
player.BalloonPopped(damage);
}
}
}
Answer by Ali-hatem · Mar 30, 2016 at 10:25 AM
1 - class PlayerBalloons : AnimatorController class is static class so you don't need a reference to call any thing inside it so :
public void BalloonPopped(float damage){
playerCurrentBalloons -= damage;
Debug.Log (playerCurrentBalloons);
AnimatorController.instance.UpdateBalloonCount (playerCurrentBalloons);
}
2- class EnemyDamage :
PlayerBalloons player;
GameObject obj;
void Start () {
obj = GameObject.FindWithTag ("Player");
if (obj != null) {
player = obj.GetComponent<PlayerBalloons > ();
} else {
print ("no object found with the given tag");
}
void OnTriggerEnter2D(Collider2D other){
if (other.tag == "Player") {
player.BalloonPopped(damage);
}
}