一、介绍
在制作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~
觉得有用记得点个赞哦~