如果玩家触摸,他会跳跃并滑动(从左到右就像任何跑步者一样从左到右移动)。
一切似乎都不错,但一如既往
这是代码:

Vector3 startPos;
float minSwipeDistX, minSwipeDistY;
bool isJump = false;

void Start()
{
    minSwipeDistX = minSwipeDistY = Screen.width / 6;
}

bool isSwipe = false;
bool isTouch = false;
void Update()
{
    if (Input.touchCount > 0)
    {
        Touch touch = Input.touches[0];
        switch (touch.phase)
        {
            case TouchPhase.Began:
                startPos = touch.position;
                break;
            case TouchPhase.Moved:
                isTouch = true;
                float swipeDistHorizontal = (new Vector3(touch.position.x, 0, 0) - new Vector3(startPos.x, 0, 0)).magnitude;
                float swipeDistVertical = (new Vector3(0, touch.position.y, 0) - new Vector3(0, startPos.y, 0)).magnitude;
                if (swipeDistHorizontal > minSwipeDistX)
                {
                    float swipeValue = Mathf.Sign(touch.position.x - startPos.x);
                    if (swipeValue > 0 && !isSwipe)//to right swipe
                    {
                        isTouch = false;
                        isSwipe = true;
                        Debug.Log("Right");
                    }
                    else if (swipeValue < 0 && !isSwipe)//to left swipe
                    {
                        isTouch = false;
                        isSwipe = true;
                        Debug.Log("Left");
                    }
                }
                // add swipe to up
                if (swipeDistVertical > minSwipeDistY)
                {
                    float swipeValueY = Mathf.Sign(touch.position.y - startPos.y);
                    if (swipeValueY > 0 && !isSwipe)
                    {
                        isTouch = false;
                        isSwipe = true;
                        Debug.Log("Up");
                    }
                }
                break;
            case TouchPhase.Stationary:
                isJump = true;
                break;
            case TouchPhase.Ended:
            case TouchPhase.Canceled:
                isTouch = false;
                isSwipe = false;
                break;
        }
    }
}

void FixedUpdate()
{
    if (isJump && !isTouch)
    {
        Debug.Log("Tap");
        isJump = false;
    }
}


进行简单触摸(TouchPhase.Stationary)时,会立即对播放器跳跃做出反应。
然后当我放开手指时,进行“向上跳跃”然后向上跳跃。我通过使用(TouchPhase.Ended)完全理解了这一点。
我尝试将TouchPhase.Moved放置,但始终在运动之前放置并使用跳转(TouchPhase.Stationary)。
莫格谁面对过这样的问题?
如果是这样,那么告诉我该怎么做,就是轻触并轻拂轻触。

最佳答案

这是我的代码:

void Update()
{
#if UNITY_ANDROID || UNITY_IPHONE
    if (Input.touchCount > 0)
    {
        Touch touch = Input.touches[0];

        switch (touch.phase)
        {
            case TouchPhase.Began:
                startPos = touch.position;
                StartCoroutine(Jump());
                break;
            case TouchPhase.Moved:
                isSwipe = true;
                float swipeDistHorizontal = (new Vector3(touch.position.x, 0, 0) - new Vector3(startPos.x, 0, 0)).magnitude;
                float swipeDistVertical = (new Vector3(0, touch.position.y, 0) - new Vector3(0, startPos.y, 0)).magnitude;
                if (swipeDistHorizontal > minSwipeDistX)
                {
                    float swipeValue = Mathf.Sign(touch.position.x - startPos.x);
                    if (swipeValue > 0 && !isTouch)//to right swipe
                    {
                        isTouch = true;
                        StartCoroutine(Right());
                    }
                    else if (swipeValue < 0 && !isTouch)//to left swipe
                    {
                        isTouch = true;
                        StartCoroutine(Left());
                    }
                }

                //add swipe to up
                if(swipeDistVertical > minSwipeDistY)
                {
                    float swipeValue = Mathf.Sign(touch.position.y - startPos.y);
                    if(swipeValue > 0 && !isTouch)
                    {
                        isTouch = true;
                        StartCoroutine(Jump2());
                    }
                }
                break;
            case TouchPhase.Ended:
                isSwipe = false;
                isTouch = false;
                break;
        }
    }
    #endif
}
IEnumerator Jump2()
{
    yield return new WaitForSeconds(0.05f);
    if(playerVelocity <= 0.2f)
    {
        Debug.Log("Swipe Up");
    }
}

IEnumerator Jump()
{
    if (!isSwipe)
    {
        yield return new WaitForSeconds(0.05f);
        if (!isSwipe && playerVelocity <= 0.2f)
        {
            Debug.Log("Tap");

        }
        else
        {
            yield break;
        }
    }
    else
    {
        yield break;
    }
}

IEnumerator Right()
{
    Debug.Log("Right");

}

IEnumerator Left()
{
    Debug.Log("Left");

}

关于c# - Unity3d轻扫,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31131525/

10-12 00:13