Прокатись на платформе
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 51 из 60.
CharacterController не переносится вместе с тем, на чём стоит: на движущейся платформе он остаётся на месте, а платформа выскальзывает из-под него. Перемещение его transform.position не помогает, потому что следующий Move начинается с места, где физика видела его в последний раз, и отменяет это изменение.
Поэтому игрок добавляет движение платформы к своему. OnControllerColliderHit(ControllerColliderHit hit) вызывается для каждого коллайдера, которого касается Move; при столкновении снизу значение hit.normal.y близко к 1. Паром, который переносит ящик таким же образом:
private Ferry ferry;
void OnControllerColliderHit(ControllerColliderHit hit)
{
if (hit.normal.y > 0.7f && hit.gameObject.TryGetComponent(out Ferry f))
{
ferry = f;
}
}Задание
СреднеСделай так, чтобы игрок ехал на движущейся платформе.
- В
Playerдобавьprivate MovingPlatform platform;иOnControllerColliderHit: когдаhit.normal.y > 0.5fи у объекта есть компонентMovingPlatform, сохрани его вplatform. - В
Update()помести(move + velocity) * Time.deltaTimeвVector3 motion. Еслиplatform != null, добавьplatform.deltaи присвойplatform = null. - Вызови
controller.Move(motion).
Нажми «Играть» и прыгни на платформу: она будет тебя перемещать. Затем нажми «Проверить».
Попробуйте сами
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
[SerializeField] private float speed = 5f;
[SerializeField] private float jumpHeight = 1.5f;
[SerializeField] private float gravity = -9.81f;
private CharacterController controller;
private InputAction moveAction;
private InputAction jumpAction;
private Vector3 velocity;
void Start()
{
controller = GetComponent<CharacterController>();
moveAction = InputSystem.actions.FindAction("Move");
jumpAction = InputSystem.actions.FindAction("Jump");
}
void Update()
{
if (controller.isGrounded && velocity.y < 0f)
{
velocity.y = -2f;
}
Vector2 input = moveAction.ReadValue<Vector2>();
Vector3 move = new Vector3(input.x, 0f, input.y) * speed;
if (jumpAction.WasPressedThisFrame() && controller.isGrounded)
{
velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
velocity.y += gravity * Time.deltaTime;
controller.Move((move + velocity) * Time.deltaTime);
}
}
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банкеПотренируйтесь самостоятельно: Песочница Unity