- Home /
Mouse Location in world relative to the player
So I have a 2D pixel art character in a 3D enviroment using x and z to move about. I'm using blend trees and x and z locations to play animations based on direction, so I am currently track the mouse position relative to the player. It works on the x but not on the z (up and down the screen), it seems to slowly go out of sync I think its because of the camera being at a angle but I'm unsure. I'm using the x and z location of the mouse in the world relative to the player to play the correct facing animations upright, upleft, downright, downleft. Like I said x works perfectly and stays relative where as y or 3d space z doesn't. 
 I hope this makes sense and someone can help? Many thanks in advance. 
Below is my script:
 public class PlayerRotation : MonoBehaviour {
 
     //Mouse Input variable (for offsetting)
     public Vector3 mouseInput;
 
     //Get animator
     public Animator anim;
 
     // Use this for initialization
     void Start () {
 
     }    
     
     // Update is called once per frame
     void Update () {
 
 
         //Get Mouse Position
         Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
         //Get Player Position
         Vector3 PlayerPosition = transform.position;
         //Offset mouse offset -0.5f for offseting object in game
         mouseInput = new Vector3(mousePos.x - PlayerPosition.x, mousePos.y - PlayerPosition.z, mousePos.z - PlayerPosition.z);
 
         //If mouse is on left flip image
         if (mouseInput.x < 0) {
             //flip image left
             transform.GetChild(0).localRotation = Quaternion.Euler(0, 180, 0);
         } else {
             //else flip the image right
             transform.GetChild(0).localRotation = Quaternion.Euler(0, 0, 0);
         }
 
         //Set animation parameters for animations
         anim.SetFloat("xInput", mouseInput.x);
         anim.SetFloat("zInput", mouseInput.y);
 
         //Debugging purposes
         Debug.Log( PlayerPosition);
         Debug.Log( mouseInput);
 
  
     }
 }
If you are using 3d space I would think you would want to use a raycast into your scene from the mouse to get the actual point on the "floor" of your level. this would compensate for the angle of your floor.
https://docs.unity3d.com/ScriptReference/Collider.Raycast.html
Answer by blueshark- · Feb 05, 2019 at 10:39 PM
Is it on purpose that on mouseInput you do mousePos.y - PlayerPosition.Z? Instead of mousePos.y - PlayerPosition.Y
Answer by Ymrasu · Feb 05, 2019 at 11:02 PM
I gave an answer to this on your last question. You should raycast from your mouse to a plane in the world to account for the angle of the camera. Inserting it into your code should be this:
 public class PlayerRotation : MonoBehaviour {
  
      //Mouse Input variable (for offsetting)
      public Vector3 mouseInput;
  
      //Get animator
      public Animator anim;
  
      // Use this for initialization
      void Start () {
  
      }    
      
      // Update is called once per frame
      void Update () {
 
         // make a plane in the world level to the player
         Plane plane = new Plane(transform.up, transfrom.position);
         
         // create a ray from your mouse
         Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  
         Vector3 mousePos = Vector3.zero;
         // cast the ray from mouse to the plane
         if(plane.Raycast(ray, out float distance)) {
              // get mouse position from where it hit in the world
             mousePos = ray.GetPoint(distance);
         }
 
 
          //Offset mouse offset -0.5f for offseting object in game
          mouseInput = mousePos - transform.position;
  
          //If mouse is on left flip image
          if (mouseInput.x < 0) {
              //flip image left
              transform.GetChild(0).localRotation = Quaternion.Euler(0, 180, 0);
          } else {
              //else flip the image right
              transform.GetChild(0).localRotation = Quaternion.Euler(0, 0, 0);
          }
  
          //Set animation parameters for animations
          anim.SetFloat("xInput", mouseInput.x);
          anim.SetFloat("zInput", mouseInput.z);
  
          //Debugging purposes
          Debug.Log( transform.position);
          Debug.Log( mouseInput);
  
   
      }
  }
Hi sorry its been a while, it looks like Raycast (out) is deprecated in the latest version of unity c#.
Your answer
 
 
              koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                