Как сделать прыжок от стены в unity 2d

Обновлено: 14.05.2024

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Slim : MonoBehaviour

public float speed;
public float jumpForce;
private float moveInput;

private Rigidbody2D rb;

private bool facingRight = true;

public bool isGrounded;
public Transform groundCheck;
public float checkRadius;
public LayerMask whatIsGround;

private int extraJumps;
public int extraJumpsValue;

private void Start()
extraJumps = extraJumpsValue;
rb = GetComponent();
>

private void FixedUpdate()
isGrounded = Physics2D.OverlapCircle(groundCheck.position, checkRadius, whatIsGround);

moveInput = Input.GetAxis("Horizontal");
rb.velocity = new Vector2(moveInput * speed, rb.velocity.y);

void Flip()
facingRight = !facingRight;
Vector3 Scaler = transform.localScale;
Scaler.x *= -1;
transform.localScale = Scaler;
>

public void Update()
if (isGrounded == true)
extraJumps = extraJumpsValue;
>

if (Input.GetKeyDown(KeyCode.Space) && extraJumps > 0)
rb.velocity = Vector2.up * jumpForce;
extraJumps--;
>
else if (Input.GetKeyDown (KeyCode.Space) && extraJumps == 0 && isGrounded == true)
rb.velocity = Vector2.up * jumpForce;
>
>
void OnCollisionEnter2D(Collision2D co)
// Collided with a V?
if (co.collider.name == "V")
// Reset Rotation, Gravity, Velocity and go to last Checkpoint
transform.rotation = Quaternion.identity;
rb.gravityScale = Mathf.Abs(rb.gravityScale);
rb.velocity = Vector2.zero;
>
>

ArtM@n, проверяй стену в направлении движения персонажа и при повторном нажатии прыжка если стена есть то отталкивай его в направлении от стены. Можно попробовать Vector.Mirror или взять нормаль столкновения, но проще просто задать силу в нужном направлении для получения всегда одинакового результата.

ArtM@n, немного векторной математики(хотя у Unity уже ваша проблема решена с векторами см. цитату). Рейкастим(Physics.Raycast) по направлению персонажа луч короткий, получаем точку столкновения(если получаем). Если получили. смотрим инфу о столкновении(RaycastHit), если это стенка - получаем нормаль, по нормали и направлению перса получаем отражающий вектор по этому вектору добавляем скорость игроку, например через стандартный RigidBody, всё. Замечу что если у персонажа скорость только горизонтальная, он и будет отталкиваться только по горизонтали Поэтому, как писалось выше, и как делалось во многих играх - отталкивание всегда по фиксированному вектору происходит, повернутому от стены. Поворачивать точки в 3д пространстве можно очень просто при помощи матриц поворота. Однако, можно и без них обойтись, сделав всё проще в разы



Зелёный - это игрок

Всем привет. Продолжаем серию уроков по созданию 2D персонажа. В предыдущих двух частях мы сделали персонажа, который может находиться в двух состояниях: покой и бег вправо-влево. Возможно, для очень простой игры этого будет достаточно. Но мы не будем останавливаться на достигнутом и сегодня научим нашего персонажа прыгать.

Наша цель звучит просто, но в ее реализации будут некоторые тонкости. Во-первых, нам надо как-то определить, что персонаж находится в состоянии прыжка. Это будет немного сложнее, чем определение состояния бега. Во-вторых, нужно прикрутить соответствующую анимацию. Здесь мы могли бы поступить аналогично анимациям покоя и бега — циклично воспроизводить соответствующие кадры анимации, пока персонаж находится в состоянии прыжка. Но мы реализуем более гибкий вариант. Состояние прыжка на самом деле состоит из двух состояний: взлет и свободное падение. Кроме того, бывают частные случаи — только взлет и только падение. Если мы прикрутим одну общую анимацию для этих двух состояний (например, поджатые ноги и развевающийся на ветру плащ) — это может выглядеть нормально, но не совсем реалистично. В реальности, когда человек прыгает, положение его тела, рук, ног отличается при взлете и при падении. Мы создадим такую анимацию, которая будет учитывать скорость взлета/падения и в зависимости от нее переключать соответствующий кадр анимации.

Загрузим наш проект и сцену. В папке AssetsSprites у нас остался последний неиспользованный спрайт Jump. Проделаем с ним уже знакомую операцию по нарезке спрайта на коллекцию изображений. Затем в окне Hierarchy выберем Character и перейдем в окно Animation. Для прыжка нам понадобиться несколько файлов анимаций, а точнее — семь. Это равно числу кадров в спрайте Jump. Давайте создадим эти анимации, называя их Jump1, Jump2 и т.д.


Теперь добавим в каждую анимацию по одному изображению из спрайта Jump, по порядку: спрайт Jump_0 в анимацию Jump1, спрайт Jump_1 в анимацию Jump2


В окне Animator (не Animation!) у нас автоматически создались элементы для новых анимаций, но они нам теперь не понадобятся. Выделим их и удалим клавишей Delete (анимации также удалятся из соответствующего списка в окне Animation, но чуть позже мы их вернем). Создадим в Animator'е два новых параметра: Ground с типом Bool и vSpeed с типом Float. Первый будет обозначать, находится ли персонаж на земле или в прыжке, а второй будет хранить текущее значение скорости персонажа по оси Y, то есть скорость взлета/падения. В зависимости от нее мы будем применять соответствующую анимацию из наших семи анимаций прыжка.


Теперь кликнем правой кнопкой по любому свободному месту в окне Animator и выберем Create StateFrom New Blend Tree. В окне Inspector переименуем созданный элемент как Jump.


Создадим два перехода между анимациями: Any State -> Jump и Jump -> Idle. То есть, из любого состояния мы можем перейти в состояние прыжка, а из состояния прыжка перейти в состояние покоя. Напоминаю, как делаются переходы: клик правой кнопкой по первой анимации, Make Transition, клик левой кнопкой по второй анимации. Для первого перехода зададим условие Groundfalse, для второго Groundtrue.


Теперь кликнем дважды по Jump. Откроется элемент Blend Tree. В него мы добавим наши семь анимаций прыжка, а переключение между ними будут происходить в зависимости от значения параметра vSpeed. По умолчанию в Blend Tree сейчас установлен параметр Speed — поменяем его на vSpeed в окне Inspector.


В этом же окне нажмем на плюсик и выберем Add Motion Field. Это нужно проделать семь раз. Создадутся семь полей для наших семи анимаций. Снимем флаг Automate Thresholds, чтобы можно было вручную устанавливать значения параметра vSpeed, при достижении которых будет производиться смена анимации в Blend Tree. Перетащим в каждое поле по анимации и зададим значения vSpeed. Вот что должно получиться (кстати, после этих действий удаленные из списка в окне Animation анимации Jump1-Jump6 вновь появятся):


С анимацией пока закончим. Теперь нам надо научится определять, когда персонаж находится на земле, а когда — в воздухе, то есть в прыжке. Перейдем в окно Scene. Создадим пустой игровой объект, назовем его GroundCheck. Выделяем его в окне Hierarchy и перетаскиваем мышью на Character (все в том же окне Hierarchy!). Теперь объект GroundCheck будет дочерним по отношению к Character и будет перемещаться вместе с ним, а объект Character приобретет соответствующую стрелку, скрывающую дочерние объекты. Кликнем по стрелке и вновь выберем объект GroundCheck. Назначим ему иконку, чтобы видеть объект на сцене. На скриншоте я указал, как это сделать:


В окне Scene переместим GroundCheck в ноги персонажа. Тем самым, мы сделали объект, который будет использован для определения нахождения персонажа на земле.


Теперь нам надо определить, а что же является землей? Очевидно, это наша платформа, но игра об этом пока не знает. Кстати, давайте создадим копию платформы для тестирования прыжка (лучшим способ будет создание префаба на основе платформы, но сейчас давайте просто выделим Platform и нажмем Ctrl+D). Разместим вторую платформу правее и выше первой.


Выделим любую из платформ и обратим внимание на верхнюю часть окна Inspector. Там есть поле Layer со значение Default. Оно обозначает принадлежность объекта к тому или иному слою. Кликнем на Default, выберем Add Layer, зададим в поле User Layer 8 имя Ground. Снова выделим платформу, и вместо слоя Default установим слой Ground. Для второй платформы тоже установим слой Ground.


Таким образом мы определили, что наши платформы будут землей. Объект GroundCheck будет проверяться на предмет пересечения с объектами слоя Ground, т.е. с нашими платформами. Если будет обнаружено пересечение — персонаж находится на земле. Делаться это будет в скрипте CharacterControlleScript, созданном в предыдущей части. Давайте откроем его на редактирование.


А в начало метода FixedUpdate следующие строки:


Теперь добавим в скрипт метод Update, в котором будем обрабатывать нажатие клавиши прыжка. Мы будем делать это в методе Update для большей точности управления — этот метод вызывается каждый фрейм игры, в отличии от FixedUpdate, который вызывается через одинаковое определенное время и обычно, при хорошем FPS, вызовы происходят реже вызовов Update.


Итого, полностью скрипт будет выглядеть так:

Сохраняем скрипт, возвращаемся в Unity. В Hierarchy выделяем Character. Перетаскиваем объект GroundCheck в поле Ground Check скрипта CharacterControllerScript, а в поле What Is Ground устанавливаем Ground.


Итак, в нашем скрипте, в методе FixedUpdate проверяется пересечение объекта GroundCheck с объектами, принадлежащими слою Ground. Это достигается при помощи метода Physics2D.OverlapCircle. В аргументах этого метода также задан радиус определения пересечения. Затем, в переменную аниматора Ground устанавливается результат определения нахождения на земле, а в переменную vSpeed — текущая скорость персонажа по оси Y. В зависимости от этой скорости применяется та или иная анимация прыжка из семи анимаций в Blend Tree. Сам прыжок задается в методе Update при нажатии на пробел, путем придания вертикальной силы компоненту Rigidbody2D.
Прежде чем запускать игру давайте немного изменим значение гравитации, а то скорость прыжков получится медленной, как на Луне. Заходим в меню EditProject SettingsPhysics 2D. В окне Inspector устанавливаем значение Gravity Y = -30. Запускаем игру! Если все сделано правильно, увидим примерно следующее:

Капитан Коготь умеет бегать и прыгать. При прыжке, в зависимости от состояния (взлет/падение) и от скорости применяется соответствующая анимация. На видео хорошо заметно, что при прыжке в окне Animator происходят переключения между анимациями в элементе Blend Tree. При этом, если персонаж просто падает с платформы (т.е. в прыжке нету фазы взлета, пробел не нажимался) — работают только те анимации, для переключения которых заданы отрицательные значения скорости, что делает поведение персонажа более реалистичным. Конечно, для лучшего эффекта необходимо больше анимаций и более тонкая настройка значений скорости.

Что ж, на этом все. Основа для 2D персонажа создана. Какие к ней прикрутить дополнительные возможности — зависит уже от конкретной игры. Спасибо за внимание!

In this tutorial we will build a basic project where you can have a unity 2d platformer where you can do normal jumps and wall jumps. We will setup some basic platforms and a player in typical prototype mode, which you can use to add your own graphics to later on to create your platformer. Here is what you should have at the end of this tutorial. We will also use cinemachine to allow for a camera follow of our player. Setup physics correctly so that we have a more cartoony type physics. We also will do some ray casting debugging to make sure we can see how our raycasts are detecting collisions.

Setting up our 2d platformer scene

We will need a few things to setup our scene. We firstly need to add some folders to our project. You can do that by right clicking in the folder panel and then create the following folder structure for your project.

Replicate these folders.


Great so next we want to setup some basic shapes and their properties. First we want to create a square for our player. To do that we go to our sprites folder. We will also be creating some squares for our platforms. Start off with a square. By following the following steps.

Let’s now bring our player into our scene by dragging our player sprite into our scene. Zero out the transform. Like this.


We want to add a few things now to our player so that we can detect some collisions and control our player. For that we need to add a RigidBody2D and a BoxCollider2D. To do that click on add component and add the RigidBody2D and add the BoxCollider2D. We want to set some settings on our Rigidbody so that we can have some realistic cartoony physics. See below how mine is setup then I will just highlight what was changed.


I have set my Player mass to 0.1 and removed all angular and linear drag. I then made the gravity scale to 4 so that our player can fall quite quickly. Also take note that the constraints are freezing rotation on the z-axis so that our player does not fall over. For our box collider we just keep it standard. Our collider should have already been setup to fit our square player so we can now move on. Next we want to create 2 more squares. One we will resize vertically to make a wall and the second we will scale horizontally to form a platform. So you should have some thing like this.


Make sure to add a boxcollider2d for both of these types of squares.


You can also change the color of your squares by going to the sprite renderer for your wall or platform. You can click on the color to change your color.


We now just need to tag our walls and platforms so that we can detect them. To do this add tags and assign them.

We now have everything in our scene which we need to get started on our script for moving our player.

Creating our unity 2d plaformer player movement controller script

In order to make our player move we need to do a few things, we need to add some raycasts which will let us know when our player is standing on the floor or is against the wall.

Then we can determine whether the player can jump or not. If they are in the air we can’t allow them to jump again, unless ofcourse if you are building a flappy bird clone. In which case you might want your player to be able to move up and fall down. So one of the first things we want to do is get a reference to our player’s rigidbody. Then we want to get the collider so we can get the bounds of our player then we can setup some raycasts to do some detection. We also want to create some states in our script for what our player may or may not do. Let’s just jump in to the code then I will explain it after wards.

Platformer code

First we declare a few raycasthit2d variables. We want to know if our player is on the floor is touching the right or left side of a wall or they are hitting the bottom of a platform. For this we start off by declaring raycasthits for bottom, top, right and left.

We want to declare a speed variable and jumpHeight so we can use this to move our player left and right at a certain speed and also define how high our player can jump. Then we declare a allowedToJump variable, so when it’s set to false our player will not be able to jump. We also have a touchingWall variable to allow us to check our player is against the wall.

In our start method we get our rigidbody component and we get our bounds with our collider. We add a .1f to it so that we have a position where our ray can start, we need it to start outside of our player’s collider so it cannot collide with our collider otherwise we might get false detections.

Next we add a GetInput method which as you may have guessed will take our input. We will use the getaxisraw function on the horizontal axis to get our direction. We will just check if our direction is 0 we will basically apply no velocity. Once we have a direction we will apply the x velocity and the y velocity will remain as the rigidbody velocity on the y axis. For our jump we check if we allowed to jump and whether the spacebar key has been pressed. If this is allowed we apply the x velocity from our rigidbody and we use our jumpHeight for our y velocity.

In our update method we will call our getinput method so that we can get our input. The next thing we do is setup some raycasts. We want to make sure our raycasts cast from outside our player collider about 0.2f to the right for our right detection, 0.2f to the left, 0.2f above our player and 0.2f below our player.

We then check if our raycast hits any of the colliders from the platforms or walls and handle them appropriately. For our wall jump we need to re enable allow jump if we not on the floor and against the wall. Great so that’s how the code works. If you would like to get hold of the source code you can download it here.

Adding a player follow camera

For this we need to head over to our asset store and the cinemachine asset to our project. If you haven’t downloaded it yet you will get a download button otherwise you will just get a import button. Here is what it should look like.

unity 2d platformer importing cinemachine

Once you have imported you should now have a option at the top of the menu bar called cinemachine. We want to add a 2d camera like so.

unity 2d platformer creating follow camera

From here it’s really easy to setup. You just need to click on the cinemachine camera in your hierarchy.

unity 2d platformer player cinemachine camera follow

Then simply drag your player into the camera under the follow slot.

Set the camera distance to 15 or something that makes sense for your game and walla that is the end of this tutorial. You can now make this more fun by adding some particle effects and doing some polish. If you want to check out some other unity 2d tutorials, here is one I did on 2d top down player movement controllers in unity 2d. I also have a course on making a unity3d city builder or rts game.

How to make a unity 2d platformer?

In order to make a unity 2d platformer. You will need some basic graphics for a player, some platforms and some item pickups. For a prototype you can use normal objects like squares, rectangles and circles to build out your unity 2d platformer. You will need a way to control a rigidbody2d which you will add to your platformer player. Some collision detection on your platforms as well as triggers for your item pickups. You can also use some free sound generators like sfxr to make sounds for your 2d platformer game. Then use inkscape to create some images for your game UI and main menu. You can use unity 2d post processing pipeline to help you spruice up the atmosphere of your game. Use cinemachine to introduce camera shake for feedback to the player of your platformer game.

How do I create a unity 2d platformer character controller?

In order to achieve this you will need to build a custom script. Which can handle jump, double jump, allow for fall off from platforms, wall jump, grappling if your game needs it and moving left and right. Your controller must also be able to switch between various animation states.

You Might Also Like

Unity drag and drop tutorial 2d

Godot 2D top down movement tutorial

Я вернулся к вам спустя долгое отсутствие, зато статья будет целиковой, поэтому никаких продолжений по этой новой теме не будет. Как и движение, прыжок одно из основных игровых механик, что может делать игрок. А так как это вид сбоку, то его нельзя пропускать. Именно поэтому я сегодня расскажу, что нужно знать для того, чтобы ваш персонаж начал прыгать, много прыгать. Также будет немало мелких дополнений по самому Unity, а не по коду. Хоть какое разнообразие появиться, да? Что-ж, давайте не будем затягивать вступление и наконец начнем!

Перво-наперво мы сделаем так, чтобы наш герой начал перемещаться по оси y. Чтобы это сделать мы будет использовать знакомые нам функции Rigidbody2D.velocity и Input.GetKey().

Рис 1. Movement on y-axis

Как видно, ничего нового я не добавлял, а уже появились зачатки прыжка, но нам также нужны некоторые исправления в rigidbody2D нашего персонажа в Unity. Нам нужен тип «динамика», значение гравитации на ту, которая нужна и выслеживание колизии «непрерывный», чтобы он останавливался сразу, после падения на твердую поверхность. Вот мои настройки:

Прыжки игрока на Unity в 2D, изображение №2

Для начала это будет вполне достаточно, поэтому теперь посмотрим, что у нас получилось.

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

Для начала я расскажу о понятиях, чтобы вы вошли сразу в суть кода. Вот, собственно, и они: [SerializeField], Transform и LayerMask.

[SerializeField] — заставить сериализовать частное поле. Когда Unity серилизует ваши скрипты, он сериализует только общедоступные поля. Если вы также хотите, чтобы Unity сериализовала ваши частные поля, вы можете добавить к этим полям атрибут SerializeField.

Для нашей дальнейшей игры нам понадобится своя маска, я ее назвал Ground и поместил в поверхности. Так это выглядит в программе:

Прыжки игрока на Unity в 2D, изображение №3

А также немного о том, зачем же нам Transform. Мы создаем в Unity пустой объект, которому будем давать некоторые свойства. Мы его помещаем снизу и прикрепляем его к нашему игроку.

Прыжки игрока на Unity в 2D, изображение №4

А самая первая функция нам позволит изменять значения уже в самом Unity, что упростит эксперементы, например, со скростью бега или прыжка.

Теперь мы поработаем с самой главной функцией, которая заствит все это работать вместе. В этом нам поможет Physics2D.OverlapBox().

Physics2D.OverlapBox() — коллайдер, перекрывающий поле. Проверяет, попадает ли коллайдер в область прямоугольника. В ней есть такие параметры, как point — центр коробки; size — размер коробки; angle — угол коробки; layerMask — фильтр для проверки объектов только на определенных слоях; minDepth — только включает объекты с координатой z больше, чем это значение; maxDepth — только включает объекты с координатой z меньше этого значения.

Рис 2. Jumping off the ground

Все, что мы делаем на второй этапе — это работаем с нашей функцией. Даем ей начальную точку — наш персонаж. Размеры нашего коллайдера (не обращайте внимания на название переменной, я сначала пробовал работать с OverlapCircle, но понял, что мне эта функция не подойдет). Угол мы не меняем. И даем знать, что наш пустой объект реагировал только на маску Ground. И в итоге мы получаем, что мы сможем прыгать только при прикосновении с землей.

Ах да, чуть не забыл. Вот, что будет, если на этом остановится. Можно даже сказать в буквальном смысле.

Я покажу, что нужно сделать, чтобы этого избежать, здесь сработала физика трения, которая нам не дает спуститься вниз, поэтому нужно это трение уменьшить или совсем отключить. Если просто понизить, то он будет медленно спускаться, что здорово, но подобрать такой баланс очень проблематично, так что мы постораемся написать это ручками. А для всего этого, нам понадобится Physics Material 2D. Так выглядит это у меня:

Прыжки игрока на Unity в 2D, изображение №6

И перемещаем это все к нашему игроку в материал.

Прыжки игрока на Unity в 2D, изображение №7

Теперь все работает, как надо. 2 этап закончен. Что же дальше? На этом я не закончу, потому что герои платформеров и не на такое способны. Мы добавим прыжки от стен и дополнительные прыжки. Приступим же к последнему, к 3 этапу.

Рис 3. Additional jumps in the air

Быстро пройдем к дополнительным прыжкам, так как ничего сложного в этом нет. Мы начинаем на земле с каким-то количеством прыжков при себе и восстанавливаем их только на земле. Тратим же мы прыжки в воздухе, пока все прыжки не закончатся. Еще могу добавить, что я прыжки делал в Update(), так как второй не успевает за нажатием space, может быть, в будущем найду способ настраивать время обновления его.

А теперь перейдем к довольно сложному делу, свое созданное скольжение по стенкам. Здесь я не стал делать одно и тоже и уже не применял Physics2D.OverlapBox. Решил пойти более изощренным способом, но также эффективным. Здесь я уже застрял на долгие часы раздумий. Для начала немного информации о новых функциях. Их будет две: Physics2D.Raycast и Mathf.Clamp.

Physics2D.Raycast — бросает луч против коллайдеров в сцене. Любой объект, контактирующий с лучом, можно обнаружить и сообщить о нем. Параметры функции: origin — точка в пространстве, откуда исходит луч; direction — вектор, представляющий направление луча; distance — максимальное расстояние, на которое нужно бросить луч; layerMask — фильтр для обнаружения коллайдеров только на определенных слоях; minDepth — только включает объекты с координатой z больше, чем это значение; maxDepth — только включает объекты с координатой z меньше этого значения.

Прыжки игрока на Unity в 2D, изображение №9

Рис 4. Sliding on the wall

Так, а теперь мы будем медленно спускаться по коду и разбираться, что я там нахимичил. Новые переменные у нас такие: время зацепа (действует только тогда, когда кнопка в сторону опущена), скорость скольжения, и расстояние луча. Для удобства, я разделил «подглавы» для кода.

И первую мы уже видели. А на второй мы уже остановимся. Мы сделаем так, чтобы луч был на той стороне, на которую мы смотрим в данный момент. После чего мы уже строим луч и дебаг, который на будет его рисовать. Хочется увидеть, что луч на месте и работает. Так что после того, как вы его использовали для проверки, его можно будет спокойно убрать. Третью и четвертую мы также видели. Осталось теперь только сделать так, чтобы игрок скользил по стене, когда луч касался стенки, не касался земли и двигался в ее сторону. Отмечаем, что игрок скользит и мереем время. Когда время запуска игры превысит установленное, то игрок больше не скользит и начнет падать. И в конце, чтобы игрок все-таки скользил, а не стоял, мы должны заставить его двигаться вниз. Для того, чтобы мы действительно скользили, а не двигались с полной скоростью вниз, мы используем Mathf.Clamp. И вот так это у нас выглядит в Unity.

Прыжки игрока на Unity в 2D, изображение №11

Теперь мы можем проверить, как же это работает на практике.

Как мы видим, все работает. Конечно, в этом способе есть небольшие недочеты, но для первого раза, так отлично получилось. Со временем все будет улучшаться, не забывая об основном, о прыжках. Пора бы нам уже заканчивать. Эта тема исчерпала себя, поэтому ждите чего-то нового от непредсказуемого меня. Пара ссылок, как всегда внизу, а я отхожу немножко на покой. Спасибо, что дочитали до конца. И я с вами не прощаюсь, а вы оставайтесь со мной!

Георгий Коровин


Георгий Коровин

Виктор,
public float jumpSpeed=30;
Transform transform;
void Start()Rigidbody rb=GetComponent();
Показать полностью.
transform=transform;
>
void FixedUpdate() if(Input.GetKey(KeyCode.Space)
rb.AddForce(transform.up*jumpSpeed,ForceMode.Impulse);
>
>

итого каждый тик если нажат пробел прибавляется импульс. надо делать проверку GetKeyDown в таком случае

Сергей Фурсов

Георгий Коровин


Георгий Коровин

Сергей Фурсов

Георгий Коровин


Георгий Коровин ответил Сергею

Сергей Фурсов

Сергей Фурсов

Часть кода
if (Input.GetButtonDown("Jump"))
<
Ray ray = new Ray(transform.position, Vector3.down);
RaycastHit hit;
Показать полностью.
if (Physics.Raycast(ray, out hit, 0.55f))
<
motor.Jump(JumpForce);
>
>

реализует прыжок
строка
if (Input.GetButtonDown("Jump")
делает фиксацию нажатия клавиши один раз
Часть кода
Ray ray = new Ray(transform.position, Vector3.down);
RaycastHit hit;
посылает лучь вниз.
if (Physics.Raycast(ray, out hit, 0.55f))
<
motor.Jump(JumpForce);
>
в этом условии проверяется нет ли столкновения луча с поверхностью под играком.
Сдесь полаагается что лучь пущени из точки 0.0.0 игрока, которая является его центром, а параметр Scale в трансформ объекта равен 1. тут я взяял не 0.5, а 0.55 f для большей точности.
и motor.Jump(JumpForce); реализует прыжок.
Эти два скрипта нужно повесить на один управляемый объект.
Логика там разделена, но их можно объединить и упростить.

Сергей Фурсов

После прыжка объект окажется в воздухе и повторное нажатие на прыжок - КЛ ПРОБЕЛ - снова вызовет эту часть кода, будет послан лучь в пол, но так как мы в воздухе лучь не коснется ничего и функция motor.Jump(JumpForce); не вызовется и соотв. не будет повторного импульса и полета в воздухе

Георгий Коровин


Георгий Коровин ответил Сергею

Георгий Коровин


Георгий Коровин ответил Сергею

Сергей Фурсов

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

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