# Kinematic equations script fail

I added the kinematic equations to my code and now none of it works. I get the error rigidbody.torque assign attempt for 'Enemy' is not valid. Input torque is { 0.000000, NaN, 0.000000 }. UnityEngine.Rigidbody:AddTorque(Vector3) EnemyBehavour:FixedUpdate() (at Assets/_Scripts/Baddies/EnemyBehavour.cs:61)

//speed of enemy
public float speed = .5f;
//base distance enemy will attack player
public float range = 3f;
//how far back enemy will stand
public float stopDistance;
//what the enemy will pursue
private GameObject target;
//targetable Enemies
private GameObject[] targetable;
//itself
private Rigidbody self;
//distance to check against
private float saveDistance;
//get the mass for physics stuff
float mass;
//gets drag for physics
float drag;
//gets angular drag for physics
//checks distance
float distance;
//the player
GameObject player;
GameObject[] turrets;
//the base
GameObject playerBase;
EnemyShoot Shoot;

void Start () {
//get own rigidbody
self = GetComponent<Rigidbody> ();
//playerbase should be obviouse
playerBase = GameObject.FindGameObjectWithTag ("Base");
target = playerBase;

Shoot = GetComponentInChildren<EnemyShoot> ();

mass = self.mass;
drag = self.drag;
}

void FixedUpdate () {
target = FindFoe ();

//checks range and
if (Vector3.Distance (transform.position, target.transform.position) > range || target == playerBase) {
target = playerBase;
}
Vector3 acceleration = AnglularAcceleration ();
Vector3 torque = new Vector3 (0f, acceleration.y * mass,0f);
print (torque.ToString ());

//look at the pursueing target
//move towards the pursuing target

}

Vector3 AnglularAcceleration () {
// the variables to figure out
Vector3 AnglAcc;
Vector3 theta;
float time;

//get the dot product between the two points
float dot = Vector3.Dot (new Vector3 (transform.position.x, 0f, transform.position.z),new Vector3 (target.transform.position.x, 0f, target.transform.position.z));
//get the arccosine of the angle and convert that to radians
theta = new Vector3 (0,(Mathf.Acos(dot))*180,0);
print (theta.ToString ());

//now find the time
time = (2f * theta.y) / speed;
AnglAcc = new Vector3(0f,(speed * speed) / (2f * theta.y),0f);

return AnglAcc;

}

//checks if turrets or player is within range
GameObject FindFoe() {
distance = range;
targetable = GameObject.FindGameObjectsWithTag ("ETarget");

//sets player base as default target

foreach (GameObject test in targetable) {
GameObject testing = test.transform.parent.gameObject;
print (testing.ToString());
saveDistance = Vector3.Distance (transform.position, testing.transform.position);
if (saveDistance < distance) {
distance = saveDistance;
print (saveDistance.ToString());
target = testing;
}

}
return target;

}


}

check AnglularAcceleration ()
AnglAcc = new Vector3(0f,(speed * speed) / (2f * theta.y),0f);

• I think the NaN could also enter one step earlier, depending on the positions used as input. If the value of dot goes outside the interval [-1, 1] (ie. beyond the domain of the arccosine function) then theta.y will become NaN, which then propagates to AngleAcc.y becoming NaN. – DMGregory Jan 20 '16 at 0:20