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

打印 上一主题 下一主题

主题 1766|帖子 1766|积分 5298

错误树模:
一开始把移动的代码写到update里去了,发现物体老是掉(总之移动非常不流通,体验感很差)
  1. void Update()
  2.         {
  3.             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  4.             if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, LayerMask.GetMask("Interactables")))
  5.             {
  6.                 if (Input.GetMouseButton(0))
  7.                 {
  8.                     hit.transform.position=ScreenToWorldPos(Input.mousePosition);
  9.                     
  10.                 }
  11.             }
  12.         }
  13. public Vector3 ScreenToWorldPos(Vector3 screenPosition)
  14.         {
  15.             Vector3 targetScreenPos = Camera.main.WorldToScreenPoint(depthReference.position);
  16.             float depth = targetScreenPos.z;
  17.             screenPosition.z = depth;
  18.             Vector3 worldPosition = Camera.main.ScreenToWorldPoint(screenPosition);
  19.             return worldPosition;
  20.         }
复制代码
修改:
把移动的代码改到协程里更新就能流通移动了
  1. void Update()
  2.         {
  3.             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  4.             if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, LayerMask.GetMask("Interactables")))
  5.             {
  6.                 if (Input.GetMouseButtonDown(0))
  7.                 {
  8.                     
  9.                     StartCoroutine(Move(hit.collider.transform));
  10.                 }
  11.             }
  12.         }
  13.         IEnumerator Move(Transform hitobj)
  14.         {
  15.             while (true)
  16.             {
  17.             
  18.                 if (Input.GetMouseButton(0) )
  19.                 {
  20.                     Vector3 targetPosition = ScreenToWorldPos(Input.mousePosition);
  21.                  
  22.                     hitobj.position = targetPosition;
  23.                     
  24.                 }
  25.                
  26.                 yield return null;
  27.             }
  28.         }
  29.         public Vector3 ScreenToWorldPos(Vector3 screenPosition)
  30.         {
  31.             Vector3 targetScreenPos = Camera.main.WorldToScreenPoint(depthReference.position);
  32.             float depth = targetScreenPos.z;
  33.             screenPosition.z = depth;
  34.             Vector3 worldPosition = Camera.main.ScreenToWorldPoint(screenPosition);
  35.             return worldPosition;
  36.         }
复制代码


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




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

温锦文欧普厨电及净水器总代理

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表