Angle between two objects' facing direction

Hello Everybody…

I’m currently working on a project which requires me to do something I just can’t figure out.

I need to know the angle between two objects facing directions. Let me explain; if you look down on two arrows, with the heads down the x-axis, rotated randomly, around the y-axis.
Now I need to know the angle between the two arrowheads.

So if the two arrows face away from each other I need an angle of 180 degrees, and If they face the same direction I need an angle of 0 degrees.

I tried everything from trigonometric functions to simple unity references, and nothing seems to work how I want it, I have a hunch the Vector3.Angle could work, but so far it doesn’t.

Vector3.Angle gives you the angle between two directions. Just put transform.forward of both objects in there, and it should give you the angle you need.

It has one limitation, though, it doesn’t distinguish between CW and CCW. I wrote a function for that:

function angleDir(fwd: Vector3, targetDir: Vector3, up: Vector3) {
	var perp: Vector3 = Vector3.Cross(fwd, targetDir);
	var dir: float = Vector3.Dot(perp, up);
	
	if (dir > 0.0) {
		return 1.0;
	} else if (dir < 0.0) {
		return -1.0;
	} else {
		return 0.0;
	}
}

It returns 1.0 for CW, -1.0 for CCW and 0.0, if the angle between the two objects is 0.

I personally found this more simple and understandable

public static float CalculateAngle180_v3(Vector3 fromDir, Vector3 toDir)
	{
        float angle = Quaternion.FromToRotation(fromDir, toDir).eulerAngles.y;
		if(angle > 180){return angle - 360f;}
		return angle;
	}

you can also return all angles as a vector3