Вы должны применить силу к Rigidbody
персонажа, вместо того, чтобы напрямую манипулировать transform.position
(это мешает физическому движку разрешать столкновения).Вы также замораживаете позиции X и Z на Rigidbody
;Вы не хотите этого, потому что это полностью предотвращает манипулирование этими значениями Rigidbody
.
Вместо transform.postion += ...
сначала получите ссылку на Rigidbody
где-то в вашем скрипте (лучше всего сделать в Awake()
method):
private Rigidbody _body;
private void Awake() {
_body = GetComponent<Rigidbody>();
}
Затем убедитесь, что вектор, построенный из ваших входов, применяется к «движению» объекта, а не к его позиции:
Vector3 inputVector = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
// You can multiply this vector by a float to adjust "speed"
_body.ApplyForce(inputVector, ForceMode.VelocityChange);
Наконец, вы должны прочитатьизучите различные опции ForceMode
и решите, какой из них соответствует вашим предпочтениям: https://docs.unity3d.com/ScriptReference/ForceMode.html
Не забудьте, что это должно произойти в FixedUpdate()
, а не Update()
(все физические операции должны быть выполненыв FixedUpdate()
)
Как примечание стороны, существует также вероятность того, что ваши твердые тела все еще движутся слишком быстро и проходят друг через друга.Даже если вы используете силы и скорости, это возможно, поэтому, если вы столкнетесь с этим делом в будущем, исследуйте Режимы обнаружения столкновений .TLDR;это настройки производительности и компромиссов точности.