Страница 1 из 2
Реалистичный прыжок
Добавлено:
13 апр 2018, 23:51
alicewithalex
Всем привет, сейчас делаю контроллер от третьего лица, уже почти со всем разобрался, даже с коллизией камеры..) остался такой вопрос: сейчас прыжок только вверх работает, ну или если во время жать кнопки, то в сторону можно. А можно сделать как-нибудь, чтобы персонаж разбежались прыгнул и летел вперёд по параболе примерно, ну как в жизни то есть, чтобы нажал пробел после во время бега и персонаж прыгнул и летит не только вверх, но и вперед( в сторону куда прыгнул). Буду очень благодарен... Очень сильно интересует вопрос этот.. Спасбт
Re: Реалистичный прыжок
Добавлено:
14 апр 2018, 07:58
1max1
ну так velocity + гравитация, вот тебе и "параболический прыжок"))
Re: Реалистичный прыжок
Добавлено:
14 апр 2018, 12:58
alicewithalex
Просто у меня сейчас прыжок выглядит так:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Movement : MonoBehaviour {
public Transform cam; // Ссылка на Transform камеры, чтобы получить ее rotation
// Скорость ходьбы и бега
public float walkSpeed=8.0f;
public float runSpeed=20.0f;
// Скорость поворота
public float rotaionSpeed=15.0f;
// Приватные компоненты
private CharacterController controller;
private Animator animator;
// Для SmoothDampAngle
float currentVelocity;
public float speedsmoothTime=0.2f;
public float AnimspeedSmoothTime=0.1f;
float velocityY;
public float gravity=-9.8f;
public float jumpHeight=20.0f;
void Start () {
// Получаем компоненты
controller = GetComponent<CharacterController> ();
animator = GetComponent<Animator> ();
}
void Update () {
// Получаем ввод от пользователя
Vector2 input = new Vector2 (Input.GetAxis ("Horizontal"), Input.GetAxis ("Vertical"));
// Нормализуем вектор
Vector2 inputDir = input.normalized;
if(Input.GetKeyDown(KeyCode.Space)){
Jump();
}
if (inputDir != Vector2.zero) {
// Вычисляем нужный поворот... тут самая жесть <img src="./images/smilies/2.gif" alt=":(" title="Sad" />
float targetRotation = Mathf.Atan2(inputDir.x,inputDir.y)*Mathf.Rad2Deg+cam.eulerAngles.y;
transform.rotation = Quaternion.AngleAxis(Mathf.SmoothDampAngle(transform.eulerAngles.y,targetRotation,ref currentVelocity,speedsmoothTime),Vector3.up);
// Или можно так
// transform.eulerAngles = Vector3.up*(Mathf.SmoothDampAngle(transform.eulerAngles.y,targetRotation,ref currentVelocity,speedsmoothTime));
// Просто тут тяжело понять, что вращаем относительно оси Y
}
// Булева переменная, считывающая бежит ли персонаж или идёт
bool isRunning = Input.GetKey (KeyCode.LeftShift) && controller.isGrounded;
// Основываясь на переменной, описанной выше, вычисляем скорость
float speed = ((isRunning) ? runSpeed : walkSpeed) * inputDir.magnitude;
Vector3 velocity;
velocity = transform.forward*speed+Vector3.up*velocityY;
velocityY += Time.deltaTime * gravity;
// Вычисляем вектор перемещения
// Двигаем персонажа
controller.Move(velocity*Time.deltaTime);
if (controller.isGrounded) {
velocityY = 0;
}
float currentSpeed = new Vector2 (controller.velocity.x, controller.velocity.z).magnitude;
// Работаем с аниматором
float animationSpeedPercent = ((isRunning)? currentSpeed/runSpeed : currentSpeed/walkSpeed*0.5f);
// Делаем анимацию плавной, иначе слишком дёрганно всё получается
animator.SetFloat("speedPercent",animationSpeedPercent,AnimspeedSmoothTime,Time.deltaTime);
}
void Jump(){
if (controller.isGrounded) {
float jumpVelocity = Mathf.Sqrt (-2 * gravity * jumpHeight);
velocityY = jumpVelocity;
}
}
}
И как сюда добавить реалистичность хз...
Re: Реалистичный прыжок
Добавлено:
16 апр 2018, 23:52
1max1
Может просто к текущей скорости добавлять силу вверх
controller.velocity += Vector3.up * jumpForce;
Re: Реалистичный прыжок
Добавлено:
17 апр 2018, 09:19
alicewithalex
Да, но мне надо сделать, чтобы игрок не управлял персонажем в воздухе, а чтобы двигался он вперед или в другие направления в зависимости от разгона.А так у меня сейчас есть прыжок, но если разбежаться, прыгнуть и не жать вперед, то он остановится просто на месте
Re: Реалистичный прыжок
Добавлено:
17 апр 2018, 10:43
1max1
Просто заблокируй управление wasd во время прыжка.
Re: Реалистичный прыжок
Добавлено:
17 апр 2018, 10:59
alicewithalex
Это я сделаю, но у меня вектор передвижения зависит от скорости, а скорость от Input(WASD) Н
Re: Реалистичный прыжок
Добавлено:
17 апр 2018, 12:00
1max1
Это плохо, сделай так чтобы во время прыжка убрать эту зависимость и velocity менялся сам, вплоть до приземления.
Re: Реалистичный прыжок
Добавлено:
17 апр 2018, 12:09
alicewithalex
Вот я это и не могу сделать) Как раз решил спросить как лучше это сделать...
Re: Реалистичный прыжок
Добавлено:
17 апр 2018, 12:14
1max1
Самый простой способ создать булку)
bool jumping = false;
...
if (Input.GetKeyDown(KeyCode.Space)
jumping = true;
даем velocity вверх и блокируем движение кнопками
...
if (!jumping)
move...
тут меняется velocity через WASD
ну и после приземления jumping = false;
Re: Реалистичный прыжок
Добавлено:
17 апр 2018, 13:02
alicewithalex
А velocity во время прыжка мне нужно не только вверх, но и в направление куда прыгнули. спасибо за код кстати) Попробую
Re: Реалистичный прыжок
Добавлено:
17 апр 2018, 13:37
1max1
У тебя велосити уже в том направлении просто добавь к нему вектор вверх
velocity += Vector3.up * 100...
Re: Реалистичный прыжок
Добавлено:
17 апр 2018, 13:58
alicewithalex
Спасибо буду пробовать, как получится отпишусь)
Re: Реалистичный прыжок
Добавлено:
17 апр 2018, 21:31
alicewithalex
не получается почему-то... видимо не так делаю что-то... У меня как-будто вектор моего движения обрывается ,когда я не жму никуда и он остнавливается в воздухе
Re: Реалистичный прыжок
Добавлено:
18 апр 2018, 18:32
alicewithalex
Может мне стоить переписать контроллер от третьего Лица? Я вот цель сейчас ставлю перед собой сделать движение относительно камеры + поворот в сторону куда нажата кнопка(так же относительно камеры). Может есть у кого дельный урок или статья? Или свой код? Буду рад почитать его