I am working on a top-down game. I have a look at script which is basically supposed to turn the character based on a crosshair but I want the character to turn only after a certain angle as in the character should turn let’s say 90 degrees to the right if the LookAtAngle goes beyond 45 degrees.
LookAtAngle = Quaternion.FromToRotation(transform.forward, mLookAtDirection);
I’ve commented to this code to help explain what is going on, I hope it helps:
float zoneSize = 90f; // every 90 degrees we turn
float rotSpeed = 180f; // 180 degrees a second
void Update()
{
// find angle (angle 0 points right and continues counter-clockwise)
Vector3 difference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
float angle = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
// adjust angle so we can measure easier
// instead of trying -45 to 45, it is 0 to 90
angle += zoneSize / 2f;
// make sure angle is between 0 and 360
if (angle < 0) { angle += 360; }
// take the angle and clamp it to zoneSize increaments
angle = Mathf.FloorToInt(angle / zoneSize) * zoneSize;
// set up a taret rotation
Quaternion targetRotation = Quaternion.Euler(0f, 0f, angle);
// then lerp to target
transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, rotSpeed * Time.deltaTime);
}
This would be a script on your character, and assume your character at rotation 0 is facing right.