【问题标题】:Touch controls of android not detecting my X positionandroid的触摸控件没有检测到我的X位置
【发布时间】:2019-08-19 14:24:12
【问题描述】:

我已经 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 天时间尝试不同的想法....感谢您的帮助。也已经在许多帖子以及统一的文档和论坛中进行了搜索。还搜索了 youtube 视频...但没有发现任何真正有用的内容。

编辑。忘了提。目前这仅适用于 android。

【问题讨论】:

    标签: c# unity3d touch


    【解决方案1】:

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

     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();
                }
            }
    
    
    
    
        }
    

    【讨论】:

    • 即使它可以工作,它也有很多错误。很多都与 Erik 所说的有关 ID 的内容有关。
    【解决方案2】:

    我注意到在你的第二个 else if 语句中你检查了你对球对象的位置。此脚本是否未附加到您要移动的球上?该脚本当前正在更改它所附加的任何 GameObject 的 transform.position。

    我将对这些信息做一些假设,而不是:

    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
        }
    }
    

    【讨论】:

    • 这是一个错误,我的意思是,我实际上指的是脚本附加到的游戏对象的转换组件。 “球”是对我用来修改速度的游戏对象的刚体的引用。起初,我提到了 ball.transform.position."whatever" 但后来我更正了它,不小心留下了你注意到的那个。已经更正它但仍然无法正常工作......感谢最后的提示!我不知道这是一个昂贵的电话
    • 场景中是否有任何碰撞器可以阻止球移动?我建议禁用球的刚体和对撞机,看看脚本是否可以在关闭的情况下工作。
    • 已经试过了,没有什么不同。我唯一的对撞机是一些墙壁和地板。我尝试使用转换翻译,看看它是否移动。但是奇怪的事情发生了。如果我用一根手指按下,什么也不会发生,但是当我用两根手指按下时,首先我的第二部分代码触发(Accelerate())然后球从左到右超级超级快,从左到右从右到左,重复速度超快。并且在我发布它之前做同样的事情......
    • 你知道吗?我认为这与您使用fingerId有关。让我修改这个答案。
    • 我在想也许是触摸位置?也许我不应该将触球位置与球的位置进行比较,但我不确定。
    猜你喜欢
    • 1970-01-01
    • 2013-06-29
    • 2013-06-25
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多