2017-05-29 11 views
0

私はアンドロイドIronManのゲームに非常に力学的な場所でゲームのような無限のランナーを作っています。プレーヤーはコースに沿ってまっすぐ飛行し、左右、上下に移動できます。私は9つのセクションに画面を分割し、プレーヤーがどこにいて、どこに移動したいのかを認識する小さなコントロールシステムを実装しました。そこで移動することが許可されていて、画面上の位置を変更する代わりに、あるポイントから別のポイントに徐々に移動する代わりに、Gameオブジェクトはある位置から別の位置にスナップします。私も、このチュートリアル以下の別のアプローチを試してみたVector3.LerpがC#で1つの位置から別の位置にスムーズに移動しない

public class PlayerControl : MonoBehaviour 
{ 

// Declare Control Input 
public KeyCode moveL; 
public KeyCode moveR; 
public KeyCode moveU; 
public KeyCode moveD; 

// Set movement distance 
private float verticalIncrement = 3.0f; 
private float horizontalIncrement = 5.0f; 

// Set initial internal position of the craft 
private int laneNum = 1; 
private int rowNum = 1; 

// Declare player Game object 
GameObject spaceCraft; 

// Set input lock 
bool pressLockOn = false; 

// Use this for initialization 
void Start() 
{ 
    spaceCraft = GameObject.FindGameObjectWithTag("Player"); 
} 

// Update is called once per frame 
void Update() 
{   
    if (Input.GetKeyDown(moveR)) 
    { 
     if (laneNum < 2) 
     { 
      // Retrieve craft current position coordinates 
      float craftPositionX = spaceCraft.transform.localPosition.x; 
      float craftPositionY = spaceCraft.transform.localPosition.y; 

      // Save craft's desired position coordinates as string for comparison 
      string newCraftPositionString = (craftPositionX + horizontalIncrement) + "" + craftPositionY; 

      // Declare target box position coordinates for comparison 
      string targetPositionString = null; 

      // Find desired target box based on player's location and button pressed 
      for (int i = 0; i < Initialization.positionCubesArray.Length; i++) 
      { 
       for (int j = 0; j < Initialization.positionCubesArray[i].Length; j++) 
       { 
        // Declare temp GameObject to store desired target box 
        GameObject target = Initialization.positionCubesArray[i][j]; 

        // Retrieve target box location coordinates 
        float boxPosX = target.GetComponent<Transform>().localPosition.x; 
        float boxPosY = target.GetComponent<Transform>().localPosition.y; 

        // Save target box's coordinates as string for comparison 
        boxPositionString = boxPosX + "" + boxPosY; 

        // Check if craft's desired position matches found target 
        if (newCraftPositionString.Equals(targetPositionString)) 
        { 
         // Set input lock on 
         pressLockOn = true; 

         // Move player's craft to desired location 
         spaceCraft.transform.localPosition = Vector3.Lerp(spaceCraft.transform.localPosition, target.transform.localPosition, 1f);        

         // Start coroutine to delay input lock for half a second 
         StartCoroutine(stopTime(0.5f)); 

         // Check if craft traveled to desired location 
         if ((craftPositionX + "" + craftPositionY).Equals(newCraftPositionString)) 
         { 
          // Update internal position of the craft 
          laneNum++; 
         } 
        } 
       } 
      } 
     } 
    } 
... 
} 

IEnumerator stopTime(float amount) 
{  
    yield return new WaitForSeconds(amount); 
    pressLockOn = false; 
} 

https://www.youtube.com/watch?v=Zb7Th_H7bvw

をしかし、それはどちらか動作しないとないでしょうでしょう一方向に移動するための私のコードの下に見つけてください旅の割合が常に0になるので、私のプレーヤーをすべて動かしてください。私はまた、ループから移動オブジェクトロジックをエクスポートしようとしましたが、効果もありませんでした。更新されたコードの下に見つけてください:

// Update is called once per frame 
void Update() 
{ 
    if (Input.GetKeyDown(moveR)) 
    { 
     if (laneNum < 2) 
     { 
      // Declare target Dame object 
      GameObject target; 

      // Retrieve craft position coordinates 
      float craftPositionX = spaceCraft.transform.localPosition.x; 
      float craftPositionY = spaceCraft.transform.localPosition.y; 

      // Retrieve desired craft's postiotn 
      string newCraftPositionString = (craftPositionX + horizontalIncrement) + "" + craftPositionY; 

      // Declare target box string for comparison 
      string boxPositionString = null; 

      // Declare initial temp i and j to export target game object from the loops 
      int tempI = 0; 
      int tempJ = 0; 

      // Search for target game objects in 2D array 
      for (int i = 0; i < Initialization.positionCubesArray.Length; i++) 
      { 
       // Setup found target flag 
       bool foundTarget = false; 
       for (int j = 0; j < Initialization.positionCubesArray[i].Length; j++) 
       { 
        // Retrieve each target's coordinates 
        float boxPosX = Initialization.positionCubesArray[i][j].GetComponent<Transform>().localPosition.x; 
        float boxPosY = Initialization.positionCubesArray[i][j].GetComponent<Transform>().localPosition.y; 

        // Target coordinates string for comparison 
        boxPositionString = boxPosX + "" + boxPosY; 

        // Check if target's coordinates matches desired location's coordinates 
        if (newCraftPositionString.Equals(boxPositionString)) 
        {      
         // Set temp i and j to export found target out off the loop 
         tempI = i; 
         tempJ = j; 
         print("Found Target\n " + tempI + " " + tempJ); 
         print("Target Postion: " + boxPositionString); 

         // Set found target flag to true 
         foundTarget = true; 

         // Break inner loop 
         break; 
        } 
       } 

       // Break outter loop 
       if (foundTarget) 
       { 
        break; 
       } 
      } 

      print("New Crafft Position: " + newCraftPositionString + "\nTarget Position: " + boxPositionString); 


      // Again chack if target's coordinates matches desired location's coordinates 
      if (newCraftPositionString.Equals(boxPositionString)) 
      { 
       // Retrieve found target from 2D array with temp i and j found in 2D for-loop 
       target = Initialization.positionCubesArray[tempI][tempJ]; 

       // Set input lock on 
       pressLockOn = true; 

       float startTime = Time.time; 
       float totalDistance = Vector3.Distance(spaceCraft.transform.localPosition, target.transform.localPosition); 
       float currentDurration = Time.time - startTime; 
       float journeyFraction = currentDurration/totalDistance; 

       print("Start time: " + startTime + " | Total Distance: " + totalDistance 
        + "\nCurrent Durration: " + currentDurration + " | Journey fraction: " + journeyFraction); 
       spaceCraft.transform.localPosition = Vector3.Lerp(spaceCraft.transform.localPosition, target.transform.localPosition, journeyFraction); 

       // Start coroutine to delay input lock 
       StartCoroutine(stopTime(0.5f)); 

       // Update internal craft coordinates 
       if ((craftPositionX + "" + craftPositionY).Equals(newCraftPositionString)) 
       { 
        laneNum++; 
       } 
      } 
     } 
    } 

私もチュートリアルのように更新メソッドの開始に方法とcurrentDuration時間を開始するために、私のプレイヤーが目的の位置に移動しなくなりstartTimeの変数を移動しようとしました、それは非常にわずかに動くだけで目標に到達することはなく、動く "システム"全体をクラッシュさせるでしょう。

答えて

2

Lerpは、因子を介して2つの値を補間します。たとえば、Lerpが0から20の間で0.5の係数の場合、結果は10、0は0、1は20などとなります。

なぜ私はそれを言いますか?あなたのコードでは、Lerpの係数が1.0fであるため、最終的な値が返されるだけです。

滑らかな補間が必要な場合は、希望の速度で係数の0から1まで「移動」する必要があります。

+0

返信いただきありがとうございます私の更新された質問を確認してください –

0

OK私はそれを固定して働いていて、コードをクリアするだけではなく、今もなおすっきりしています。問題は、私がボタンを押していて、位置が一度しか更新されず、初めてLerpメソッドを呼び出すコードが更新メソッドで呼び出されなかったことです。ありがとうございましたtho :)

関連する問題