下面是我為 2D 運動撰寫的代碼:
void HandleInput()
{
float verticalMoveAmount = Input.GetAxis("Vertical") * playerSpeed * Time.deltaTime;
float horizontalMoveAmount = Input.GetAxis("Horizontal") * playerSpeed * Time.deltaTime;
if (facingRight)
{
transform.Translate(horizontalMoveAmount, verticalMoveAmount, 0);
}
else
{
transform.Translate(-horizontalMoveAmount, verticalMoveAmount, 0);
}
if (horizontalMoveAmount > 0 && !facingRight)
{
Flip();
}
else if (horizontalMoveAmount < 0 && facingRight)
{
Flip();
}
if (Input.GetKeyDown(KeyCode.Space) && hasBall)
{
Shoot();
}
}
void Flip()
{
facingRight = !facingRight;
transform.Rotate(0f, 180f, 0f);
}
我有以下問題:
- 我有一個 Cinemachine 虛擬攝像機跟隨玩家。然而,每當玩家改變方向時,他們就會從攝像機視圖中消失。我認為這與 Flip() 有關,但我不知道為什么或如何解決它。
- if facesRight 的 if 陳述句,我必須在水平軸上使用負移動,這感覺是一種非常糟糕的處理方式,但如果我不這樣做,當玩家改變方向時我不能向左移動左邊。有沒有更好的方法可以做到這一點?
先感謝您。
uj5u.com熱心網友回復:
1)我的猜測是,由于您將物件旋轉 180°,因此您正在查看它的背面 -> 由于背面剔除,它沒有被渲染。
到 2)由于您將物件旋轉 180°,因此它的區域坐標系現在指向另一個方向。請注意,默認情況下Transform.Translate在本地坐標系中作業。如果您想使用全域軸,則只需傳入
transform.Translate(horizontalMoveAmount, verticalMoveAmount, 0, Space.World);
一般來說,簡單地假設您使用的SpriteRenderer是 2D 游戲最常見的東西,您應該使用該屬性SpriteRenderer.flipX而不是根本不旋轉您的物件。這將同時解決這兩個問題
所以你的代碼可以很簡單
public SpriteRenderer spriteRenderer;
void HandleInput()
{
var input = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
// ensure that diagonal movement isn't faster
input = Vector2.ClampMagnitude(input, 1f);
var movement = input * playerSpeed * Time.deltaTime;
transform.Translate(movement, Space.World);
// basically the same now as
//transform.position = movement;
if (input.x != 0)
{
spriteRenderer.flipX = input.x < 0;
}
if (hasBall && Input.GetKeyDown(KeyCode.Space))
{
Shoot();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/424488.html
