如何检测鼠标是否在Unity中停止移动

时间:2018-12-15 17:17:42

标签: c# unity3d

我想在Unity中做类似splitter.io的游戏,但是很难检测到鼠标何时停止移动,我希望球不停止,而是应该继续前进,在这个问题上工作了几个小时,但是不能相当有用。我以为如果保存到最后一个已知的位置,就可以保持速度,但是我还不知道如何实现。

谢谢!

这是我的源代码:

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);
    }
}

2 个答案:

答案 0 :(得分:2)

假设您要根据鼠标自上一帧以来是否移动来触发两个功能之一:

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

您需要再添加一个bool变量来跟踪它是刚刚开始还是停止移动;

答案 1 :(得分:1)

如果要检查鼠标的移动而不必跟踪变量中的鼠标位置,则可以使用Unity GetAxis类中的Input函数。

要执行此操作,您必须确保将鼠标移动连接到Unity输入管理器中的轴。通常默认情况下它已经存在,“ Mouse X”和“ Mouse Y”已映射到它们各自轴的鼠标增量。

例如:

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

在您的情况下,您似乎可以将以下功能用作移动功能:

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

作为不相关的注释,您的ListPos变量的大小可能每帧都有增长而没有限制。如果您出于其他原因而不是试图检测鼠标位置变化的原因而需要跟踪先前的位置,则应考虑需要多少存储空间,并为它固定大小以替换最旧的条目,或者考虑是否需要将这些值独立或可以合并。

相关问题