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

相关推荐
行思理2 小时前
go语言学习难度及适合学习的人群
开发语言·学习·golang
警醒与鞭策6 小时前
Codex桌面版与Claude桌面版使用设置
android·unity·ai·性能优化
楚山之石6 小时前
【Medical Image Analysis】深度学习医学图像合成综述:伪CT、合成MRI与合成PET的架构、性能与临床边界
图像处理·人工智能·学习·mr·mri
xcLeigh7 小时前
Unity基础:Destroy与DestroyImmediate——正确销毁游戏物体的方式
游戏·unity·游戏引擎·教程
Li_RuiQi7 小时前
DAgger方法演进_独立学习笔记
笔记·学习·计算机视觉
SteveSenna10 小时前
aubo学习:realsense手眼标定
学习·机器人·视觉检测
Li_RuiQi12 小时前
DAgger与交互式模仿学习_ACT学习笔记
笔记·学习
Canmag 兴隆磁性12 小时前
回复磁导率 μ_R:永磁体在动态磁路中的关键参数
开发语言·学习·r语言·永磁材料·充磁·磁导率
He BianGu12 小时前
【笔记】C# 中BindingFlags的详细作用
笔记·c#
lengxuenong12 小时前
区间覆盖问题 · 简明学习手册1
java·学习·算法