温锦文欧普厨电及净水器总代理 发表于 2025-3-31 00:01:35

【Unity】 鼠标拖动物体移动速率跟不上鼠标,会掉落

错误树模:
一开始把移动的代码写到update里去了,发现物体老是掉(总之移动非常不流通,体验感很差)
void Update()
      {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);


            if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, LayerMask.GetMask("Interactables")))
            {
                if (Input.GetMouseButton(0))
                {
                  hit.transform.position=ScreenToWorldPos(Input.mousePosition);
                  
                }
            }

      }

public Vector3 ScreenToWorldPos(Vector3 screenPosition)
      {

            Vector3 targetScreenPos = Camera.main.WorldToScreenPoint(depthReference.position);
            float depth = targetScreenPos.z;
            screenPosition.z = depth;

            Vector3 worldPosition = Camera.main.ScreenToWorldPoint(screenPosition);


            return worldPosition;

      }
修改:
把移动的代码改到协程里更新就能流通移动了
void Update()
      {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);


            if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, LayerMask.GetMask("Interactables")))
            {
                if (Input.GetMouseButtonDown(0))
                {
                  
                  StartCoroutine(Move(hit.collider.transform));
                }
            }

      }
      IEnumerator Move(Transform hitobj)
      {
            while (true)
            {

            
                if (Input.GetMouseButton(0) )
                {
                  Vector3 targetPosition = ScreenToWorldPos(Input.mousePosition);

               
                  hitobj.position = targetPosition;
                  
                }
               

                yield return null;
            }
      }

      public Vector3 ScreenToWorldPos(Vector3 screenPosition)
      {

            Vector3 targetScreenPos = Camera.main.WorldToScreenPoint(depthReference.position);
            float depth = targetScreenPos.z;
            screenPosition.z = depth;

            Vector3 worldPosition = Camera.main.ScreenToWorldPoint(screenPosition);


            return worldPosition;

      }
问了一下gpt大概是这个原理,说白了就是鼠标输入不是逐帧更新的,它不绝在更新,update执行速率跟不上,协程的执行速率跟得上(但是我照旧没明白为啥协程比update快,就算update重新启动,可是执行的代码都是一样的,要么就是因为update每次都要重新举行射线检测拖慢了速率吧)
https://i-blog.csdnimg.cn/direct/df6dd82ea6664b9e8cf07f776a2b5669.png

https://i-blog.csdnimg.cn/direct/41c5cc55d9e5406c907c5945574c35c5.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【Unity】 鼠标拖动物体移动速率跟不上鼠标,会掉落