Разработката на игри е много забавна! Но колко пъти сте сядали с прекрасна идея в ума си, която никога не е виждала бял свят, защото първоначалната фаза на изграждане на движението на героя може да бъде… най-малкото трудност. Създаването на едни и същи скриптове отново и отново, всеки път, когато претърсвате StackExchange в опит да си спомните начина, по който да го направите, не е забавно. И още по-лошо — постигането на Game Feelотнема абсурдно много време, когато това, което правите, е да настройвате числа, компилирате скриптове, изпълнявате играта, настройвате числа, компилирате скриптове, изпълнявате...

Намерих решение, което работи достатъчно добре за мен, не съм го виждал никъде другаде — затова исках да го споделя с вас тук!

TLDR;

Ще използваме анимационни криви, за да редактираме усещането на скока чрез динамична промяна на гравитацията. Скоковете често се чувстват плаващи, защото по подразбиране действат твърде много като физика в реалния свят.

Въпреки че няма да споделям целия код тук (не мисля, че точната ми реализация е достатъчно красива!), искам да ви дам общата идея във формат за преглед. Накратко, ако искате да приложите това, искате да направите следното:

  • Създайте Scriptable Object, съдържащ информация за конкретен скок
  • Попълнете го с една или повечеАнимационни криви, които моделират гравитацията по време на скока.
  • Използвайте .Evalute(Time.time - timeAtJumpStart) върху тези криви на анимация, за да извлечете стойността на гравитацията за текущото време в скока.

Това е нещо като всичко. Прочетете, за да разгледате по-задълбочено как направих имплементацията, или се чувствайте свободни да вземете тези идеи и да работите с тях сами!

Разбиране на добър скок

Нашата цел е да създадем начин за бързо генериране на невероятноУсещане за игра за всички ваши следващи игри. За да направим това, трябва да внедрим скриптовете, но също така трябва да знаем какво прави един добър скок. В интеруебовете има доста информация, която навлиза в подробности с това, но тук ще ви представя примера от учебника.

Може би знаете за малка игра, наречена Super Mario Bros. Тази игра е невероятна по много причини и ако не сте гледали това видео от Extra Credits за дизайн на ниво, абсолютно трябва! (Но това е извън смисъла)…

Преместване на. В Super Mario Bros, ако задържите бутона за скок, Марио скача по-високо, което бихме могли да дублирамепроменлива височина на скок. Това е страхотно, защото увеличава контрола на играча върху героя му, като същевременно кара контролите да се чувстват отзивчиви. Освен това Марио прекарва 2/3 от скока си нагоре. В пика на неговия скок гравитацията изглежда се утроява, изпращайки го рязко надолу. Това кара героя да се чувства бърз. King of the Hatе друга страхотна игра, която се отклонява от начина, по който работи гравитацията в реалния свят, като умишлено прави някои от героите плаващи. Освен това може да искате да позволите на играча да скочи, дори ако той не е на земята — но ще бъде следващият кадър, тъй като в противен случай играта може да се почувства така, сякаш липсва входове. И накраяcoyote timeсе отнася до факта, че на играча се дава допълнителна свобода на действие при приземяване или извършване на скокове, напр. скачане дори след като играчът е напуснал платформа. Някои игри може дори да стигнат дотам, че да забавят скока на играч, ако е скочил рано. Каквото и да правите, просто помнете: вие сте там, за да дадете на играча възможно най-доброто изживяване, а не да моделирате точно физиката!

Това, което бих предложил, ако искате добра отправна точка, е да моделирате скока си така, че героят да виси в безтегловност за продължителен период от време, преди бързо да се върне обратно на земята.

Прилагането

За да моделирам нещата, които току-що обсъдихме, реших да имам две гравитационни криви — една, когато играчът се движи нагоре, и една, когато играчът пада надолу. За да моделирам променливата височина на скока, просто задавам гравитацията на определено число, ако играчът пусне бутона за скок (Друга идея е да използвам това число като множител и да мащабирам кривата на гравитацията нагоре в съответствие с това). И накрая, имаме нужда от първоначалната сила, с която играчът е изпратен нагоре.

Поставих тези параметри в Scriptable Object. Това позволява информацията да се споделя лесно между обекти в сцената, различни проекти (тъй като те са просто активи) и бързо да се изпробват различни предварително зададени настройки за скокове върху героите.

В скрипта за скок можете да го посочите по следния начин:

[SerializeField] JumpType jumpObject и след това достъп до него така: playerVelocity.y -= jumpObject.gravityRise.Evaluate(Time.time - timestamp);

Трябва да проверите три случая:

  • Ако играчът се движи нагоре, т.е. има скорост › 0, и задържа бутона за скок — оценете по кривата на gravityRise.
  • Ако играчът е пуснал бутона за скок и се движи нагоре — използвайте гравитацията при освобождаване.
  • Ако играчът пада, т.е. има скорост ‹ 0 — оценете по кривата на gravityFall.

Сега правете тези изчисления само когато играчът не е на земята. Компонентът Character Controller има удобен атрибут: .isGrounded.

Някои последни бележки...

Вместо да изпълнявам всички тези изчисления в главния контролер за играча, имам публична функция в скрипта за скок, която връща скоростта като вектор и функции за иницииране и освобождаване на скока. След това в главния контролер за плейъра правя следното:

Правя това, защото може да имам герои, които не се контролират от играча, използвайки същата функция за скок. Да приемем, че имате AI скрипт за враг. След това можете лесно да изпращате сигнали към скрипта за скок на врага по този начин.

Последно. Физическите неща отиват във FixedUpdate(). Всичко останало в Update(). Това означава, че трябва да проверявате за въвеждане от потребителя в Update(), след което да използвате флагове / булеви стойности, за да проверите дали трябва да направите нещо в секцията FixedUpdate()!

Надявам се, че това може да представлява интерес за вас. наздраве!