Unity персонаж проваливается сквозь пол

Обновлено: 22.04.2024

У меня проблема с прыжком: если мой персонаж ХОДИТ на платформу X, он не будет прыгать, но когда она Прыгает на платформу X, она может совершить прыжок.

Для платформ в настоящее время я использую 2 2D-коллайдера Box Collider (один с установленным флажком "запускается")

Для персонажа в настоящее время я использую 2 Box Collider 2D (один с отмеченным флажком) и Rigidbody 2D.

Ниже приведен код для прыжков и заземления, который я сейчас пытаюсь использовать.

2 ответа

Я думаю, здесь есть пара проблем.

Во-первых, использование Triggers для проверки этого типа столкновения, вероятно, не лучший путь вперед. Я бы предложил не использовать триггеры, а вместо этого использовать OnCollisionEnter2D() . Triggers просто определяет, перекрывается ли пространство столкновения двух объектов друг с другом, тогда как нормальные столкновения сталкиваются друг с другом, как если бы они были двумя твердыми объектами. Если смотреть так, будто вы пытаетесь понять, приземлились ли вы на пол, вы не хотите проваливаться сквозь пол, как Triggers .

Во-вторых, я бы предложил использовать AddForce вместо GetComponent().velocity .

Ваш окончательный сценарий может выглядеть примерно так:

Это происходит потому, что у ваших квадратов есть отдельные коллайдеры. Представьте себе это:

Есть два блока: A и B . Вы стоите на блоке A . Теперь вы пытаетесь пройти по блоку B . Как только ваш коллайдер Rigidbody2D касается блока B , ваш персонаж получает событие OnTriggerEnter2D(. ) . Теперь вы утверждаете, что обоснованы.
Однако в этот момент вы все еще сталкиваетесь с блоком A . Как только ваш Rigidbody2D больше не сталкивается с блоком A , ваш персонаж получает OnTriggerExit2D(. ) . Теперь вы заявляете, что больше не обоснованы. Но на самом деле вы все еще сталкиваетесь с блоком B .

Решение

Вместо переменной bool для проверки заземления можно использовать переменную типа byte с именем collisionsCounter :

  • Как только вы вводите триггер - увеличивайте счетчик.
  • После выхода из триггера уменьшите счетчик.

Проверьте, действительно ли вы находитесь над коллайдером!

Теперь, когда вам нужно проверить, заземлен ли ваш персонаж, вы можете просто использовать

РЕДАКТИРОВАТЬ

Собственно, после того, как задал вопрос дальше, я понял, что у вас есть совершенно ненужные коллайдеры (я говорю о триггерных). Удалите те. Теперь у вас есть только один коллайдер на объект. Но чтобы получать призывы к коллизии, вам нужно изменить:

  • OnTriggerEnter2D(. ) в OnCollisionEnter2D(Collision2D)
  • OnTriggerExit2D(. ) в OnCollisionExit2D(Collision2D)

Финальный код

Здесь могут быть мелкие опечатки, так как весь код был набран в Блокноте .

Текущее время: 18 май 2022, 10:38

Персонаж проваливается

Персонаж проваливается

LemanRass 12 апр 2014, 23:35

Я решил создать своего персонажа, и написать ему свой скрипт ходьбы/камеры и всего остального.
Но персонаж просто летает в воздухе и проходит сквозь стены хоть я и поставил на него Character Controller.
Пробовал добавить rigidbody и Capsule Collider, после этого перс перестал проваливаться но взамен я получил жуткую тряску экрана при ходьбе + скольжение по тиррейну.

Изображение

Вот все что я навешал на перса:

Заранее спасибо за помощь.

beatlecore 13 апр 2014, 04:11

у риджидбади выкрутить на максимум drag и angularDrag (или в 0, точно не помню), поставить isKinematic галку, в скрипте двигать через rigidbody.MovePosition() и крутить через rigidbody.MoveRotation()

LemanRass 13 апр 2014, 09:47

А почему у стандартного First Person Controller'а нету rigidbody и он не проваливается?
Кстати, у элемента Character Controller при установке его на модель, модель окутывается в капсулу подобно Capsule Collider, я думал эта штука и должна со всем колизиться.

Simmilliar 13 апр 2014, 09:55

Character Controller имеет собственный Capsule Collider и способы передвижения.
Скинь скрипт движения. Может, ты его двигаешь через Transform. Тогда я не удивлюсь тому, что он решил в noclip поиграться.

LemanRass 13 апр 2014, 10:59

Да, я действительно двигал его через трансформ, а насчет своих способов передвижения это addForce?

if ( Input. anyKey || Input. anyKeyDown )
{
if ( ! Input. GetKey ( KeyCode. LeftShift ) )
{
if ( Input. GetKey ( KeyCode. W ) )
{
animation. CrossFade ( "walk" ) ;
transform . position += transform . forward * player_normal_speed * Time. deltaTime ;
}
if ( Input. GetKey ( KeyCode. S ) )
{
animation. CrossFade ( "walk" ) ;
transform . position -= transform . forward * player_normal_speed * Time. deltaTime ;
}
if ( Input. GetKey ( KeyCode. A ) )
{
animation. CrossFade ( "walk" ) ;
transform . position -= transform . right * player_normal_speed * Time. deltaTime ;
}
if ( Input. GetKey ( KeyCode. D ) )
{
animation. CrossFade ( "walk" ) ;
transform . position += transform . right * player_normal_speed * Time. deltaTime ;
}
}
else
{
if ( Input. GetKey ( KeyCode. W ) )
{
animation. CrossFade ( "run" ) ;
transform . position += transform . forward * player_fast_speed * Time. deltaTime ;
}
if ( Input. GetKey ( KeyCode. S ) )
{
animation. CrossFade ( "run" ) ;
transform . position -= transform . forward * player_fast_speed * Time. deltaTime ;
}
if ( Input. GetKey ( KeyCode. A ) )
{
animation. CrossFade ( "run" ) ;
transform . position -= transform . right * player_fast_speed * Time. deltaTime ;
}
if ( Input. GetKey ( KeyCode. D ) )
{
animation. CrossFade ( "run" ) ;
transform . position += transform . right * player_fast_speed * Time. deltaTime ;
}
}
}
else
animation. CrossFade ( "idle" ) ;
}

Simmilliar 13 апр 2014, 11:25

А двигать через AddForce - это означает: создать дофига неуправляемого персонажа.
Для таких целей есть velocity.
Ладно там трансформ, но почему все рвутся использовать адфорс?

Simmilliar 13 апр 2014, 11:34

Пример использования CharacterController:

public float speed = 6.0F ; //Скорость передвижения
public float jumpSpeed = 8.0F ; //Начальная скорость прыжка
public float gravity = 20.0F ; //Сила гравитации
private Vector3 moveDirection = Vector3. zero ; //Направление персонажа
void Update ( ) {
CharacterController controller = GetComponent < CharacterController >( ) ; //Берем наш CharacterController
if ( controller. isGrounded ) { //В нем есть переменная, которая дает знать, стоит ли он на земле. И если он стоит.
moveDirection = new Vector3 ( Input. GetAxis ( "Horizontal" ) , 0 , Input. GetAxis ( "Vertical" ) ) ; //Берем значения кнопок WASD или стрелочек и создаем вектор, указывающий в нужную сторону
moveDirection = transform . TransformDirection ( moveDirection ) ; //Переводим локальные координаты в соответствующие глобальные
moveDirection *= speed ; //moveDirection - это коэффициент скорости. Поэтому мы умножаем его на максимальную скорость, чтобы получить текущую
if ( Input. GetButton ( "Jump" ) ) //Если мы нажимаем пробел
moveDirection. y = jumpSpeed ; //Мы придаем скорости прыжка

}
moveDirection. y -= gravity * Time. deltaTime ; //Это действие гравитации
controller. Move ( moveDirection * Time. deltaTime ) ; //И получив все данные в конце-концов мы вызываем переменную Move и даем ей наш вектор направления. И она сама будет двигать нашего персонажа как надо. Без прохождений сквозь стены, без addForce и прочей ереси.
}

LemanRass 13 апр 2014, 12:43

Спасибо, помогло. Еще вопросик, а можно ли как-то сделать персонажа невидимым для себя. Что то вроде player_prefab.visible = false;
Или как в современных онлайн играх делают что бы если персонаж мой, то должна быть только модель рук, а если персонаж не мой (следовательно я вижу его со стороны) то он должен отображаться полностью.

Я делаю анимацию персонажу в Animator. Сделал, иду проверять, запускаю а персонаж падает под землю наполовину.
вот код:

Проваливается персонаж Unity
Начал делать игру от третьего лица по книге, и столкнулся такой проблемой: при запуске игрового.


Персонаж проваливается сквозь Edge Collider 2D
Всем доброго времени суток! Объясните почему главный герой после прыжка может провалиться сквозь.

Анимация уходит под землю
Анимация больше текстуры игрока и поэтому анимация на половину этой разницы уходит вниз. Как.

1isuz, зайди в юнити ассетс стор или другие платформы, где можно скачать готовые и норм анимации и проверь на персонаже, скорее всего ты что-то не так сделал, расположение костей во время анимации видимо другое

Я скачал готовые анимации, повесил на персонажа, работает только idle, и то он проваливается под землю. Исправил эту ошибку и теперь анимация run не работает, да и вообще больше анимации не работают. В t-pose ходят

скорее всего проблема в animator.SetFloat("speed", Vector3.ClampMagnitude(directionVector, 1).magnitude); с вектором
Animator

врядли нав меш проблема, поскольку ты видимо его не используешь !?
если юзаешь Nav Mesh тогда там нужно подогнать размеры персонажа и агента


Персонаж улетает даже когда кнопки не нажата (управление под Андроид)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class.

Выпадающее меню проваливается под другой блок
Здравствуйте. Имеется такая проблема. В шапке сайта есть выпадающее меню css, которое прижато к.

Выпадающее меню проваливается под текст\картинки\видео в IE
Ситуация, горизонтальное вы падающее меню в интернет эксплорере 6-8 заезжает под текст. Меню.

Панель задач "проваливается" под окна
У меня давняя проблема: Использую оригинальный msdn w7 и скрывающеюся панель задач. Но изредка.

Определить точку, в которой снаряд уйдет под землю
Траектория снаряда, вылетающего из орудия под углом \alpha с начальной скоростью V0 .

Макс Хохряков

На самом объекте есть коллайдер? Может он частично находится внутри коллайдера пола либо слишком высоко и падает очень быстро?

DELETED

Вся проблема в меш коллайдере.Используй другие коллайдеры,Если меш то тебе нужно на каждый дочерний объект добавлять меш коллайдер.

Большаков Валерий


Большаков Валерий

вот почему то когда нажимаю convex в mesh collider то предмет не проваливается сквозь пол,а просто сталкивается.

Григорий Жохов

Валерий, это из за меш коллайдера, попробуй на объект который падает наложить один из стандартных (лучше капсулу)

Максим Бурков

Все проще, используй меш коллайдер, но и в самом меш коллайдере ставь галку на convex. Если все норм, то твоя модель будет обведена зелеными полосами, это и будет новый коллайдер.
НО. Если у тебя уровень в помещении, например подвал или дом, то на само помещение не ставь конвекс, просто меш коллайдер, а физическому объекту добавляй галку на конвекс.

Дмитрий Берестнев

МЭШ колайдэр потому что фигня . он не подходит для объектов сложных форм . разбей объект на мнение детальные части и каждой добавь любой обычный колайдэр имеющий форму круга . квадрата . капсулы и т д

Все перепробовала. Игрок проваливается вне зависимости от того, какой GameObject (куб и т. Д.) Я помещаю под него. Он имеет кольцевое колье и твердое тело.

Как я могу предотвратить падение предмета через пол

Я должен упомянуть, что игрок должен умереть, когда он вступит в контакт с чем-либо, поэтому я не знаю, как к этому подойти.


Не только на пол, но и на другой объект. Кроме того, на обоих должен быть отключен isTrigger. Если это то, что вы сделали, опубликуйте снимок экрана с GameObject Inspector.

Если я отключу isTrigger для своего плеера, он не сможет пройти через другие объекты, которые мне нужны.

Если объект проваливается сквозь пол, проверьте следующее.

1 . Коллайдер прикреплен к этому объекту? Если нет, то прикрепите к этому объекту Collider или Collider2D.

2 . Включен ли isTrigger на каком-либо из коллайдеров объектов? Если да, отключите IsTrigger на обоих коллайдерах.

3 . Если к GameObject прикреплен Rigidbody, убедитесь, что игрок находится на 100% выше пола, прежде чем нажимать «Играть», иначе вы столкнетесь с еще большими проблемами.

4 . Размер GameObject может быть небольшим. Действительно маленький. Существует ограничение на размер объекта, прежде чем он может столкнуться с другим объектом. Попробуйте изменить размер объекта, а затем переместите камеру назад.

If I disable isTrigger for my player then it won't be able to go through the other objects which I need it, to go through.

Это вообще не проблема. Вы можете использовать слои, чтобы указать Unity, какие коллайдеры могут коллайдировать друг с другом. Просто отключите isTrigger, затем используйте:

Для 2D :

Для 3D :

Это позволит игроку не проходить сквозь пол, а проходить через любые другие объекты, какие захотите. Вы также можете сделать это в настройках редактора . Edit -> Project Settings -> Physics -> или Edit -> Project Settings -> Physics 2D.

the player is supposed to die once it comes in contact with anything, so I don't know how to approach this

Это не связано с проблемой, но OnCollisionEnter2D используется для обнаружения коллизии. Вы можете позвонить Destroy игроку.

РЕДАКТИРОВАТЬ:

Если вам также нужно определить, когда игрок касается других коллайдеров, но вы не хотите, чтобы они фактически коллайдеры, вы можете сделать то, что я описал выше, а затем добавить в player дочерние объекты с коллайдерами. Эти дочерние объекты будут isTrigger включены . Затем вы можете использовать эту OnTriggerEnter функцию для обнаружения столкновения между теми объектами, которые не являются полом.

Читайте также: