我正在做一個無盡的亞軍喜歡遊戲,其中非常在力學到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時間更新方法開始像在教程中,我的球員會移動,但沒有到需要的位置,它只會輕微移動,但不會達到目標,並會導致整個移動的「系統」崩潰。
謝謝你的回覆,請檢查我更新的問題 –