Moving player in Subway Surf like game using left/

2019-01-27 08:33发布

I am developing endless runner game like subway surfer in Unity. I want to move my player, smoothly on swipe left or right. How can do it? Here is my code:

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

标签: unity3d
1条回答
smile是对你的礼貌
2楼-- · 2019-01-27 08:57

You could use Vector3.Slerp(Vector3 StartPosition, Vector3 DestinationPosition, float Number)

  • Number is between 0 and 1 and it indicates where will be the position of your object between StartPosition and DestinationPosition.

  • Lets say Number = 0.0f;: your object will be at StartPosition.

  • If Number = 0.5f;: your object will be between StartPosition and DestinationPosition.

  • You need to increase the Number value from 0 to 1 when swipe action is performed.

  • The faster you increase the "Number" value, the faster your object will move towards Destination.

  • You should set you StartPosition once when the swipe action begins, not give your transform.position repeatedly in your Vector3.Slerp() function.

You can find an example here in Unity Docs.

Hope this helps! Cheers!

查看更多
登录 后发表回答