Код, который вы используете, равен
void Update()
{
float hAxis = Input.GetAxis("Horizontal");
float vAxis = Input.GetAxis("Vertical");
Vector3 Movement = new Vector3(hAxis, 0, vAxis) * speed * Time.deltaTime;
transform.position = Movement;
rig.MovePosition(transform.position);
}
Теперь вы видите, в чем проблема?
ваш Movement
будет каждый кадр очень маленьким, поскольку оно умножается на Time.deltaTime
(для 60 F / s это примерно равно 1/60 = 0.017
) - еще не является частью проблемы;)
Затем вы устанавливаете Ваш объект фиксируется в этой позиции через transform.position
. Это всегда будет довольно близко к 0,0,0
с диапазоном около 1/60 * 18 = 0.3
.
И, наконец, вы говорите Rigidbody
, чтобы он двигался точно в ту же позицию, в которой находится ваш объект. сейчас уже в любом случае.
Rigidbody.MovePosition
ожидает абсолютную позицию в мире, поэтому вы скорее всего хотите использовать
rig.MovePosition(rig.position + Movement);
Затем обратите внимание, что любое движение, связанное с физикой, должно быть выполнено в FixedUpdate
, поэтому ваш код должен выглядеть примерно так:
public class PlayerMovement : MonoBehaviour
{
public float speed = 18;
// You could/should reference this directly via the Inspector
[SerializeField] private Rigidbody rig;
private Vector3 _movement;
private void Awake()
{
if(!rig) rig = GetComponent<Rigidbody>();
}
// Get User input in Update
private void Update()
{
float hAxis = Input.GetAxis("Horizontal");
float vAxis = Input.GetAxis("Vertical");
_movement = new Vector3(hAxis, 0, vAxis) * speed * Time.deltaTime;
}
// But apply Physics in FixedUpdate
private void FixedUpdate()
{
rig.MovePosition(rig.position + _movement);
}
}
Обратите внимание, что в качестве альтернативы, не разделяя оба Вы также можете напрямую назначить Rigidbody.velocity
вместо:
public class PlayerMovement : MonoBehaviour
{
public float speed = 18;
// You could/should reference this directly via the Inspector
[SerializeField] private Rigidbody rig;
private void Awake()
{
if(!rig) rig = GetComponent<Rigidbody>();
}
private void Update()
{
float hAxis = Input.GetAxis("Horizontal");
float vAxis = Input.GetAxis("Vertical");
var movement = new Vector3(hAxis, 0, vAxis) * speed * Time.deltaTime;
rig.velocity = movement;
}
}