Скрипт ходьбы и бега Unity2D
С ходьбой у персонажа всё отлично, попытался сделать аналогично бег, только увеличть его скорость вдвое, то есть walkSpeed * 2, только когда зажата клавиша Shift и A или D, делал не через стринг, а через бул. Почему с ходьбой все работает отлично, а с бегом такие траблы?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
Rigidbody2D rb2d;
Animator anim;
[SerializeField] private float walkSpeed;
private string buttonPressed;
private bool playerRuns;
public const string RIGHT = "right";
public const string LEFT = "left";
private void Start()
{
rb2d = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
}
private void Update()
{
//WALK
if (Input.GetKey(KeyCode.D))
{
buttonPressed = RIGHT;
}
else if (Input.GetKey(KeyCode.A))
{
buttonPressed = LEFT;
}
else
{
buttonPressed = null;
}
//RUN
if (Input.GetKeyDown(KeyCode.D))
{
if (Input.GetKey(KeyCode.LeftShift))
{
playerRuns = true;
}
}
else if (Input.GetKeyDown(KeyCode.A))
{
if (Input.GetKey(KeyCode.LeftShift))
{
playerRuns = true;
}
}
else
{
playerRuns = false;
}
}
private void FixedUpdate()
{
if (playerRuns == true)
{
rb2d.velocity = new Vector2(walkSpeed * 2.0f * Time.deltaTime, 0);
}
else
{
rb2d.velocity = new Vector2(0, 0);
}
//Walk
if (buttonPressed == RIGHT)
{
rb2d.velocity = new Vector2(walkSpeed * Time.deltaTime, 0);
anim.SetBool("Walk", true);
}
else if (buttonPressed == LEFT)
{
rb2d.velocity = new Vector2(-walkSpeed * Time.deltaTime, 0);
anim.SetBool("Walk", true);
}
else
{
rb2d.velocity = new Vector2(0, 0);
anim.SetBool("Walk", false);
}
}
}
Ответы (1 шт):
Автор решения: Yaroslav
→ Ссылка
GetKey - зажата ли клавиша
GetKeyDown - событие нажатия
Условия в FixedUpdate сломанные, if (playerRuns) else не имеет значения, поскольку что бы оно не сделало if (buttonPressed == RIGHT) else if (buttonPressed == LEFT) else всё равно изменят результат.
Ещё при одновременном A и D игнорируется A, что плохо.
enum kSide { None, Left, Right }
kSide MoveSide;
bool IsRunning;
private void Update () {
if (Input.GetKeyDown(KeyCode.D))
MoveSide = kSide.Right;
if (Input.GetKeyDown(KeyCode.A))
MoveSide = kSide.Left;
if (Input.GetKeyUp(KeyCode.D))
MoveSide = Input.GetKey(KeyCode.A) ? kSide.Left : kSide.None;
if (Input.GetKeyUp(KeyCode.A))
MoveSide = Input.GetKey(KeyCode.D) ? kSide.Rigt : kSide.None;
IsRunning = Input.GetKey(KeyCode.LeftShift);
}
private void FixedUpdate () {
float Speed = 0;
if (MoveSide != kSide.None)
Speed = MoveSide == kSide.Right ? walkSpeed : -walkSpeed;
if (IsRunning)
Speed *= 2f;
rb2d.velocity = new Vector2(Speed*Time.deltaTime, 0);
anim.SetBool("Walk", MoveSide != kSide.None);
}
Твои простые if (bool) X = A else X = B легко заменяются конструкцией X = bool ? A : B.