android - Unit 和 Android 无法精确跟随手指?
问题描述
我正在使用 Unity 创建一个 Android 游戏,并且我正在尝试制作一个对象来跟随我的手指。这是我正在使用的代码。
for (int i = 0; i < Input.touchCount; i++)
{
RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.touches[i].position), Vector2.zero);
Vector3 touchPosition = Camera.main.ScreenToWorldPoint(Input.touches[i].position);
if (Input.GetTouch(i).phase == TouchPhase.Moved && hit.collider != null)
{
transform.position = new Vector2(touchPosition.x, touchPosition.y + sizeY);
}
}
我将碰撞器放在对象下方,并将对象的大小添加到 Y,所以它出现在我的手指上方。问题是,如果我稍微快一点移动手指,我就会失去那个留在后面的物体。由于物体滞后,如果我更快地移动手指,我最终会离开对撞机区域,并且物体会停止移动。我发现可行的唯一方法是摆脱 Raycast 的东西并让对象跟随屏幕上任何地方的触摸(我不喜欢那样)。
我只是想知道这是否是我可以从 Unity 和 Android 中获得的最佳效果,或者是否有一种方法可以让对象以一个接一个的动作跟随手指移动,精确无延迟。我正在三星 Galaxy S8 上进行测试,仅使用该对象,没有其他内容。
解决方案
你并不孤单。Unity 的 Input API 是基于帧速率的,可能无法跟上屏幕上触摸移动的速度。如果您正在处理需要基于屏幕触摸快速响应的事情,请使用新的 Unity 的InputSystem。此 API 仍处于实验模式。
它的Touchscreen
类可用于访问屏幕上的触摸。您当前的代码应转换为如下内容:
public int touchIndex = 0;
void Update()
{
Touchscreen touchscreen = UnityEngine.Experimental.Input.Touchscreen.current;
if (touchscreen.allTouchControls[touchIndex].ReadValue().phase != PointerPhase.None &&
touchscreen.allTouchControls[touchIndex].ReadValue().phase == PointerPhase.Moved)
{
Vector2 touchLocation = touchscreen.allTouchControls[touchIndex].ReadValue().position;
RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(touchLocation), Vector2.zero);
Vector3 touchPosition = Camera.main.ScreenToWorldPoint(touchLocation);
transform.position = new Vector2(touchPosition.x, touchPosition.y + sizeY);
}
}
推荐阅读
- android - 如何在android Jetpack Compose中删除文本?
- spring-boot - 使用 loader.path 将外部 jar 绑定到 SpringBootApplication
- scala - Cats 使用 Seq 自动派生
- windows - Windows $PATH 中的 rm 二进制文件,但 Powershell 仍然更喜欢 Remove-Item
- python - Keras Conv1D 输入是如何指定的?我似乎缺少维度
- unreal-engine4 - 有谁知道是否可以仅通过蓝图创建变量和/或创建黑板键?
- r - 更改日期范围内显示周期后的不同系数值
- c++ - 用于不同机会的 C++ 随机数生成器
- python - 通过 Cython 将 Python 转换为 C 后,得到未定义的符号 _Py_CheckRecursionLimit
- android - 一个容器如何完美包裹一个gridview的flutter