使用左/右滑动在地铁冲浪中移动玩家

时间:2017-02-10 07:17:34

标签: unity3d

我正在开发像Unity中的地铁冲浪者这样的无尽的赛跑游戏。 我想移动我的播放器,顺利向左或向右滑动。 怎么办? 这是我的代码:

using UnityEngine;
using System.Collections;

public class SwipeScript3 : MonoBehaviour {

private Touch initialTouch = new Touch();
private float distance = 0;
private bool hasSwiped = false;
//Quaternion targetx = Quaternion.Euler(0, -3f, 0);
//Quaternion targety = Quaternion.Euler(0, 3f, 0);

void FixedUpdate()
{
    foreach(Touch t in Input.touches)
    {
        if (t.phase == TouchPhase.Began)
        {
            initialTouch = t;
        }
        else if (t.phase == TouchPhase.Moved && !hasSwiped)
        {
            float deltaX = initialTouch.position.x - t.position.x;
            float deltaY = initialTouch.position.y - t.position.y;
            distance = Mathf.Sqrt((deltaX * deltaX) + (deltaY * deltaY));
            bool swipedSideways = Mathf.Abs(deltaX) > Mathf.Abs(deltaY);

            if (distance > 50f)
            {
                if (swipedSideways && deltaX > 0) //swiped left
                {

                    //transform.rotation = Quaternion.Slerp (transform.rotation, targetx, Time.deltaTime * 0.8f);
                    this.transform.Rotate(new Vector3(0, -3f, 0)*Time.deltaTime);
                    //transform.position = Vector3.Lerp (transform.position,new Vector3(transform.position.x+5f,transform.position.y,transform.position.z),Time.deltaTime*2f );
                    transform.position = Vector3.Lerp (transform.position, new Vector3 (transform.position.x - 5f, transform.position.y, transform.position.z), Time.deltaTime * 5f);
                }
                else if (swipedSideways && deltaX <= 0) //swiped right
                {
                    //transform.rotation = Quaternion.Slerp (transform.rotation, targety, Time.deltaTime * 0.8f);
                    this.transform.Rotate(new Vector3(0, 3f, 0)*Time.deltaTime);
                    //transform.position = Vector3.Lerp (transform.position, new Vector3 (transform.position.x - 5f, transform.position.y, transform.position.z), Time.deltaTime * f);
                    transform.position = Vector3.Lerp (transform.position,new Vector3(transform.position.x+5f,transform.position.y,transform.position.z),Time.deltaTime*5f );
                }
                else if (!swipedSideways && deltaY > 0) //swiped down
                {
                    //this.transform.Rotate(new Vector3(0, 2f, 0));
                    transform.position = Vector3.Lerp (transform.position,new Vector3(transform.position.x,transform.position.y,transform.position.z-5f),Time.deltaTime*2f );
                }
                else if (!swipedSideways && deltaY <= 0)  //swiped up
                {
                    this.GetComponent<Rigidbody>().velocity = new Vector3(this.GetComponent<Rigidbody>().velocity.x, 0, this.GetComponent<Rigidbody>().velocity.z);
                    this.GetComponent<Rigidbody>().AddForce(new Vector3(0, 400f, 0));
                    Debug.Log ("Swiped Up");
                }

                hasSwiped = true;
            }

        }
        else if (t.phase == TouchPhase.Ended)
        {
            initialTouch = new Touch();
            hasSwiped = false;
        }
    }
}
}

1 个答案:

答案 0 :(得分:3)

您可以使用Vector3.Slerp(Vector3 StartPosition, Vector3 DestinationPosition, float Number)

  • Number介于0和1之间,表示您的对象在StartPositionDestinationPosition之间的位置。

  • 让我们说Number = 0.0f;:你的对象将在StartPosition

  • 如果Number = 0.5f;:您的对象将介于StartPositionDestinationPosition之间。

  • 执行滑动操作时,您需要将Number值从0增加到1.

  • 你越快地增加&#34;数字&#34;值,您的对象移动到目的地的速度越快。

  • 您应该在滑动操作开始时设置StartPosition一次,而不是在transform.position功能中重复Vector3.Slerp()

您可以在Unity Docs中找到示例here

希望这有帮助!干杯!