Bennity
Bennity

Reputation: 233

How to detect if Mouse stopped moving in Unity

I want to do a Game like slither.io in Unity but it's hard to detect when the mouse stopped moving, I want the ball to not stop, instead it should move on, worked several hours on this problem but can't quite get it to work. I thought if I save where the last known position is I can keep the velocity but I don't know how to implement yet.

Thanks in advance!

This is my Source Code:

private float xMin, xMax, yMin, yMax;
[SerializeField] float constantSpeed = 100f;
[SerializeField] float padding = 5f;
private Rigidbody2D rb2D;
private Vector3 mousePosition;
private Vector2 direction;
private List<Vector3> ListPos = new List<Vector3>();
private Vector3 empty;

// Use this for initialization
void Start () {
    empty = Vector3.zero;
    SetUpMoveBoundaries();
    rb2D = gameObject.GetComponent<Rigidbody2D>();
}

// Update is called once per frame
void Update () { 
    Move();
}

private void SetUpMoveBoundaries()
{
    Camera gameCamera = Camera.main;
    xMin = gameCamera.ViewportToWorldPoint(new Vector3(0, 0, 0)).x + padding;
    xMax = gameCamera.ViewportToWorldPoint(new Vector3(1, 0, 0)).x - padding;
    yMin = gameCamera.ViewportToWorldPoint(new Vector3(0, 0, 0)).y + padding;
    yMax = gameCamera.ViewportToWorldPoint(new Vector3(0, 1, 0)).y - padding;
}

private void Move()
{

    if (Input.mousePosition != empty)
    {
        mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        direction = (mousePosition - transform.position).normalized;
        ListPos.Add(direction);
        rb2D.velocity = new Vector2(direction.x * constantSpeed, direction.y * constantSpeed);
    }

    else
    {
        var last = ListPos.LastOrDefault();
        rb2D.velocity = new Vector2(last.x * constantSpeed, last.y * constantSpeed);
    }
}

Upvotes: 0

Views: 9209

Answers (2)

zambari
zambari

Reputation: 5035

Assuming you want it to trigger one of the two functions depending on whether the mouse has moved or not since last frame:

Vector2 lastMousePosition;
void WhenMouseIsMoving()
{
}
void WhenMouseIsntMoving()
{
}
void Update()
{
 if (Input.mousePosition!=lastMousePosition)
 {
   lastMousePosition=Input.MousePosition;
   WhenMouseIsMoving();
  } else
   WhenMouseIsntMoving();
}

You'll need to add one more bool variable to keep track of whether it has just started or stopped moving;

Upvotes: 4

adisib
adisib

Reputation: 197

If you want to check for mouse movement without having to keep track of the mouse position in a variable, you can use the GetAxis function from Unity's Input class.

To do this you will have to make sure that mouse movement is hooked up to axes in Unity's input manager. It is normally there by default already, with 'Mouse X' and 'Mouse Y' mapped to the mouse delta for their respective axes.

For example:

// Is true when the mouse has moved
if (Input.GetAxis("Mouse X") != 0 || Input.GetAxis("Mouse Y") != 0)
{
    // Do something with mouse input
}

In your case, it looks like you could do something like this as your move function:

Vector2 direction = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
if (direction.magnitude != 0)
{
    // ListPos.Add(direction);
    rb2D.velocity = direction.normalized * constantSpeed;
}

As an unrelated note, your ListPos variable is growing in size potentially every frame without limit. If you need to keep track of previous positions for reasons other than your attempt at detecting mouse position changes, you should consider how much storage you will need and give it a fixed size replacing the oldest entries, or consider whether or not the values need to be independent or can be merged instead.

Upvotes: 2

Related Questions