You understanding of Vector3.Angle()
is not correct. It always tries to give a positive angle. Quoting Unity Docs:
The angle returned is always the non reflex angle between the two
vectors - ie the smaller of the two possible angles between them and
never greater than 180 degrees.
Vector3.Angle()
has no concept of "to the right" or "to the left". It can't, anyway, because it would need a reference vector for that. You need a normal vector around which you can calculate this angle if you want to differentiate directions in angles with the sign of the angle. Here are two solutions for you:
If you have game objects that track the directions of the two thumb sticks, and if the y Euler angle of each game object represent the angle of the stick:
Transform stick1Transform;
Transform stick2Transform;
float angle1 = stick1Transform.localEulerAngles.y;
float angle2 = stick2Transform.localEulerAngles.y;
// get them to the same mod 360
while(angle1 - angle2 > 180) angle2 += 360;
while(angle2 - angle1 > 180) angle1 += 360;
// use this as the angle that you mentioned in your question
float angle = angle1 - angle2;
If you want something more general (your "up" vector may change), this would be another approach. You need to supply the up vector that is perpendicular to the two thumb stick vectors here.
Vector3 normal = Vector3.up; // you supply this. if vectors are in x-z, leave it like this.
// THIS is the formula that gives you angles with signs.
// Vector3.Angle() can not do that because it does not accept
// a normal vector around which positive and negative are defined
float angle = Mathf.Atan2(
Vector3.Dot(Vector3.Cross(stick1Vector, stick2Vector), normal),
Vector3.Dot(stick1Vector, stick2Vector)) * Mathf.Rad2Deg;
Hope that helps.