I wanted to follow an object on a single plane while using 3D and nested game objects. This proved tricky when the orientation of the parents is constantly moving.

Finally I found the answer here:

https://forum.unity.com/threads/is-vector3-signedangle-working-as-intended.694105/

So, well done lordofduct

Here is my code:

public Transform ObjectToFollow;

void Update()

{

// move towards the object.

transform.position =
Vector3.MoveTowards(transform.position, ObjectToFollow.position, Speed *
Time.deltaTime);

// find directions in local space.

var targetDirection =
transform.InverseTransformDirection(ObjectToFollow.position -
transform.position);

var forward = transform.InverseTransformDirection(transform.forward);

var angle = AngleAroundAxis(targetDirection, forward,
transform.InverseTransformDirection(transform.up));

// rotate towards the object to follow

transform.Rotate(new Vector3(0, angle, 0), Space.Self);

}

// Calculates the angle between vectors as if
projected on a plane.

public static float AngleAroundAxis(Vector3 v, Vector3
forward, Vector3 perpenducularAxis, bool clockwise = false)

{

Vector3 right;

if (clockwise)

{

right = Vector3.Cross(forward,
perpenducularAxis);

forward =
Vector3.Cross(perpenducularAxis, right);

}

else

{

right =
Vector3.Cross(perpenducularAxis, forward);

forward = Vector3.Cross(right,
perpenducularAxis);

}

return Mathf.Atan2(Vector3.Dot(v, right), Vector3.Dot(v, forward)) *
Mathf.Rad2Deg;

}

## Comments

## Post a Comment