私はこの問題に直面したとき、しばらくの間、3Dエンドレスランナーゲームに取り組んできました。横方向の動きの間に、各レーンを切り替えた後、私のキャラクターはちょうど、ゲームをプレイしている人にとっては目立つ2つの小数点を戻します(-z軸)。彼はいくつかの小数を逆戻りしているように感じる。問題は、この単純なコードtransform.position = locationAfterChangingLane;
を追加した後に発生し、横方向の動きのオーバーフローを止めました。それはあふれることを止めましたが、この厄介なバグを作りました。Unityでオーバーフローを起こさずにキャラクターサイドウェイを移動するには?
(if文のコード行を更新方法でisChangingLane
に位置する。)
ここに私のスクリプトがあります(フル、また、私は簡単に参照できる場所を上記のコード行をコメントしています。)
//Variables for Lane switching
private bool isChangingLane = false;
private Vector3 locationAfterChanginLane = Vector3.zero;
private Vector3 sideWayMovementDistance = Vector3.right * 2f; // This might be the case that triggers abnormal movements
private float sideWaySpeed = 6f;
public enum Lane
{
Left,
Right,
Center
}
public enum MoveDirection
{
Left,
Right,
None
}
Lane currentLane = Lane.Center;
void Update()
{
currentBaseState = anim.GetCurrentAnimatorStateInfo(0);
if (controller.isGrounded)
{
verticalVelocity = -0.5f;
if (currentBaseState.fullPathHash == locoState)
{
if (Input.GetButtonDown("Jump"))
{
verticalVelocity = 18f;
anim.SetBool("Jump", true);
}
else if (Input.GetKeyDown(KeyCode.S))
{
anim.SetBool("Slide", true);
}
}
MoveLeftRight(); // This is the method to move right and left.
if (isChangingLane)
{
if (Math.Abs(transform.position.x - locationAfterChanginLane.x) < 0.1f)
{
isChangingLane = false;
moveVector.x = 0;
transform.position = locationAfterChangingLane; // This is the code which throws this issue.
}
}
}
}
private void MoveLeftRight()
{
MoveDirection requestedMoveDirection = MoveDirection.None;
if (Input.GetKeyDown(KeyCode.A) && !isChangingLane)
{
requestedMoveDirection = MoveDirection.Left;
isChangingLane = true;
}
else if (Input.GetKeyDown(KeyCode.D) && !isChangingLane)
{
requestedMoveDirection = MoveDirection.Right;
isChangingLane = true;
}
switch (requestedMoveDirection)
{
case MoveDirection.Right:
if (currentLane == Lane.Right)
{
Debug.Log("Right Lane");
break; //Do nothing when in right lane.
}
else if (currentLane == Lane.Center)
{
locationAfterChanginLane = transform.position + sideWayMovementDistance;
moveVector.x = +sideWaySpeed;
currentLane = Lane.Right;
Debug.Log("Center --> Right");
}
else if (currentLane == Lane.Left)
{
locationAfterChanginLane = transform.position + sideWayMovementDistance;
moveVector.x = +sideWaySpeed;
currentLane = Lane.Center;
Debug.Log("Left --> Center");
}
break;
case MoveDirection.Left:
if (currentLane == Lane.Left)
{
Debug.Log("Left Lane");
break; //Do nothing when in left lane.
}
else if (currentLane == Lane.Center)
{
locationAfterChanginLane = transform.position - sideWayMovementDistance;
moveVector.x = -sideWaySpeed;
currentLane = Lane.Left;
Debug.Log("Center --> Left");
}
else if (currentLane == Lane.Right)
{
locationAfterChanginLane = transform.position - sideWayMovementDistance;
moveVector.x = -sideWaySpeed;
currentLane = Lane.Center;
Debug.Log("Right --> Center");
}
break;
}
}
ヘルプをいただければ幸いです。これをどうすれば解決できますか?また、なぜこれが起こるのかを親切に説明できますか?どうもありがとう!
すばらしいです!私はあなたのサイドノートを考えています。なぜなら、統一ユーザーの多くは、プレイヤーよりも世界をより良く動かすと言っているからです。だから私は世界のセクションを移動する方法を試してみるだろう。助けてくれてありがとう。 –
私は世界を変えることについて知らない。これはクランプ値に戻ります。不必要な不正確さでフロートがどこからでも出血するのを防ぎます。 –