91.6402
98.8409
11.12.2023
09:51:21

Контроллер персонажа и камеры в Unity

Напиши для Unity контроллер игрового персонажа и контроллер камеры по следующим параметрам:

  1. На сцене создать пустой объект Player, в который вложить модель персонажа (Model) и пустой блок в районе рук (HandsBlock), в который в дальнейшем будут вкладываться различные инструменты.
  2. Прикрепить аниматор на модель персонажа и в скрипт добавить анимации: Стоять, Идти, Бежать - выполненные через смешение анимации и переменную Speed в аниматоре, прыжок, через переменную Jump (trigger)
  3. Для движения использовать физику RigidBody и Capsule Collider, которую тоже прикрепить на Player.
  4. Прыжок по нажатию пробела.
  5. Поворот персонажа по повороту мышки
  6. Камера с видом от третьего лица, направлена в сторону куда смотрит персонаж.
  7. Движение осуществлять следующим образом: W - бег вперед (с зажатым Shift - ходьба), S - движение назад (только ходьба, бег не возможен), A - бег влево (если нажать A и W одновременно должно быть смешивание анимации бега вперед и бега влево), D - бег вправо (если нажать D и W одновременно должно быть смешивание анимации бега вперед и бега вправо). Должно быть смешивание анимации бега/ходьбы вперед/назад и анимацией влево/вправо. Напиши подробно как настроить аниматор.

 

Для создания игрового персонажа и контроллера камеры в Unity с учетом заданных параметров, вам потребуется следовать нескольким шагам. Давайте начнем с создания персонажа и настройки анимаций.

Шаг 1: Создание персонажа

  1. Создайте пустой объект в иерархии и назовите его "Player".

  2. Внутри объекта "Player" создайте еще один пустой объект и назовите его "Model". Этот объект будет представлять модель персонажа.

  3. Создайте еще один пустой объект внутри "Player" и назовите его "HandsBlock". В этот объект вы будете добавлять различные инструменты.

  4. Прикрепите модель персонажа к объекту "Model" и разместите ее так, чтобы корректно соответствовать пустой руке (HandsBlock).

Шаг 2: Анимации персонажа

  1. Создайте аниматор для модели персонажа. Для этого выделите объект "Model", перейдите в окно "Animator" и нажмите кнопку "Create".

  2. В аниматоре создайте следующие параметры:

    • Переменная "Speed" типа Float для управления анимациями ходьбы и бега.
    • Переменную "Jump" типа Trigger для активации анимации прыжка.
  3. Создайте состояния аниматора для анимаций "Стоять", "Идти" и "Бежать" с использованием параметра "Speed" для смешения анимаций.

  4. Создайте состояние для анимации прыжка и настройте переходы к нему с использованием параметра "Jump".

Шаг 3: Движение и физика

  1. Прикрепите компонент "Rigidbody" к объекту "Player" для управления физикой персонажа.

  2. Добавьте компонент "Capsule Collider" к объекту "Player" и настройте его размер и высоту, чтобы соответствовать размерам вашего персонажа.

  3. Создайте скрипт для управления движением и прыжком персонажа. Ниже приведен пример скрипта:

 
using UnityEngine;

public class PlayerController : MonoBehaviour
{
  public float moveSpeed = 5f;
  public float runSpeed = 10f;
  public float jumpForce = 10f;
  public Transform cameraTransform;

  private Rigidbody rb;
  private Animator anim;
  private float horizontalMovement;
  private float verticalMovement;
  private bool isRunning;
  private bool isGrounded;

  private void Start()
  {
    rb = GetComponent();
    anim = GetComponentInChildren();
  }

  private void Update()
  {
    // Получаем ввод от клавиатуры
    horizontalMovement = Input.GetAxis("Horizontal");
    verticalMovement = Input.GetAxis("Vertical");
    isRunning = Input.GetKey(KeyCode.LeftShift);

    // Прыжок
    if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
    {
      rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
      anim.SetTrigger("Jump");
    }
  }

  private void FixedUpdate()
  {
    // Двигаем персонажа
    Vector3 moveDirection = cameraTransform.forward * verticalMovement + cameraTransform.right * horizontalMovement;
    moveDirection.y = 0f; // Не изменяем высоту
    moveDirection.Normalize();

    float speed = isRunning ? runSpeed : moveSpeed;
    rb.velocity = new Vector3(moveDirection.x * speed, rb.velocity.y, moveDirection.z * speed);

    // Устанавливаем анимации
    float moveSpeedNormalized = moveDirection.magnitude * speed;
    anim.SetFloat("Speed", moveSpeedNormalized);

    // Проверка на землю
    isGrounded = Physics.Raycast(transform.position, Vector3.down, 0.1f);
  }
}

Шаг 4: Контроль камеры

  1. Создайте камеру в вашей сцене и настройте ее положение и ориентацию так, чтобы она смотрела на персонажа сзади и немного вверх.

  2. Создайте скрипт для управления камерой. Ниже приведен пример простого скрипта для следования камеры за персонажем:

 
using UnityEngine;

public class CameraController : MonoBehaviour
{
  public Transform target; // Ссылка на объект "Player"
  public float rotationSpeed = 2f;

  private Vector3 offset;

  private void Start()
  {
    offset = transform.position - target.position;
  }

  private void LateUpdate()
  {
    // Поворачиваем камеру в соответствии с поворотом мыши
    float horizontalRotation = Input.GetAxis("Mouse X") * rotationSpeed;
    transform.RotateAround(target.position, Vector3.up, horizontalRotation);

    // Позиционируем камеру за персонажем
    Vector3 targetPosition = target.position + offset;
    transform.position = targetPosition;
  }
}
  1. Прикрепите скрипт управления камерой к объекту, представляющему камеру.

Теперь у вас должен быть функциональный игровой персонаж с анимациями и контроллером камеры, который соответствует вашим заданным параметрам. Убедитесь, что вы также настроили управление для клавиш W, S, A, и D, как описано в параметрах.

Персонаж в начале бега должен разворачиваться в сторону куда смотрит камера

Для того чтобы персонаж разворачивался в сторону, куда смотрит камера, вы можете использовать следующий подход:

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

  2. Затем вам нужно будет поворачивать персонажа в это направление, когда он начинает бег.

  3. Важно также учесть, что персонаж должен следовать за направлением камеры во время бега.

Для этого вы можете внести некоторые изменения в скрипт управления персонажем и скрипт управления камерой.

Изменения в скрипте управления персонажем:

 
using UnityEngine;

public class PlayerController : MonoBehaviour
{
  // ...

  private Vector3 lookDirection; // Направление, в котором смотрит камера

  private void Update()
  {
    // ...

    // Получаем направление, в котором смотрит камера
    lookDirection = cameraTransform.forward;
    lookDirection.y = 0f; // Убираем вертикальную составляющую
    lookDirection.Normalize();

    // Прыжок
    if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
    {
      rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
      anim.SetTrigger("Jump");
    }
  }

  private void FixedUpdate()
  {
    // Двигаем персонажа
    Vector3 moveDirection = lookDirection * verticalMovement + cameraTransform.right * horizontalMovement;

    // ...

    // Устанавливаем анимации
    float moveSpeedNormalized = moveDirection.magnitude * speed;
    anim.SetFloat("Speed", moveSpeedNormalized);

    // ...

  }
}

Изменения в скрипте управления камерой:

 
using UnityEngine;

public class CameraController : MonoBehaviour
{
  public Transform target; // Ссылка на объект "Player"
  public float rotationSpeed = 2f;

  private Vector3 offset;

  private void Start()
  {
    offset = transform.position - target.position;
  }

  private void LateUpdate()
  {
    // ...

    // Поворачиваем камеру в соответствии с поворотом мыши
    float horizontalRotation = Input.GetAxis("Mouse X") * rotationSpeed;
    transform.RotateAround(target.position, Vector3.up, horizontalRotation);

    // ...

    // Позиционируем камеру за персонажем
    Vector3 targetPosition = target.position + offset;
    transform.position = targetPosition;
  }
}

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

Камера должна двигаться при вращении мышкой по окружности вокруг персонажа

Для того чтобы камера вращалась по окружности вокруг персонажа при движении мыши, вам понадобится внести некоторые изменения в скрипт управления камерой. Вместо того, чтобы использовать transform.RotateAround , мы будем изменять угол поворота камеры вокруг персонажа.

Вот как можно это реализовать:


 
using UnityEngine;

public class CameraController : MonoBehaviour
{
  public Transform target; // Ссылка на объект "Player"
  public float rotationSpeed = 2f;

  private Vector3 offset;
  private float currentRotationAngle = 0f;

  private void Start()
  {
    offset = transform.position - target.position;
  }

  private void LateUpdate()
  {
    // Получаем ввод для вращения камеры
    float mouseX = Input.GetAxis("Mouse X");
    
    // Увеличиваем угол вращения на основе ввода
    currentRotationAngle += mouseX * rotationSpeed;
    
    // Преобразуем угол вращения в радианы
    float rotationAngleRad = currentRotationAngle * Mathf.Deg2Rad;
    
    // Рассчитываем новую позицию камеры вокруг персонажа
    Vector3 newPosition = target.position + offset;
    newPosition.x = target.position.x + Mathf.Sin(rotationAngleRad) * offset.magnitude;
    newPosition.z = target.position.z + Mathf.Cos(rotationAngleRad) * offset.magnitude;
    
    // Позиционируем камеру
    transform.position = newPosition;
    
    // Поворачиваем камеру, чтобы она всегда смотрела на персонажа
    transform.LookAt(target.position);
  }
}

Этот скрипт позволяет камере вращаться вокруг персонажа при движении мыши по горизонтальной оси (Mouse X). Угол вращения камеры сохраняется в currentRotationAngle , и камера позиционируется вокруг персонажа в зависимости от этого угла.

Теперь, когда вы двигаете мышью, камера будет вращаться вокруг персонажа по окружности.

Игрок так и не поворачивается в сторону камеры при беге вперед

Извините за недоразумение. Для того чтобы игрок поворачивался в сторону камеры при беге вперед, вам нужно будет обновить скрипт управления персонажем. Вам потребуется использовать Quaternion.Lerp для плавного поворота игрока в соответствии с направлением камеры. Вот обновленный код для скрипта управления персонажем:


 
using UnityEngine;

public class PlayerController : MonoBehaviour
{
  // ...

  private Vector3 lookDirection; // Направление, в котором смотрит камера
  private Quaternion targetRotation; // Целевая ориентация персонажа

  private void Update()
  {
    // ...

    // Получаем направление, в котором смотрит камера
    lookDirection = cameraTransform.forward;
    lookDirection.y = 0f; // Убираем вертикальную составляющую
    lookDirection.Normalize();

    // Прыжок
    if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
    {
      rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
      anim.SetTrigger("Jump");
    }

    // Поворот персонажа
    if (horizontalMovement != 0f || verticalMovement != 0f)
    {
      targetRotation = Quaternion.LookRotation(lookDirection);
    }
  }

  private void FixedUpdate()
  {
    // Двигаем персонажа
    Vector3 moveDirection = lookDirection * verticalMovement + cameraTransform.right * horizontalMovement;

    // ...

    // Устанавливаем анимации
    float moveSpeedNormalized = moveDirection.magnitude * speed;
    anim.SetFloat("Speed", moveSpeedNormalized);

    // ...

    // Поворачиваем персонажа
    if (horizontalMovement != 0f || verticalMovement != 0f)
    {
      transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, rotationSpeed * Time.fixedDeltaTime);
    }
  }
}

Этот код обновляет ориентацию персонажа в соответствии с направлением камеры при движении вперед. Поворот персонажа осуществляется с использованием Quaternion.Lerp , чтобы сделать его более плавным. Теперь при беге вперед персонаж будет автоматически поворачиваться в сторону, куда смотрит камера.

Прыжок срабатывает не всегда, переменная isGrounded имеет значение false, даже если персонаж стоит на Terrain

Проблема с переменной isGrounded , которая имеет значение false даже когда персонаж стоит на Terrain, может возникнуть из-за неправильной конфигурации коллайдера персонажа или из-за физических настроек в Unity. Вот несколько шагов, которые вы можете предпринять, чтобы решить эту проблему:

  1. Настройка Collider: Убедитесь, что у вашего персонажа правильно настроен Collider. Убедитесь, что Collider находится в правильной позиции и имеет достаточное значение высоты, чтобы покрыть модель персонажа и соприкасаться с Terrain.

  2. Настройка Layer Collision Matrix: Проверьте, что слои вашего персонажа и Terrain находятся в разных слоях и что в матрице коллизий не отключены коллизии для нужных слоев. Для этого перейдите в "Edit" -> "Project Settings" -> "Physics" и проверьте матрицу коллизий.

  3. Проверьте Gravity: Убедитесь, что у вашего персонажа в компоненте Rigidbody включена гравитация ( Use Gravity ).

  4. Настройка Collision Detection: В компоненте Rigidbody установите "Collision Detection" на Continuous для более точного определения столкновений.

  5. Проверьте Terrain Collider: У Terrain должен быть прикреплен Collider. Для этого выберите Terrain в иерархии и убедитесь, что компонент Collider включен и настроен корректно.

  6. Расположение Terrain: Проверьте, что Terrain не находится слишком низко или высоко относительно персонажа, чтобы избежать проблем с коллизиями.

  7. Расположение объекта "Player": Убедитесь, что объект "Player" и его Collider находятся на нижней стороне персонажа, где он должен касаться земли.

Если после выполнения этих шагов проблема все равно остается, убедитесь, что ваш персонаж и Terrain не имеют каких-либо других компонентов или скриптов, которые могут воздействовать на коллизии или физику. Также проверьте, что ваши настройки физики и коллизий в проекте не создают конфликтов.

Добавь в аниматор боковую скорость (SpeedRight) от -1 до 1 (при 0.5 - анимация Walk, при 1 - анимация Run), обычную скорость (Speed) измени с -1 до 1 (-1 - анимация LeftRun, 1 - анимация RightRun). И опиши подробно как настроить аниматор с помощью BlendTree

Для добавления боковой скорости (SpeedRight) и обычной скорости (Speed) в аниматор и использования Blend Tree для смешивания анимаций, следуйте этим шагам:

Шаг 1: Добавление параметров в аниматор

  1. Откройте свой аниматор в Unity.

  2. В разделе "Parameters" аниматора, нажмите на "Add Parameter" и создайте два параметра:

    • "SpeedRight" типа Float, диапазон от -1 до 1.
    • "Speed" типа Float, диапазон от -1 до 1.

Шаг 2: Создание Blend Tree

  1. В аниматоре создайте новое состояние Blend Tree. Щелкните правой кнопкой мыши на свободной области аниматора и выберите "Create State" -> "Blend Tree".

  2. Переименуйте Blend Tree, например, в "MovementBlendTree".

  3. Дважды щелкните по Blend Tree, чтобы открыть его настройки.

  4. В разделе "Parameters", добавьте параметры "SpeedRight" и "Speed", которые вы создали ранее.

Шаг 3: Настройка Blend Tree

  1. В Blend Tree вы увидите область сетки, в которой можно настроить анимации в зависимости от значений параметров.

  2. Добавьте анимации в Blend Tree для разных комбинаций "SpeedRight" и "Speed". Для каждой комбинации установите соответствующую анимацию.

  3. Настройте параметры "SpeedRight" и "Speed" для каждой анимации в Blend Tree. Это можно сделать, выбрав соответствующую клетку в сетке и задавая значения параметров.

    • Пример:
      • Для анимации Walk с SpeedRight = 0 и Speed = 0, задайте соответствующие значения параметров.
      • Для анимации Run с SpeedRight = 0 и Speed = 1, задайте значения параметров.
      • Для анимации LeftRun с SpeedRight = -1 и Speed = 0, задайте значения параметров.
      • Для анимации RightRun с SpeedRight = 1 и Speed = 0, задайте значения параметров.
  4. Blend Tree автоматически будет смешивать анимации на основе значений параметров "SpeedRight" и "Speed" при выполнении ваших действий в игре.

Шаг 4: Переключение анимаций в скрипте

В вашем скрипте управления персонажем вы можете установить значения параметров "SpeedRight" и "Speed" в соответствии с текущей скоростью движения персонажа по боковой и обычной оси. Например:


 
// В вашем скрипте управления персонажем
private void FixedUpdate()
{
  // Получаем ввод для управления движением
  float horizontalMovement = Input.GetAxis("Horizontal");
  float verticalMovement = Input.GetAxis("Vertical");

  // Рассчитываем скорость по боковой и обычной оси
  float speedRight = horizontalMovement;
  float speed = verticalMovement;

  // Применяем скорость к параметрам аниматора
  anim.SetFloat("SpeedRight", speedRight);
  anim.SetFloat("Speed", speed);

  // Другие действия, такие как перемещение персонажа и прыжок
  // ...

  // Устанавливаем анимации
  // ...
}

Теперь, при изменении скорости по боковой и обычной оси, Blend Tree в аниматоре будет автоматически смешивать анимации в соответствии с заданными значениями параметров "SpeedRight" и "Speed".

Увеличь гравитацию через скрипт

Для изменения гравитации через скрипт в Unity, вы можете использовать следующий код. Вам нужно установить новое значение гравитации для главного физического слоя (по умолчанию это "Default") с помощью метода Physics.gravity . Вот как это можно сделать:

using UnityEngine;

public class GravityController : MonoBehaviour
{
  public float newGravity = -20f; // Новое значение гравитации

  private void Start()
  {
    // Устанавливаем новое значение гравитации
    Physics.gravity = new Vector3(0f, newGravity, 0f);
  }
}

Присоедините этот скрипт к любому GameObject в вашей сцене, и в инспекторе установите значение newGravity на тот уровень гравитации, который вам нужен. Запустите игру, и гравитация будет установлена на новое значение. Помните, что это изменение затронет все объекты, использующие главный физический слой.

29.09.2023 15:06

Лента статей

Наверх