Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unity - Gameobject look at mouse

Tags:

c#

unity3d

I've ran into a problem.

The basic setup I have right now, two objects: my camera, and my player object.

The player moves via Transform on WASD, and is supposed to rotate on mouse movement.

The camera is top down (At a slight "3ps" style angle, which keeps the player object centre to the camera's perspective, and rotates according to the players rotation.

This is the players movement script:

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour 
{
    public int playerSpeed = 8;  //players movement speed

    void Update () {
        if (Input.GetKey ("w")) 
        {
            transform.Translate (Vector3.forward * Time.deltaTime * playerSpeed); //move forward
        }  
        if (Input.GetKey ("s")) 
        {
            transform.Translate (Vector3.back * Time.deltaTime * playerSpeed); //move backwards
        }  
        if (Input.GetKey ("a")) 
        {
            transform.Translate (Vector3.left * Time.deltaTime * playerSpeed); //move left
        }  
        if (Input.GetKey ("d")) 
        {
            transform.Translate (Vector3.right * Time.deltaTime * playerSpeed); //move right
        }
    }
}

This is the players rotation script:

using UnityEngine;
using System.Collections;

public class mouseLook : MonoBehaviour {
    private Vector3 inputRotation;
    private Vector3 mousePlacement;
    private Vector3 screenCentre;

    void Update () {
        FindCrap();
        transform.rotation = Quaternion.LookRotation(inputRotation);
    }

    void FindCrap () {
        screenCentre = new Vector3(Screen.width * 0.5f,0,Screen.height * 0.5f);
        mousePlacement = Input.mousePosition;
        mousePlacement.z = mousePlacement.y;
        mousePlacement.y = 0;
        inputRotation = mousePlacement - screenCentre;
    } 
}

The result of everything I have shown is it rotates, but it doesn't rotate true to where the mouse physically is.

While I draw circles with the mouse, it will do full rotations, but not consistently point to where the mouse is. I'm not sure as to why.

The desired result is for the camera (child of player object) to follow the players movement and rotation, while the player moves with its movement script, and rotates to point true to where the mouse is.

Anyone got any ideas? Thanks in advance.

Edit: if it helps, the current rotation works like this.

drawing large circles with the mouse around the player gives a slower rotation, than extremely tight circles around the player.

like image 934
Jordy Downie Avatar asked Apr 14 '16 06:04

Jordy Downie


People also ask

How do you get the mouse position in unity?

In Unity, getting the mouse position on the screen is fairly straightforward. It's a property of the Input class so, to access it from a script, all you need to do is use Input. mousePosition, which returns the position of the mouse, in pixels, from the bottom left of the screen. Simple.


1 Answers

I'm not sure If I understand what you are trying to do. If you are trying to do something similar to the game "Dead Nation", then I would suggest something like this:

MouseLook.cs

void Update()
{
    Vector3 mouse = Input.mousePosition;
    Vector3 mouseWorld = Camera.main.ScreenToWorldPoint(new Vector3(
                                                        mouse.x, 
                                                        mouse.y,
                                                        player.transform.position.y));
    Vector3 forward = mouseWorld - player.transform.position;
    player.transform.rotation = Quaternion.LookRotation(forward, Vector3.up);
}

If you want the camera to move and rotate along with the player then just make the camera a child of the player object.

like image 171
Agustin0987 Avatar answered Sep 17 '22 12:09

Agustin0987