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!

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