- Home /
Hazards not Working Properly
Hey everyone, making a 2D side scroller game and like most, im trying to create some hazards. I drop in a sprite of some "spikes", put a collider on it and mark "Is trigger". Then I attach this script to it.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Hazard : MonoBehaviour {
private Controls player;
public Transform start;
void Start()
{
player = FindObjectOfType<Controls>();
}
void Update()
{
}
void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == "Player")
{
player.transform.position = start.position;
}
}
}
The script debugs perfectly. Now I create a new Empty Object and call it "start" and position it at the beginning of my level. Lastly, I go to player and apply the Player tag I just created to it. So now, when the player collides with a spike, he should spawn back at the "start" (the empty object I created called start). When I play it, the player walks fine and as soon as he touches the spike, nothing happens but this error does come up
"NullReferenceException: Object reference not set to an instance of an object Hazard.OnTriggerEnter2D (UnityEngine.Collider2D other) (at Assets/Scripts/Hazard.cs:23)" and it points to my line of text "player.transform.position = start.position;". It appears that it cant find my Empty Object I created called start. This object does not have anything attached to it. The only thing in the Inspector for the Spike is the Sprite, the collider and the Hazard code I attached to it. Im not sure how it can be coming up null when im referencing the object. Unless im not referencing it properly? Any help is greatly appreciated.
Answer by Vicarian · Jun 19, 2017 at 08:42 PM
If you added the start
field after the Hazard script was already on the spike, you'll want to drag your Start transform onto the script for the spike. One way to easily check to see if you forgot to update a reference in the Inspector is to do an existence check and print a message:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Hazard : MonoBehaviour {
private Controls player;
public Transform start;
void Start()
{
player = FindObjectOfType<Controls>();
}
void Update()
{
}
void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == "Player")
{
if (!start)
{
Debug.LogWarning("Start on object " + name + "uninitialized!");
return;
}
player.transform.position = start.position;
}
}
}
Unity won't really be able to determine automatically what start is, so you need to assign the transform manually by dragging the start transform from the Hierarchy to the start field of this script. Alternatively, you could tag start with a unique tag, then use FindObjectWithTag to assign it.
Literally right when I was done typing this out I noticed that I didn't have start attached to the spike script. Unfortunately, that still did not fix it. If dragging Start right onto the open Start box on the Hazards script attached to the spike doesn't do it, idk what will :(