2017-05-29 71 views
0

我正在做一個無盡的亞軍喜歡遊戲,其中非常在力學到Android IronMan遊戲。玩家將沿着球場直行,並且可以左右移動,上下移動。我設法將屏幕分成9個部分,並實現一個小控制系統,以識別玩家在哪裏以及他想要移動的位置,並且如果他/她被允許在那裏移動,我設法讓玩家移動到所需的位置在屏幕上的位置,而不是逐步從一個點到另一個遊戲對象只是從一個位置捕捉到另一個位置。請在下面找到我的代碼在一個方向移動:Vector3.Lerp在C#中的統一不移動順利只是從一個位置捕捉到另一個

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時間更新方法開始像在教程中,我的球員會移動,但沒有到需要的位置,它只會輕微移動,但不會達到目標,並會導致整個移動的「系統」崩潰。

回答

2

Lerp將通過一個因子內插兩個值。舉例來說,如果你在0到20之間Lerp的係數爲0.5,結果將是10,0將是0,1將是20,依此類推。

爲什麼我這麼說?因爲在你的代碼中,你只需要Lerp,其係數爲1.0f,這隻會返回最終值。

如果你想要一個平滑的插值,你必須從所需速度的因子「移動」到0到1。

+0

謝謝你的回覆,請檢查我更新的問題 –

0

好吧,我把它修好了,工作,gonne現在清理了很多代碼。問題是事實上,我按下按鈕,並且位置只更新一次,負責調用Lerp方法的代碼在第一次之後不會在更新方法中調用。謝謝你的幫助:)

相關問題