2017-05-29 14 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方法的代码在第一次之后不会在更新方法中调用。谢谢你的帮助:)

相关问题