#c# #visual-studio #unity3d
#c# #visual-studio #unity3d
Вопрос:
Всякий раз, когда я натыкаюсь на стену, например, если слева от меня стена, и я прижимаю букву «а» к стене, это как бы сбивает с толку. Похоже, что персонаж входит и выходит из стены. Надеюсь, это имело смысл, и вы знаете, о чем я говорю. Итак, мой вопрос в том, как я могу это исправить, чтобы, когда я активно сталкиваюсь со стеной, этого не происходило, и вместо этого персонаж просто стоял у стены и, похоже, вообще двигался.
код для движения:
void Update()
{
var movement = Input.GetAxis("Horizontal");
transform.position = new Vector3(movement, 0, 0) * Time.deltaTime * MovementSpeed;
if (Input.GetButtonDown("Jump") amp;amp; Mathf.Abs(_rigidbody.velocity.y) < .001f)
{
_rigidbody.AddForce(new Vector2(0, JumpForce), ForceMode2D.Impulse);
}
}
Ответ №1:
Установка transform.position буквально телепортирует игрока, поэтому иногда он телепортирует их в стену, а затем их отбрасывает назад. Чтобы предотвратить это, я предлагаю использовать функцию MovePosition rigidbody. Это учитывает физику при движении, поэтому оно взаимодействует с другими объектами, которые там есть.
Чтобы изменить ваш текущий код на это, это было бы что-то вроде этого:
void Update()
{
var movement = Input.GetAxis("Horizontal");
//This moves the GameObject to the currentPosition The move direction. Which means to move it in the direction that you intended to move in.
_rigidbody.MovePosition(transform.position new Vector3(movement, 0, 0) * Time.deltaTime * movementSpeed);
if (Input.GetButtonDown("Jump") amp;amp; Mathf.Abs(_rigidbody.velocity.y) < .001f)
{
_rigidbody.AddForce(new Vector2(0, JumpForce), ForceMode2D.Impulse);
}
}
Однако я предлагаю разделить его на это:
float movement = 0f; //Setting a default value.
void Update()
{
movement = Input.GetAxis("Horizontal"); //Getting movement input from player
if (Input.GetButtonDown("Jump") amp;amp; Mathf.Abs(_rigidbody.velocity.y) < .001f)
{
_rigidbody.AddForce(new Vector2(0, JumpForce), ForceMode2D.Impulse);
}
}
private void FixedUpdate()
{ //Moving in Physics update
_rigidbody.MovePosition(transform.position new Vector3(movement, 0, 0) * Time.deltaTime * movementSpeed);
}
Поскольку Update проверяет каждый кадр, поэтому он хорош для проверки ввода, однако вы должны применять физику в FixedUpdate() , потому что это применяется всякий раз, когда есть обновление физики (или фрейм физики). (Для еще большей плавности!)