Unity3d 为什么每当我停止单击时,我的计时器就不能在Unity上工作?

Unity3d 为什么每当我停止单击时,我的计时器就不能在Unity上工作?,unity3d,Unity3d,我正在进行一个Unity项目,我需要计算用户采取下一步行动所需的时间 游戏中的每个对象都是通过使用鼠标移动并拖动来移动的,因此每当用户停止拖动主要对象时,计时器就会启动,当用户再次拖动对象时,计时器就会停止 这是我的拖动和计时器脚本: private float startPosX; private float startPosY; public bool isHeld; //private float distance = 10; private float s

我正在进行一个Unity项目,我需要计算用户采取下一步行动所需的时间

游戏中的每个对象都是通过使用鼠标移动并拖动来移动的,因此每当用户停止拖动主要对象时,计时器就会启动,当用户再次拖动对象时,计时器就会停止

这是我的拖动和计时器脚本:

private float startPosX;
    private float startPosY;
    public bool isHeld;
    //private float distance = 10;
    private float stopTime;

private void OnMouseDrag()
{
        Vector2 mousePos = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
        Vector2 objectPos = Camera.main.ScreenToWorldPoint(mousePos);
        transform.position = objectPos;
}

void Update()
{
    if (isHeld) {
        OnMouseDrag();
    }
    if (Input.GetMouseButtonUp(0))
    {
        isHeld = false;
        Debug.Log(isHeld);
        stopTime += Time.deltaTime;
        string minutes = Mathf.Floor((stopTime % 3600) / 60).ToString("00");
        string seconds = (stopTime % 60).ToString("00");
        Debug.Log(minutes + ":" + seconds);
    }
}

private void OnMouseOver()
{
    if (Input.GetMouseButtonDown(0)) {
        isHeld = true;
        Debug.Log(isHeld);
    }
}
}

My onMouseDrag()是用于拖动对象的实际函数,onMouseOver会检测鼠标是否确实在对象上方。
计时器由deltaTime给出,然后我使用字符串分和秒以更好的方式显示它,并查看它是否正常工作,但实际情况并非如此。我不知道为什么这不起作用,我需要一些帮助,因为我是unity和Codeing的新手。

这里有一些事情会给您带来问题,或者会给您带来问题

  • Input.GetMouseButtonUp(0)
    Update()
    中检测到按钮释放的帧上准确返回
    true
    。也就是说,
    if(Input.GetMouseButtonUp(0))
    中的代码只会在释放鼠标按钮的帧上执行一次。这就是为什么您没有看到从
    Debug.Log
    打印的任何内容,或者当您看到时,它是不正确的
  • 对于代码的
    分钟
    部分,使用模运算符
    %
    在数学上是不正确的<代码>数学楼层(stopTime/60)。ToString(“00”)
    将为您提供正确的分钟数
  • 我建议以这种方式进行组织:

    void Update()
    {
        if (Input.GetMouseButton(0)) {
            isHeld = true;
        }
        else
        {
            isHeld = false;
            Debug.Log(isHeld);
            stopTime += Time.deltaTime;
            string minutes = Mathf.Floor(stopTime / 60).ToString("00");
            string seconds = (stopTime % 60).ToString("00");
            Debug.Log(minutes + ":" + seconds);
        }
    }
    
    private void OnMouseOver()
    {
        if (isHeld) {
            Debug.Log(isHeld);
            OnMouseDrag();
        }
    }
    

    这里有几件事会给你带来麻烦,或者会给你带来麻烦

  • Input.GetMouseButtonUp(0)
    Update()
    中检测到按钮释放的帧上准确返回
    true
    。也就是说,
    if(Input.GetMouseButtonUp(0))
    中的代码只会在释放鼠标按钮的帧上执行一次。这就是为什么您没有看到从
    Debug.Log
    打印的任何内容,或者当您看到时,它是不正确的
  • 对于代码的
    分钟
    部分,使用模运算符
    %
    在数学上是不正确的<代码>数学楼层(stopTime/60)。ToString(“00”)
    将为您提供正确的分钟数
  • 我建议以这种方式进行组织:

    void Update()
    {
        if (Input.GetMouseButton(0)) {
            isHeld = true;
        }
        else
        {
            isHeld = false;
            Debug.Log(isHeld);
            stopTime += Time.deltaTime;
            string minutes = Mathf.Floor(stopTime / 60).ToString("00");
            string seconds = (stopTime % 60).ToString("00");
            Debug.Log(minutes + ":" + seconds);
        }
    }
    
    private void OnMouseOver()
    {
        if (isHeld) {
            Debug.Log(isHeld);
            OnMouseDrag();
        }
    }
    

    您需要阅读
    Input
    类的文档,特别是您正在检查的
    GetMouseButtonUp
    函数:

    在用户释放给定鼠标的帧期间返回true 按钮

    您需要从
    Update
    函数调用此函数,因为 每帧重置一个状态。只有在用户 已按下鼠标按钮并再次将其释放。按钮值为
    0
    用于左按钮,
    1
    用于右按钮,
    2
    用于中间按钮

    您可能误解了该函数的作用

    这会在每次单击或发布时记录一条消息:

    void Update() {
        if (Input.GetMouseButtonDown(0)) {
            Debug.Log("once per click: mouse button clicked");
        }
        if (Input.GetMouseButtonUp(0)) {
            Debug.Log("once per click: mouse button released");
        }
    }
    
    每帧记录一条消息:

    void Update() {
        if (Input.GetMouseButton(0)) {
            Debug.Log("once per frame: mouse button held");
        } else {
            Debug.Log("once per frame: mouse button NOT held");
        }
    }
    

    这取决于您是希望每次单击/释放一次还是每帧发生一次。

    您需要阅读
    输入类的文档,特别是您正在检查的
    GetMouseButtonUp
    函数:

    在用户释放给定鼠标的帧期间返回true 按钮

    您需要从
    Update
    函数调用此函数,因为 每帧重置一个状态。只有在用户 已按下鼠标按钮并再次将其释放。按钮值为
    0
    用于左按钮,
    1
    用于右按钮,
    2
    用于中间按钮

    您可能误解了该函数的作用

    这会在每次单击或发布时记录一条消息:

    void Update() {
        if (Input.GetMouseButtonDown(0)) {
            Debug.Log("once per click: mouse button clicked");
        }
        if (Input.GetMouseButtonUp(0)) {
            Debug.Log("once per click: mouse button released");
        }
    }
    
    每帧记录一条消息:

    void Update() {
        if (Input.GetMouseButton(0)) {
            Debug.Log("once per frame: mouse button held");
        } else {
            Debug.Log("once per frame: mouse button NOT held");
        }
    }
    

    这取决于您是希望每次单击/发布一次,还是每帧发生一次。

    谢谢,这对我帮助很大!!谢谢,这对我帮助很大!!非常感谢这真的帮助我改进了我的代码并解决了我的问题!非常感谢这真的帮助我改进了我的代码并解决了我的问题!