I’m trying to make a homing missile. The way I have the spells in my game, when you press the fire button, it instantiates a prefab. That prefab then does whatever the spell or ability is supposed to do, and then destroys itself. Each prefab is generic and every player casts the same prefabs. The prefabs are also fired from a “Gun” null object that’s parented to the player, so there’s a slight disconnect in the hierarchy. To help with that, the “Cast” button creates each prefab as a child of the “Gun” null object.
Hopefully that makes sense. The reason that’s all relevant, is because when this homing missile is fired, it has to find a target. It sifts through the “Find Objects with tag” code that unity script reference offers, and SHOULD then assign the “closest” to the “target”. But it doesn’t. I’ve tested this code with a hard-coded target, and it works just fine. I’ve tested it with a more basic “just find anything with the player tag” and it works there too. It’s just the script reference “FindClosestPlayer” function that doesn’t seem to be working.
Or maybe I’m just trying to interact with it the wrong way. Either way, I keep getting the following error:
“NullReferenceException: Object reference not set to an instance of an object
Boo.Lang.Runtime.RuntimeServices.InvokeBinaryOperator (System.String operatorName, System.Object lhs, System.Object rhs)
Chase.Update () (at Assets/Other/Spells/Chase.js:23)”
And I’m stumped at this point. Please peruse my code and tell me exactly how and why I am an illiterate moron.
var target : GameObject; //the missile's target
var moveSpeed = 3; //move speed
var rotationSpeed = 3; //speed of turning
var lifeTime : float;
var myTransform : Transform; //current transform data of this enemy
function Awake()
{
myTransform = transform; //cache transform data for easy access/preformance
}
function Start()
{
FindClosestPlayer();
Destroy(gameObject, lifeTime);
}
function Update () {
//rotate to look at the player
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,
Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed*Time.deltaTime);
//move towards the player
myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
}
// FIND THE CLOSEST PLAYER OTHER THAN THE CURRENT PLAYER
function FindClosestPlayer() : GameObject {
// Find all game objects with tag Player
var gos : GameObject[];
gos = GameObject.FindGameObjectsWithTag("Player");
var distance = Mathf.Infinity;
var position = transform.position;
// Iterate through them and find the closest one
for (var players : GameObject in gos) {
if (players == gameObject.transform.root) continue;
var diff = (players.transform.position - position);
var curDistance = diff.sqrMagnitude;
if (curDistance < distance) {
closestPlayer = players;
distance = curDistance;
}
}
return closestPlayer;
target = closestPlayer;
}