安卓的触摸控件没有检测到我的X位置



我已经 3 天试图解决这个问题,但仍然一无所获。我正在开发一个游戏,通过使用手机的触摸屏,当您触摸屏幕时,球会移动到手指的 X 位置,并在按住第一根手指时用第二根手指点击时做一些不同的事情。

手机确实会检测它是第一次触摸还是第二次触摸,第二次触摸会执行它应该执行的操作。但是第一次触摸并没有做它应该做的事情。我知道它被检测到了,因为我已经测试过了。但是我让球移动的方式肯定有一些错误。

这是我的代码。

我尝试过使用 AddForce,但我不希望球在我松开手指后继续前进。还尝试了许多类型的触摸,也尝试使用操纵杆,但是在我松开手指后,球继续前进(更远一点(。

foreach (Touch touch in Input.touches)
{
if (touch.fingerId == 0)
{    
Vector3 touchPosition = Camera.main.ScreenToWorldPoint(touch.position);
touchPosition.z = 0f;
if (touchPosition.x > transform.position.x)
{
transform.position = new Vector3(transform.position.x + 10, transform.position.y, transform.position.z);
}
else if (touchPosition.x < transform.position.x)
{
transform.position = new Vector3(transform.position.x - 10, transform.position.y, transform.position.z);
}
}

if (touch.fingerId == 1)
{
Accelerate();
}
}

我希望代码能够检测我的手指是更靠左还是更靠右,并相应地将球员向左或向右移动。我也在努力让它"平稳"地移动,不要太快,也不要太慢。之后,如果我移动手指而不抬起手指,球仍然会跟随它。

我花了 3 天时间尝试不同的想法......我感谢任何帮助。也已经在许多帖子中搜索过,以及 Unity 的文档和论坛。还搜索了优酷视频...但没有发现任何真正有用的东西。

编辑。忘了提。这是目前专门针对安卓的。

我是这样解决的。不确定这是否是最好的方法,但它有效。

if (!accelerated)
{
Vector3 playerPosition = gameObject.transform.position;

foreach (Touch touch in Input.touches)
{

if (touch.fingerId == 0)
{

playerPosition = Camera.main.WorldToScreenPoint(playerPosition);
Vector2 touchPosition = touch.position;
if (touchPosition.x -15 >= playerPosition.x)
{
transform.Translate(Vector3.right * Time.deltaTime * speed);
}
else if (touchPosition.x + 15 <= playerPosition.x)
{
transform.Translate(-Vector3.right * Time.deltaTime * speed);
}

}

if (touch.fingerId == 1)
{
Accelerate();
}
}


}

我注意到在你的第二个 else 语句中,你检查你对球对象的位置。这个脚本没有附加到你试图移动的球上吗?此脚本当前正在更改它所附加到的任何游戏对象的转换位置。

我将对该信息进行一些假设,而不是:

transform.position = new Vector3(transform.position.x + 10, transform.position.y, transform.position.z);

尝试:

ball.transform.position = new Vector3(ball.transform.position.x + 10, ball.transform.position.y, ball.transform.position.z);

作为附加的旁注,如果频繁调用对象,则在对象上调用 transform.position 可能会很昂贵。您在这里的一行中进行了 3 次 transform.position 读取和一次写入。我建议将 transform.position 缓存到 Vector3 并在逻辑中更新该变量的值,然后在最后将其重新分配给转换。喜欢这个:

Vector3 ballPosition = ball.transform.position;
ballPosition.x = ballPosition.x + 10;
ball.transform.position = ballPosition;

更新

看起来您正在使用Touch.fingerId,它明确指出:

Touch.fingerId 与"第一次"触摸、"第二次"触摸等不同。它只是每个手势的唯一 ID。您不能对 fingerId 和屏幕上实际的手指数量做出任何假设,因为将引入虚拟触摸来处理触摸结构在整个帧中保持不变的事实(而实际上触摸次数显然可能不正确,例如,如果单个帧内发生多次点击(。

Touch.fingerId实际上并没有告诉你它是哪根手指。这只是一个参考。这是因为触摸在每个帧上读取,并且触摸的顺序在帧之间可能不同。我会推荐以下内容:

void Update()
{
if (Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
//Move ball code here
}
}

最新更新