Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
26 / 26 / 15
Регистрация: 17.02.2014
Сообщений: 310

Прыжок 2Д

16.07.2015, 15:50. Показов 5863. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я написал такой скрипт для прыжка суть его такова когда срабатывает функция OnCollisionStay2D значит игровой персонаж на земле и ему можно прыгать а когда функция не срабатывает значит персонаж уже прыгну и ему нельзя прыгнуть снова пока он не на земле.
JavaScript
1
2
3
4
5
6
7
function OnCollisionStay2D (col : Collision2D) 
{
    if (Input.GetKey(KeyCode.Space))
    {
        gameObject.transform.position.y+=2;
    }
}
Проблема возникает когда персонаж дотрагивается до боковых граней другого спрайта например персонаж подпригнул и коснулся боковой грани спрайта и он делает снова прыжок так как функция OnCollisionStay2D срабатывает как этого избежать ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.07.2015, 15:50
Ответы с готовыми решениями:

Прыжок
Сделал прыжок, но проблема в том что когда платформа крутиться, ГГ может прыгнуть как пробка вылетающая из бутылки - таким образом пролетая...

Прыжок AddForce
Здравствуйте. Есть дорога, по которой бежит персонаж и кнопка прыгать. Движение персонажа: dvizhenie = new Vector3...

Прыжок в 2d платформере
Помогите пожалуйста, реализовал движения спрайта по поверхности влево и вправо, а вот с прыжком проблема, я так понимаю не правильно...

12
103 / 90 / 19
Регистрация: 15.04.2015
Сообщений: 353
16.07.2015, 16:27
Проверять координаты соприкосновения, и сравнивать их с координатами центра персонажа. Если точка соприкосновения однозначно ниже, значит, это земля.
1
 Аватар для Горбаг
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 834
16.07.2015, 16:57
Можно попробовать ввести булевый флаг isOnGround и проверять его при нажатии на пробел.

C++
1
2
3
4
5
6
7
8
9
10
bool isOnGroung=true; //псевдокод
 
function OnCollisionStay2D (col : Collision2D) 
{
    if (Input.GetKey(KeyCode.Space))&&(isOnGround))
    {
        isOnGroung=false; //Это не позволит при повторном нажатии в полете при соприкосновении со стеной сделать второй прыжок, т.к. флаг уже переключен
        gameObject.transform.position.y+=2;
    }
}
Ну и дописать функцию на проверку приземления, переключая флаг обратно.
1
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
16.07.2015, 17:04
Цитата Сообщение от Горбаг Посмотреть сообщение
Можно попробовать ввести булевый флаг isOnGround и проверять его при нажатии на пробел.
а еще лучше примерно вот так (из 3D случая, ландшафт по карте высот):
C++
1
2
3
4
5
6
7
8
9
    
               if (FPosition.z <= MapHeight) {
            FPosition.z = MapHeight;
            Acceleration.z = 0;
            Velocity.z = Move.y*10; // при зажатй клавише прыжка Move.x==1
        }
        else {
            Acceleration.z = -Gravity;
        }
0
103 / 90 / 19
Регистрация: 15.04.2015
Сообщений: 353
16.07.2015, 17:33
Цитата Сообщение от Горбаг Посмотреть сообщение
Можно попробовать ввести булевый флаг isOnGround и проверять его при нажатии на пробел.
Вопрос был, скорее, в том, как автору, собсно, выбирать значение для isOnGround. Сейчас он, считай, проверяет его в OnCollisionStay, который работает и при соприкосновении со стеной.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
16.07.2015, 17:57
Цитата Сообщение от lentinant Посмотреть сообщение
Вопрос был, скорее, в том, как автору, собсно, выбирать значение для isOnGround. Сейчас он, считай, проверяет его в OnCollisionStay, который работает и при соприкосновении со стеной.
Ну дык проверять коллизию только с полом. Если она есть только тогда учитывать нажатие кнопки прыжка.

Добавлено через 1 минуту
т.е. при использовании карты высот примерно вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        float MapHeight = Game->Map->GetObjectHeight(FPosition.x, FPosition.y);
        if (MapHeight >= OldPosition.z + MaxStepHeight) {
            FPosition.x = OldPosition.x;
            FPosition.y = OldPosition.y;
            Velocity.x = 0;
            Velocity.y = 0;
            Acceleration.x = 0;
            Acceleration.y = 0;
            MapHeight = OldMapHeight;
        }
        if (FPosition.z <= MapHeight) {
            FPosition.z = MapHeight;
            Acceleration.z = 0;
            Velocity.z = Move.y*10;
        }
        else {
            Acceleration.z = -Gravity;
        }
Как видим проверка коллизий со стенами и полом разделена и все тип-топ
0
103 / 90 / 19
Регистрация: 15.04.2015
Сообщений: 353
16.07.2015, 18:11
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
т.е. при использовании карты высот примерно вот так:
Очень сомневаюсь, что ваш код сильно поможет новичку разработки на Unity
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
16.07.2015, 18:16
Цитата Сообщение от lentinant Посмотреть сообщение
Очень сомневаюсь, что ваш код сильно поможет новичку разработки на Unity
Ему больше алгоритм чем код нужен. Тут пример алгоритма. Правда больше ориентирован на новичка разработки чего-то подобного Unity а не "на Unity" (код из нутрей самодельного движка). Как понимаю те же данные - где и как произошло пересечение можно вытащить из передаваемой в обработчик col : Collision2D и точно так же обработать.
1
103 / 90 / 19
Регистрация: 15.04.2015
Сообщений: 353
16.07.2015, 18:25
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
где и как произошло пересечение можно вытащить из передаваемой в обработчик col : Collision2D и точно так же обработать
Я это первым своим комментом тут и указал.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
16.07.2015, 18:28
Цитата Сообщение от lentinant Посмотреть сообщение
Я это первым своим комментом тут и указал.
Ну а я добавил как примерно обрабатывать
0
26 / 26 / 15
Регистрация: 17.02.2014
Сообщений: 310
17.07.2015, 15:56  [ТС]
Всем спасибо за помощь
Вот такой я составил код
JavaScript
1
2
3
4
5
6
7
8
9
function OnCollisionStay2D (col : Collision2D) 
{
    var Cplayer = gameObject.transform.localScale.y/2-gameObject.transform.position.y;//размер персонажа делится на два (чтобы узнать середину) и добавляется к его позиции
    var Ctexture = col.transform.localScale.y/2+col.transform.position.y;//размер спрайта делится на два (чтобы узнать середину) и добавляется к его позиции
    if (Input.GetKey(KeyCode.Space) && Cplayer > Ctexture)//Если нажать Space и персонаж выше спрайты
    {
        gameObject.transform.position.y+=2;//прыжок
    }
}
Добавлено через 20 часов 18 минут
Я еще немного модифицировал свой код так как коллайдеры не всегда такие же как и размер спрайта, но и он работает не в совершенстве, когда стоять между двумя спрайтами одновременно прыжок удваивается (+3,5 на +7 (3,5+3,5)) как этого избежать ?
JavaScript
1
2
3
4
5
6
7
8
9
10
function OnCollisionStay2D (col : Collision2D) 
{
    var Cplayer = gameObject.transform.position.y - gameObject.GetComponent.<BoxCollider2D>().size.y/2;
    var Ctexture = col.transform.position.y + col.collider.GetComponent.<Collider2D>().GetComponent.<BoxCollider2D>().size.y/2;
 
    if (Input.GetKeyDown(KeyCode.Space) && Cplayer > Ctexture)//Если нажать Space и персонаж выше спрайты
    {
        gameObject.transform.position.y+=3.5;//прыжок
    }
}
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.07.2015, 19:02
Цитата Сообщение от user-men Посмотреть сообщение
как этого избежать
OnCollisionStay2D как понимаю вызывается последовательно для каждого объекта для которого обнаружена коллизия. Заведи внешний флаг что он уже прыгнул (т.е. взводи флаг при прыжке), и при поднятом флаге тоже не прыгай. А в начале каждого цикла просчета коллизий обнуляй флаг.
1
26 / 26 / 15
Регистрация: 17.02.2014
Сообщений: 310
17.07.2015, 21:05  [ТС]
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var Prizhok = true;
 
function OnCollisionStay2D (col : Collision2D) 
{
    var Cplayer = gameObject.transform.position.y - gameObject.GetComponent.<BoxCollider2D>().size.y/2;
    var Ctexture = col.transform.position.y + col.collider.GetComponent.<Collider2D>().GetComponent.<BoxCollider2D>().size.y/2;
 
    if (Input.GetKey(KeyCode.Space) && Cplayer > Ctexture && Prizhok)//Если нажать Space и персонаж выше спрайты
    {
        Prizhok=false;
        gameObject.transform.position.y+=3.5;//прыжок
    }
    else
        Prizhok = true;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.07.2015, 21:05
Помогаю со студенческими работами здесь

Прыжок персонажа
Есть два спрайта персонаж и платформа и есть код прыжка на кнопке пробел: if (Input.GetKeyDown (KeyCode.Space)) { ...

Прыжок на андроиде
Помогите с кодом для прыжка в CharacterControll, чтобы прыгнуть можно было всего один раз, до приземления. Сенсорные кнопки делаю через UI...

Прыжок в unity2D
Пробую создать простенькую 2D игру, не получается реализовать прыжки, вернее один прыжок. При нажатии нескольких раз пробела персонаж...

Прыжок и стрельба в юнити
всем юнитичанам привет! прошу вас помочь в юнити! как сделать прыжок и стрельбу, я знаю что для этого нужно скриптинг, я не знаю что...

Не могу сделать прыжок
Есть код на прыжок но не могу понять почему он не прыгает(он прыгает как бы, он поднимается в воздух но обратно не возвращается на землю,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru