- Home /
Player not facing the mouse correctly
Hello everyone,
I am having trouble with getting the player to face the mouse correctly, When I aim for the corners, the aiming is very inaccurate.
Here is an image displaying what I mean (I shot 1 bullet in each corner): http://therealnishok.com/screensnapr/2014-05-30_2058.png
As you can see, the ones shot at the corners (the ones with the arrows pointing at them) are really inaccurate, they aren't even shooting to the corners. But the ones shot at the sides (horizontally and vertically) are correct.
Here is my code for the aiming:
Vector3 mousePos = Input.mousePosition;
mousePos = cam.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, cam.transform.position.y - transform.position.y));
targetRotation = Quaternion.LookRotation(mousePos - new Vector3(transform.position.x, 0, transform.position.z));
transform.eulerAngles = Vector3.up * Mathf.MoveTowardsAngle(transform.eulerAngles.y, targetRotation.eulerAngles.y, rotationSpeed * Time.deltaTime); //smoothens the rotation
Also as an extra note: When I make the camera right on top of the character, it aims perfectly (because at the moment the camera is angled a little bit so you can see the whole camera). So it has to do something with that, but I don't have a clue how I could fix it without having to change the camera back.
Thanks inadvance!
Answer by Dazdingon · May 30, 2014 at 08:50 PM
Your script is not taking the camera angle in consideration. (That is why it only works if the camera is facing directly down)
Here is two ways to fix this :
The Plane.Raycast method : (does not work with uneven ground)
Get the ray from the camera.
Create a Plane parallel to the ground (This can be done once at Start)
Then do a raycast along the ray towards the plane.
Get your look position from the returned distance.
var ray : Ray; var plane : Plane; var rayDistance: float;
//This code replaces the second line of your code
ray = cam.ScreenPointToRay(mousePos);
plane = new Plane(Vector3.up, 0);
plane.Raycast(ray, rayDistance);
mousePos = ray.GetPoint(rayDistance);
The Physics.Raycast method : (use a layerMask to ignore everything exept the ground)
Get the ray from the camera.
Then do a raycast that uses the layerMask (that you set up in the inspector).
Get your look position from the returned RaycastHit.
var ray : Ray; var hitInfo : RaycastHit; var layerMask : LayerMask; // public
//This code replaces the second line of your code
ray = cam.ScreenPointToRay(mousePos);
Physics.Raycast(ray, hitInfo, Mathf.Infinity, layerMask);
mousePos = hitInfo.point;
Physics.Raycast uses colliders
Your answer
Follow this Question
Related Questions
gravity causes transform.position not to work 0 Answers
Input.mousePosition returns coordinates as integers. 1 Answer
How to rotate an object to face the direction it's going? 1 Answer
How do you get the vector3 of one object and assign that vector3 to another object? 1 Answer
Instant Transform.Rotate? 1 Answer