私はアンドロイド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の変数を移動しようとしました、それは非常にわずかに動くだけで目標に到達することはなく、動く "システム"全体をクラッシュさせるでしょう。
返信いただきありがとうございます私の更新された質問を確認してください –