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

相关推荐
我的golang之路果然有问题7 分钟前
mac配置 unity+vscode的坑
开发语言·笔记·vscode·macos·unity·游戏引擎
于小汐在咯44 分钟前
【虚拟现实技术】在Unity里创建一个简单的AR项目
unity·ar·vr
rannn_1111 小时前
【Javaweb学习|黑马笔记|Day5】Web后端基础|java操作数据库
数据库·后端·学习·javaweb
AA陈超1 小时前
ASC学习笔记0022:在不打算修改属性集时访问生成的属性集
c++·笔记·学习·ue5·虚幻引擎·unreal engine
HalvmånEver1 小时前
Linux:基础开发工具(四)
linux·运维·服务器·开发语言·学习·makefile
专注VB编程开发20年1 小时前
.net按地址动态调用VC++DLL将非托管DLL中的函数地址转换为.NET可调用的委托
开发语言·c++·c#·.net
q***78782 小时前
Spring学习——新建module模块
java·学习·spring
Bin二叉2 小时前
南京大学cpp复习——面向对象第一部分(构造函数,拷贝构造函数,析构函数,移动构造函数,友元)
c++·笔记·学习
xhyyvr3 小时前
解码大地的预警 —— VR地震起因及先兆学习系统
学习·vr·vr公共安全·vr公共安全体验馆·vr地震·vr地震起因先兆·vr地震模拟平台
Amber_373 小时前
php的数组和python的列表 -- 横向对比学习
python·学习·php