Как ПРАВИЛЬНО сделать передвижение в Unity? Нормали поверхностей + Чистый код на C#
Why Stack Overflow на русском recommends it
Stack Overflow in Russian users link it when answering or reusing code for Unity player movement that bounces or snags on colliders, recommending movement projected along surface normals.
Recommended by 2 people across 2 different months, 2019 to 2022.
What it is
A Russian-language Unity tutorial by Roman Sakutin on implementing player movement that follows surface normals instead of naively pushing a Rigidbody. It walks through why the common approach fails, shows a clean C# solution, and explains the vector math behind it.
What people said
Recommends Alemkhan Utepkaliev · 2021-12 · Stack Overflow на русском · on “Проблема с физикой в местах соединения коллайдеров (отскоки на ровной поверхности)”
Во-первых убедитесь что реальных зазоров нет, для заметки подскажу тем кто может с этим столкнуться, что можно использовать стыковки обьектов путём зажатия клавиши V и выбрав один из углов и протянуть его к другому необходимому углу. Также возможно вам поможет решение с Contact Offset у физики, данный глобальный параметр указывает какое значение будет являтся дистанцией касания, попробуйте установить значение равное 0, или поиграть с значением методом пробы: [LINK] Во-вторых используйте физическое движение вместо "телепортаций" путём transform если в методе Update() указано движение игрока. Вам поможет движение по нормалям поверхности, для удобства есть наглядный видео урок по данной теме: [
Recommends KOTlK · 2022-07 · Stack Overflow на русском · on “Как заставить игрока не отскакивать от поверхности?”
Не двигай игрока физикой, двигай вдоль поверхности. using UnityEngine; namespace MovementAlongSurface { public interface IMovement { void Move(Vector3 direction); } public class AlongSurface : IMovement { private readonly float _speed; private readonly Rigidbody _origin; public AlongSurface(Rigidbody origin, float speed) { _origin = origin; _speed = speed; } public void Move(Vector3 direction) { var deltaTime = Time.deltaTime; var deltaMovement = _origin.position + direction * _speed * deltaTime; var normal = Normal(deltaMovement); if (normal == Vector3.zero) return; var targetDirection = TargetDirection(direction, normal); var targetPosition = _origin.position + targetDirection * _speed * d
Cites Andrew · 2019-01 · Stack Overflow на русском · on “Правильная реализация передвижения персонажа”
Перед прочтением важно знать В любом случае на персонаж должен быть навешан RigidBody - скрипт отвечающий за физику персонажа (силу притяжения, силу трения и т.д.) Хоть я здесь и разбираю в т.ч. нефизическое движение, я настоятельно рекомендую использовать ФИЗИЧЕСКОЕ движение. И переходить на нефизическое только в исключительных ситуациях. В коде не должно быть прямой привязки к кнопкам . Должна быть привязка к параметрам Input Manager [LINK] . Которые можно найти в: Edit -> Project Settings -> Input . Нужно принять это как аксиому и не отходить, несмотря, на то что вы там нагуглите. Я буду использовать здесь 2 термина: "телепортация" и "плавное движение". В моем понимании: Плавное движение
Cites user357875 · 2022-02 · Stack Overflow на русском · on “Unity движение работает не правильно”
Пытаясь повторить движение по этому ролику [this video] столкнулся с рядом проблем. 1.После того как клавишу отпустили игрок движется некоторое время. 2.При соприкосновением с стеной то либо по горизонтали или по вертикали игрок движется медленнее или не двигается. Код: using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; public class MovePlayer : MonoBehaviour { public float _speed = 5f; public Rigidbody rb; private Vector3 _normal; void FixedUpdate() { float h = Input.GetAxis("Horizontal"); float v = Input.GetAxis("Vertical"); Move(new Vector3(-v, 0, h)); } public void Move(Vector3 direction) { Vector3 directionAlongSurface = Project(direction.normal
Cites user357875 · 2022-05 · Stack Overflow на русском · on “Unity2D игрок не прыгает”
Пишу 2D шутер и начал делать передвижение. Я решил переделать код из этого видео [this video] в 2D пространство и вышло это: using UnityEngine; public class MovePlayer : MonoBehaviour { private float speed; public float WalkSpeed = 5f; public float RunSpeed = 7f; public float JumpForce = 6f; private Rigidbody2D rb; private Vector3 _normal; private bool isFacingRight = true; private Animator anim; private bool is_ground; private void Start() { anim = GetComponent<Animator>(); rb = GetComponent<Rigidbody2D>(); } private void Update() { if (Input.GetKey(KeyCode.LeftShift)) speed = RunSpeed; else speed = WalkSpeed; if (Input.GetKeyDown(KeyCode.Space)) { rb.velocity = new Vector2(0, JumpForce); } } vo