How can I make my player's gun point at the cursor, not the player itself?
I'm making a 2D top-down shooter in unity. Currently, I'm using the C#
code below to point my player towards my cursor at all times, this works but isn't exactly what I want.
//Find the mouse position on the camera view
Vector3 mousePoint = theCamera.ScreenToWorldPoint(Input.mousePosition);
//Find how the mouse relates to the object's position
Vector3 difference = mousePoint - transform.position;
difference.Normalize();
//Find wanted angle of rotation
float rotZ = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
Quaternion newRotation = Quaternion.Euler(new Vector3(0.0f, 0.0f, rotZ + adjustmentAngle));
//Apply wanted angle of rotation
transform.rotation = Quaternion.Lerp(transform.rotation, newRotation, Time.deltaTime * smoothing);
This results is this:
While this works, my player's gun isn't in the centre of my player so when the gun fires it actually skims past the cursor missing slightly.
How can I get my player to rotate so his gun is what points towards the cursor rather than himself? The player rotates around the center of his head. I have a child GameObject
at the end of the barrel of his gun used to Raycast
and stuff which I figure can be used?
Answer by mnarimani · Apr 08, 2017 at 06:57 PM
First, you need to get the alpha angle in image below:
for that, you need the distance between the center of the player and gun, and you need the distance between the center of the player to the cursor point:
float yForAtan = distanceFromGunToPlayer;
float xForAtan = distanceFromPlayerToCursor;
float alpha = Mathf.Atan2(yForAtan,xForAtan) * Mathf.Rad2Deg;
finally, in your calculations, when you want to rotate player toward the cursor point, substract alpha angle to rotZ and rotate player.
O$$anonymous$$ - Sorry it's been so long - but I stepped away for a while and came back to it for a fresh attempt. And it works!
I don't know if it's something you assumed I was doing or if it was something you forgot - but in your answer above you need to multiply alpha
by $$anonymous$$athf.Rad2Deg
because $$anonymous$$athf.Atan2()
returns a number in radians but Euler angles use Degrees.
It's also noteworthy that I have to subtract alpha
from rotz
- not add it.
Thank you for your help either way - it works great!
Edit: I deleted our comments as they're now nullified - thanks again!
Oops, yeah, I forgot to multiply alpha by $$anonymous$$athf.Rad2Deg, I will edit the answer so anybody else that comes here through searching won't get confused. :)