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

相关推荐
炼钢厂19 分钟前
C#6——DateTime
c#
yuhaiqun198937 分钟前
Typora 技能进阶:从会写 Markdown 到玩转配置 + 插件高效学习笔记
经验分享·笔记·python·学习·学习方法·ai编程·markdown
Lv11770081 小时前
Visual Studio中的多态
ide·笔记·c#·visual studio
我命由我123451 小时前
Python Flask 开发问题:ImportError: cannot import name ‘Markup‘ from ‘flask‘
开发语言·后端·python·学习·flask·学习方法·python3.11
wuguan_2 小时前
C#:多态函数重载、态符号重载、抽象、虚方法
开发语言·c#
全栈陈序员2 小时前
【Python】基础语法入门(二十)——项目实战:从零构建命令行 To-Do List 应用
开发语言·人工智能·python·学习
我不是程序猿儿2 小时前
【C#】ScottPlot的Refresh()
开发语言·c#
AA陈超2 小时前
枚举类 `ETriggerEvent`
开发语言·c++·笔记·学习·ue5
小六*^____^*2 小时前
虚拟列表学习
前端·javascript·学习
代码游侠2 小时前
学习笔记——IPC(进程间通信)
linux·运维·网络·笔记·学习·算法