自学内容网 自学内容网

【Unity】Unity拖拽在Android设备有延迟和卡顿问题的解决

一、介绍

在制作Block类游戏时,其核心的逻辑就是拖拽方块放入到地图中,这里最先想到的就是Unity的拖拽接口IDragHandler,然后通过 IPointerDownHandler, IPointerUpHandler 这两个接口判断按下和松手,具体的实现逻辑就是下面

 public void OnDrag(PointerEventData eventData)
 {    
     if (Input.touchCount > 1)  //防止同时点击和拖动两个方块
     {
         return;
     }

     pointState = 1;

    // RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, Input.mousePosition, eventData.enterEventCamera, out Vector3 newPosition);
     RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, eventData.position, eventData.enterEventCamera, out Vector3 newPosition);

     newPosition = transform.parent.InverseTransformPoint(newPosition);
     //transform.localPosition = new Vector3(newPosition.x * OffsetRate, newPosition.y * OffsetRate + OffsetY);
     Vector3 offectPos = (newPosition - downPos) * OffsetRate;
     //transform.localPosition = new Vector3(0, OffsetY) + offectPos;

     Vector3 test = Vector3.zero;
     transform.localPosition = Vector3.SmoothDamp(transform.localPosition, new Vector3(0, OffsetY) + offectPos, ref test, 0.01f);
 }

上面代码中可以根据Input.mousePosition或者eventData.position来获取玩家按下的屏幕坐标位置,然后再进行转换到自己需要的坐标就好了

二、问题

上面的方法在Unity中完美实现需要的功能,但是打包到安卓设备后,会发现拖拽来回移动速度快的时候,仔细观察会发现拖拽的物体不跟手,且看起来刷新率很低,有一种卡卡的感觉。当然这些都是很极端的情况,一般用户也不会这么操作,其实对游戏本身影响并不是很大。但是如果要追求极致的话,就需要解决这个问题。

上面代码中本来是直接实时更改物体的位置,后来使用Vector3.SmoothDamp进行平滑过渡,总体看起来变化其实并不大。

三、解决方案

首先是调优打包配置,如下图所示
在这里插入图片描述
选择Dont Sync 然后
在这里插入图片描述
取消勾选该处并且Resolution Scaling Mode选择 Fixed DPI 根据自身修改DPI值

然后也是最关键的 就是弃用OnDrag方法,在Update方法中更新位置,通过Input.mousePosition获取按下的实时位置来更新物体的位置,然后在游戏启动时,提高设备的帧率,执行下面方法

    private void Start()
    {
        Application.targetFrameRate = 280;
    }

这样打包在安卓设备上拖拽卡顿和延迟就有明显改善,核心思想就是提高刷新率
至于为什么unity自带的OnDrag接口在安卓设备上拖拽会有卡顿和延迟的问题,找了一些文档有说是Unity该接口对安卓设备获取的拖拽事件有延迟,具体什么原因我也不是很清楚,有知道的还请不吝赐教哈~

Over~
觉得有用记得点个赞哦~


原文地址:https://blog.csdn.net/qq_41789645/article/details/143508910

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!