【问题标题】:Is there a way to implement a touch and hold in Unity有没有办法在 Unity 中实现触摸并按住
【发布时间】:2020-08-28 01:21:47
【问题描述】:

有没有办法在手指按住屏幕时发生某些事情。

我要做的是将手指放在屏幕上并使对象旋转(仅限 Y 轴),而手指仍在屏幕上。当手指抬起时旋转应该停止。

这是我的代码:

using UnityEngine;

public class RotateObs : MonoBehaviour
{
    public float rotateSpeed;

    private void Update()
    {
        if(Input.touchCount > 0)
        {
            Touch touch = Input.GetTouch(0);
            if (touch.phase == TouchPhase.Began)
            {
                transform.Rotate(Vector3.up * rotateSpeed * Time.deltaTime);    
            }
        }
    }
}

我希望对象应该在我的手指(在 PC 上也可以使用鼠标)在屏幕上时旋转。

发生的情况是 - 它仅旋转 1 帧然后停止。它像单击一样注册它,无论我的手指是否仍在屏幕上。

我很确定我做错了,我只是看不到哪里。

【问题讨论】:

  • 如果有帮助,有一个 gamedev stackexchange 论坛,那里有很多统一问题。
  • 我不知道。我会进一步研究它。谢谢。
  • 它只旋转一帧的原因是你只是在测试触摸何时开始。您需要一个不同的事件来检查手指是否仍在屏幕上(正如其他人回答的那样)。触摸阶段在初始触摸后更改下一帧。如果您想确保它在您触摸时开始旋转而不是延迟一帧,则可以检查开始/静止。

标签: c# unity3d


【解决方案1】:


如果你想检测用户是否按住鼠标按钮,你应该使用

if (Input.GetMouseButton(0))
{
    transform.Rotate (Vector3.up * rotateSpeed * Time.deltaTime);
}

事实上,这行代码甚至可以在移动设备上运行,但如果你想使用 Touches,

if (Input.touchCount > 0)
{
    Touch first = Input.GetTouch (0);
    if (first.phase == TouchPhase.Stationary) 
    {
        transform.Rotate (Vector3.up * rotateSpeed * Time.deltaTime);
    }
}

【讨论】:

  • 对象使用 Input.GetMouseButton(0) 成功旋转,但是您建议的第二个代码不起作用 - if (first.phase == TouchPhase.Stationary)。 Afaik touch 是用 PC 上的鼠标模拟的,所以它应该可以工作,但它没有
  • 好吧,我刚刚构建了项目并在 Android 设备上运行它,并使用第二版代码,使用 Touches - 有效!这太奇怪了,如果每次我需要尝试一些行为我都必须将它移植到移动设备上,我应该如何测试游戏?
  • @LeeJaedong 用UnityRemote怎么样?
  • @LeeJaedong 兄弟,这很简单,只要在你的代码上实现这两个if条件,对不起,我没有澄清它
【解决方案2】:

我遇到了类似的问题。如果用户拿着屏幕,我想围绕一个点旋转我的播放器。向右触摸会使玩家顺时针移动,反之亦然。 这是代码:

 void Update()
{
    if(Input.touchCount > 0)
    {
        Touch touch = Input.GetTouch(0);
        Vector3 touchPos = Camera.main.ScreenToWorldPoint(touch.position);
        touchPos.z = 0f;
        if (touch.phase == TouchPhase.Stationary)
        {
            if (touchPos.x > 0)
                movement = 1f;
            else if (touchPos.x < 0)
                movement = -1f;
        }
        if (touch.phase == TouchPhase.Ended)
        {
            movement = 0f;
        }
        
    }
}

private void FixedUpdate()
{
    transform.RotateAround(centre, Vector3.forward, movement * Time.fixedDeltaTime * -moveSpeed);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多