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

错误示范:

一开始把移动的代码写到update里去了,发现物体老是掉(总之移动非常不流畅,体验感很差)

cs 复制代码
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;

        }

修改:

把移动的代码改到协程里更新就能流畅移动了

cs 复制代码
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每次都要重新进行射线检测拖慢了速度吧)

相关推荐
biuyyyxxx18 分钟前
Python自动化办公学习笔记(一) 工具安装&教程
笔记·python·学习·自动化
A_nanda1 小时前
c# MOdbus rto读写串口,如何不相互影响
算法·c#·多线程
丝斯20112 小时前
AI学习笔记整理(66)——多模态大模型MOE-LLAVA
人工智能·笔记·学习
军军君013 小时前
Three.js基础功能学习十三:太阳系实例上
前端·javascript·vue.js·学习·3d·前端框架·three
bylander3 小时前
【AI学习】TM Forum《Autonomous Networks Implementation Guide》快速理解
人工智能·学习·智能体·自动驾驶网络
xxxmine3 小时前
redis学习
数据库·redis·学习
码云数智-园园3 小时前
使用 C# 将 PowerPoint 演示文稿高效转换为 PDF 格式
c#
PfCoder4 小时前
WinForm真入门(23)---PictureBox 控件详细用法
开发语言·windows·c#·winform
Yff_world4 小时前
网络通信模型
学习·网络安全
野犬寒鸦5 小时前
从零起步学习并发编程 || 第一章:初步认识进程与线程
java·服务器·后端·学习