2017-02-10 5 views
0

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

タイトルをもっと読みやすいものに変更することを検討してください。_スワイプの左または右に滑らかに移動する方法(地下鉄サーファーのような無限のランナーゲーム)?_。あなたの投稿が既に編集されているので、私は悲しいことにそれを提案することはできません(<2k rep)。 – Kardux

答えて

3

あなたはVector3.Slerp(Vector3 StartPosition, Vector3 DestinationPosition, float Number)

  • Numberを使用することができ、0と1の間にあり、StartPositionDestinationPositionの間、あなたのオブジェクトの位置になりますそれはどこを示しています。

  • Number = 0.0f;と書いてください:あなたのオブジェクトはStartPositionになります。

  • Number = 0.5f;の場合、オブジェクトはStartPositionDestinationPositionの間になります。

  • スワイプ処理を実行するときは、Numberの値を0から1に増やす必要があります。

  • 「数値」の値が速くなるほど、オブジェクトが目的地に向かって移動する速度が速くなります。

  • スワイプが開始されたときにStartPositionを1回設定すると、Vector3.Slerp()機能に繰り返しtransform.positionが返されることはありません。

hereはUnity Docsにあります。

希望すると便利です。乾杯!

+0

EmreE私はあなたのアプローチを適用しましたが、結果はまだありません。私のプレーヤーのテレプロテクトはスムーズに動かない... –

+0

あなたのプレイヤーがテレポートしていると思ういくつかの理由; - 「番号」の値が速すぎますか? 3つのポジションがあるとします。左、中央、右。 プレーヤーを中央から左に移動したいとします。 開始位置を中間位置(この場合はtransform.pos)とし、destinationPostionを左位置として指定します。 "Number"の値を十分に遅くすると、プレイヤーは中央から左へスムーズに移動する必要があります。 – Thalthanas

+0

また、Vector3.Lerpで同じことを試すことができます。結果を教えてください。 @hamzamustafa – Thalthanas

関連する問題