Как убрать трение в Unity2D?
Чтобы убрать трение при столкновении со стенами я добавлял колайдеру персонажа физический материал и в нём убирал Friction на 0, но из-за отсутсвия трение персонаж начинал скользить по поверхности земли после остановки движения. А если Friction на 1, то сколькожение пропадало, но персанаж растревает при контакте со стенами. Читал на форумах, что скольжение происходит из-за перемещения персонажа через Transform и нужно делать через velocity, но почему-то у меня это не сработало.
Условие для движения персонажа.
Можно попробовать сделать два коллайдера, на верхний наложить физический материал(в нем все на 0) и нижний оставить как есть и ничего в него не добавлять. Таким образом персонаж не будет прилипать к стенам, благодаря верхнему коллайдера, и скользить не будет так как в низу коллайдер совершенно другой. 
Попробую Вам объяснить. Делайте по пунктам.
Создайте 2 Physics Material 2D:
- назовите первый no_Friction и настройки Friction = 0; Bounciness = 0.
- назовите второй full_Friction и настройки Friction = 100; Bounciness = 0.
В своём скрипте создайте две ссылки на материалы:
В этом же скрипте создайте метод:
Поместите метод SetFriction() в метод Update() для проверки(далее зависит от структуры кода). Сохраните скрипт => идите в Unity.
В инспекторе, в полученном скрипте у вас появилось два новых поля noFriction и fullFriction. Поместите в них ваши материалы из ПУНКТА №1(выше) соответственно.
По факту скрипт заменяет материалы в момент, когда ваше ускорение либо = 0, либо != 0
How to stop rigidbodies sliding and falling off moving platforms in Unity3d and 2D
How to stop rigidbodies sliding and falling off moving platforms in Unity3d and 2D
In this post I will demonstrate a solution to the common problem of slipping off moving platforms in Unity when using RigidBody game objects. The problem can be encountered in both 2D and 3D games, I will cover two known solutions I have come across, and explain in detail the solution I have applied in the game I am working on BloodAndMead.
So what’s the problem?
Lets say you have a player with a RigidBody and BoxCollider attached. You also have a horizontal moving platform which too has a BoxCollider. A RigidBody player (or other object) drops onto the moving platform and expects to be carried along for a ride, but the platform continues to move underneath the object, until it eventually falls / slides off.
Children worldwide cry a river of tears.
There are a few causes of this problem, which will depend on how you have set up your world.
First of all, many people starting with Unity would probably move a platform with a Tweening library like iTween or LeanTween, or translate/ Lerp the x position. Mixing moving rigidbodies and non-rigidbodies together can cause all types of strange issues, as world physics is applied to one and not the other.
There are also dependencies in the way different libraries move objects.
And like most things in Unity, there are a several ways to address a problem.
Here is the result in action taken from Blood And Mead.
So what approach worked for me?
Solution 1: Parent player to platform on collision
I know, sounds crazy right? I thought so anyway, and I wouldn’t have believed it to be a valid solution. But that’s something I have realised with Unity, sometimes the solutions can be a little unorthodox.
So basically, in your Player script, you want to store a reference to the moving platform instance when the player and parent the player to it.
The idea is that the player will jump onto the platform and become parented to it.
That’s great, but now we have the following to consider:
How do we limit player to only parent when the feet collide?
This diagram illustrates how I set up my moving platforms:
When the player jumps up below the platform and bumps their head on the white collider nothing unusual should happen, the player should get knocked back. The same goes for jumping sideways into a platform.
The short black rectangle illustrated in the diagram is the collider that the player will get parented to.
OK, so how do we get off the platform?
There are a few conditions that should unlink the player from the platform: When the player’s walk/run input is triggered, when the player jumps, and when the player exits the collider (pushed off perhaps).
In your player script, find where you make the player move move and jump and add the following:
And then when the player exits the collider, nullify the value of the property holding the collider.
As mentioned, there are always several ways to solve a problem in Unity, and the solution that worked for me, may not for you for various reasons.
Another solution I explored with some success is the following:
Solution 2: Make moving platforms rigidbodies and use MovePosition
Ideally if you have a moving platform designed for RigidBodies, then it should also be a RigidBody and moved with the Rigidbody.MovePosition API.
Here is how the Unity docs describe MovePosition:
If Rigidbody interpolation is enabled on the Rigidbody, calling Rigidbody.MovePosition results in a smooth transition between the two positions in any intermediate frames rendered. This should be used if you want to continuously move a rigidbody in each FixedUpdate.
So within the FixedUpdate method, a simple implementation it will look like this:
If this post has helped you, consider sharing it so more people can solve this problem.
Как убрать скольжение в трехмерном движении единства?
Движение Unity 3D имеет эту встроенную функцию, которая скользит, когда вы перестаете удерживать клавишу. Как убрать это скольжение? заметьте, я ничего не пробовал, я новичок в единстве и, скорее всего, какую-то кнопку мне нужно нажать, пожалуйста, помогите.
2 ответа
Я более чем рад ответить на ваш вопрос, но я не могу пропустить этот лакомый кусочек. Я не могу подчеркнуть это достаточно. Если вы новичок в Unity, вам следует избегать публикации подобных вопросов, насколько это возможно. Я не отговариваю вас от задавания вопросов, но, поскольку вы новичок, действительно попробуйте, прежде чем что-то публиковать. Вы узнаете намного больше, удалив переменные и строки кода, чтобы самостоятельно найти решение, а не сразу получить ответ.
Независимо от того, я верю, что ответ находится в последних двух строках вашего кода:
Давайте подумаем об этой строке за строкой. Разбейте каждую строку и постарайтесь понять, что они значат. Когда вы запускаете свой код, вы получаете три основных ввода от пользователя:
if (Input.GetKey(KeyCode.LeftShift)) — это просто проверка, хочет ли ваш пользователь запускаться или нет. Два других получают то, что, вероятно, вводится движением мыши. Они в основном используются для определения движения пользователей. Мы знаем это, потому что они напрямую связаны с этими двумя строками:
Теперь, когда вы посмотрите на это поближе, это говорит нам о том, что если пользователь не двигает мышь, то Vector3 move будет равен 0. Это означает, что наш игрок прекратит движение и не должно быть никаких причин, по которым он скользит. Однако , взгляните на следующие два.
Они не обязательно управляются пользовательским вводом. Это означает, что, учитывая, что они привязаны к вашему controller , а другие вызовы перемещения не выполняются без ввода пользователя, эти две строки должны стать виновниками вашей проблемы с глиссадой.
Так что удалите их, и вы должны быть хорошими. Однако я должен дать понять, задавать вопросы — это хорошо, но разбивать код, чтобы узнать больше об этом, гораздо лучше. Как вызов, я думаю, вы должны посмотреть, что движет velocity.y . или, может быть, isGrounded . и это расскажет вам больше о том, почему происходит скольжение!
Надеюсь это поможет!
Проверьте поле «Гравитация» на осях «Горизонтальная» и «Вертикальная» в менеджере ввода («Правка»> «Настройки проекта», затем выберите категорию «Вход»). Если не 0, это сгладит ввод с клавиатуры.
Как убрать скольжение персонажа unity 2d
Чтобы убрать трение при столкновении со стенами я добавлял колайдеру персонажа физический материал и в нём убирал Friction на 0, но из-за отсутсвия трение персонаж начинал скользить по поверхности земли после остановки движения. А если Friction на 1, то сколькожение пропадало, но персанаж растревает при контакте со стенами. Читал на форумах, что скольжение происходит из-за перемещения персонажа через Transform и нужно делать через velocity, но почему-то у меня это не сработало.
Условие для движения персонажа.
Можно попробовать сделать два коллайдера, на верхний наложить физический материал(в нем все на 0) и нижний оставить как есть и ничего в него не добавлять. Таким образом персонаж не будет прилипать к стенам, благодаря верхнему коллайдера, и скользить не будет так как в низу коллайдер совершенно другой. 
Попробую Вам объяснить. Делайте по пунктам.
Создайте 2 Physics Material 2D:
- назовите первый no_Friction и настройки Friction = 0; Bounciness = 0.
- назовите второй full_Friction и настройки Friction = 100; Bounciness = 0.
В своём скрипте создайте две ссылки на материалы:
В этом же скрипте создайте метод:
Поместите метод SetFriction() в метод Update() для проверки(далее зависит от структуры кода). Сохраните скрипт => идите в Unity.
В инспекторе, в полученном скрипте у вас появилось два новых поля noFriction и fullFriction. Поместите в них ваши материалы из ПУНКТА №1(выше) соответственно.
По факту скрипт заменяет материалы в момент, когда ваше ускорение либо = 0, либо != 0
Русские Блоги
Контроллер персонажей Unity 2D (горизонтальный ролик)
Собственное 2D-тело Unity будет скользить по склону. Также возможно, что призраки и животные дрожат, когда проходят сквозь стены или сталкиваются с другими объектами.
1. Используйте лучи для оценки столкновения, чтобы предотвратить проникновение сквозь стены:
2. Находясь на земле, запускаем два луча на землю, получаются две точки, линия, образованная двумя точками, эта линия является вектором движения персонажа.
Ниже представлен пользовательский контроллер 2D-персонажей с горизонтальной доской, включая простое движение и прыжки.
Скрипт движения 2D персонажа
Еще один скрипт управления персонажем, заточенный под 2D физику. В отличии от прочих, здесь имеются некоторые настройки. Возможен выбор осей. Например, если выбрать только ось Х, в этом случаи включается режим как для платформера, персонаж может двигаться по горизонтали и использовать прыжок. Если выбрать оси ХY, тогда скрипт переходит в режим как для скроллера, проще говоря, подходит для управления неким самолетом или вроде того, объект может двигаться не только по горизонтали, но и по вертикали, а та-же самая клавиша, что и в первом варианте, на этот раз выполняет роль ускорителя, то есть добавляет скорости. Кроме того, есть опция отслеживания позиции курсора, чтобы персонаж смотрел на него.
Создаем новый C# скрипт Player2DControl, со следующим содержанием:
speed — скорость движения, как не странно.
addForce — если выбран режим Оnly X, будет использовано для прыжка, при нажатии соответствующий клавиши. Во втором режиме, значение addForce будет прибавлено к speed, тем самым придавая ускорение.
lookAtCursor — отслеживание позиции курсора, персонаж будет вращаться по оси Z. Важно помнить, что лицом считается ось Х.
isFacingRight — если на старте сцены персонаж смотрит вправо, то надо ставить true.
При движении только по горизонтали, разворот персонажа осуществляется через функцию Flip. Так же, чтобы прыжок был возможен, все объекты по которым возможно передвижение, как бы земля/поверхность, у всех них должен быть тег Ground.
Как убрать скольжение персонажа unity 2d
в FixedUpdate и через rigidbody.velocity
пробовал просто запустить через AddForce и только на старте, но рывки всё равно есть, как будто сам Rigidbody
перемещает весь объект рывками (при замедлении времени это особенно заметно, но всё равно глаза режет,
когда и работает с обычной юнити скоростью в 50 раз в секунду, FixedUpdate)
Плавные перемещения происходят только тогда, когда работаешь без rigidbody с перемещениями transform,
но так нельзя расчитать коллизию со стенами.
У меня тоже самое бывало — это все решаемо.
1) Делай рассчет движения в Update
2) Героя двигай в FixedUpdate
// кусок из «Update» — считаю следующий шаг. Я это даже не каждый кадр делаю.
if (UnityEngine.Time.frameCount % 2 != 0) return;
for (int i = 0; i < groupMovement.length; i++)
// кусок из «FixedUpdate»
var entity = groupMovement.GetActor(i);
bPos += dataMove.step_next * Time.DeltaTimeFixed * entity.timeScale;
Тебя иментересует метод MovePosition. Не переживай, он будет учитывать коллизии.
Дальше камера. Апдейт делай в LateUpdate. LateUpdate отыгрывается после всех остальных апдейтов и он идеален для камеры : все рассчеты уже завершены. Тоесть камера спокойно будет работать с уже гарантированно изменившимися значениями за кадр. Метод который тебя интересует — Vector3.SmoothDamp
public class ProcessingCamera : ProcessingBase, ITickLate
На остальной мой код особо не смотри, это просто скинул методы из игры что делаю. API почитай на сайте юнити и пользуйся)
Как выглядит
ACTORS — мой фреймворк на Unity
Until We Die — игра над которой работаю