Почему скорость передвижения разная по X и Y , хотя задал одну скорость . Unity
public float speedX = 10.0f, speedY = 10.0f;
public static bool triggerEnter;
float _x, _y;
Rigidbody rb;
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
_x = Input.GetAxis("Horizontal") * Time.fixedDeltaTime * speedX;
_y = Input.GetAxis("Vertical") * Time.fixedDeltaTime * speedY;
Vector3 v = new Vector3(_x, _y);
rb.AddForce(v, ForceMode.Impulse);
if (!Input.GetKeyUp(KeyCode.UpArrow) || !Input.GetKeyUp(KeyCode.DownArrow))
{
rb.velocity = new Vector3(_x, 0, 0);
}
if (!Input.GetKeyUp(KeyCode.LeftArrow) || !Input.GetKeyUp(KeyCode.RightArrow))
{
rb.velocity = new Vector3(0, _y, 0);
}
}
Ответы (1 шт):
в вашем коде каждый кадр выполняются условия:
if (!Input.GetKeyUp(KeyCode.UpArrow) || !Input.GetKeyUp(KeyCode.DownArrow))
{
rb.velocity = new Vector3(_x, 0, 0);
}
потому, что кнопка всегда отжата (если на нее не нажимают) таким образом, почему по оси Y скорость в 2 раза больше? просто потому, что в FixedUpdate условия "сброса" скорости стоит в конце блока.. если поменять местами условия для оси X вместо Y, то ось икс станет в 2 раза быстрее по скорости
по этому нужно быть, всегда внимательнее в по кадровом выполнении кода, если вы уж решили сбрасывать скорость до нуля таким образом, то в методе FixedUpdate лучше сделать вот так :
void FixedUpdate()
{
_x = Input.GetAxis("Horizontal") * Time.fixedDeltaTime * speedX;
_y = Input.GetAxis("Vertical") * Time.fixedDeltaTime * speedY;
Vector3 v = new Vector3(_x, _y);
rb.AddForce(v, ForceMode.Impulse);
if (_x == 0 || _y == 0)
{
rb.velocity = Vector3.zero;
}
else
{
rb.velocity = Vector2.ClampMagnitude(v, 0);
}
}
есть более рациональные способы, контролировать скорость, почитайте побольше о Rigidbody
вам так же тут понадобиться адекватно ограничить нарастающую скорость по диагонали, я просто привел very simple пример
