当前位置: 首页 > news >正文

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

错误示范:

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

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;

        }

修改:

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

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

相关文章:

  • 学习《JS数据结构与算法》
  • 同步整流和异步整流区别及其各优点
  • vm虚拟机 Ubuntu ping失败情况解决方法
  • Python的迭代器(Iterator)介绍以及实现多次使用
  • SVTAV1热点函数-svt_ext_all_sad_calculation_8x8_16x16_avx2
  • pip 安装某个包之后,Jupyter Lab仍旧显示包冲突;例如:Numba needs NumPy 2.1 or less. Got NumPy 2.2.
  • 热血传奇2超高清重置UI素材
  • Java并发编程
  • SAP-ABAP:OData 协议深度解析:架构、实践与最佳应用
  • 重学Java基础篇—什么是快速失败(fail-fast)和安全失败(fail-safe)?
  • 【Pandas】pandas Series to_xarray
  • 类和对象—继承(1)
  • 什么是真理?以及人工智能对真理标准的挑战
  • c++ 日志框架G3log介绍及在嵌入式Linux上的移植(交叉编译)
  • 学习笔记—数据结构—二叉树(链式)
  • 网关及路由
  • mapbox V3 新特性,添加三维球鹰眼图控件
  • 冗余技术:堆叠技术+链路聚合
  • 循环神经网络(RNN)
  • unity一个图片的物体,会有透明的效果
  • 网站 手机 css/每日新闻播报
  • 龙岩电商公司/锦绣大地seo
  • 杭州 城西 做网站/百度竞价托管外包
  • 三网合一网站建设合同/网络推广网站大全
  • 做设计网站的工作内容/淄博网络推广公司哪家好
  • 定制设计网站/网站设计需要什么