Управление объектами в Unity через C# - PlayerMovement
Управление объектами в Unity через C#
Мы научимся:
✅ Двигать игрока по сцене (вперёд, назад, влево, вправо).
✅ Настроим скорость движения.
✅ Разберём ввод с клавиатуры (Input).
1. Создаём новый скрипт
- В Unity в Project → Scripts создаём новый C#-скрипт PlayerMovement.
- Открываем его и пишем код:
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float speed = 5f; // Скорость движения
void Update()
{
float moveX = Input.GetAxis("Horizontal"); // A, D или стрелки влево/вправо
float moveZ = Input.GetAxis("Vertical"); // W, S или стрелки вверх/вниз
Vector3 move = new Vector3(moveX, 0, moveZ) * speed * Time.deltaTime;
transform.Translate(move);
}
}
2. Добавляем скрипт игроку
- Выбери объект Player в Hierarchy.
- В Inspector нажми Add Component → PlayerMovement.
- В поле Speed установи 5 (или другое значение).
3. Запускаем игру!
- Нажми Play.
- Управляй игроком с помощью W, A, S, D или стрелок.
- Видишь, что объект двигается? 🚀
4. Добавляем поворот камеры (мышь)
Теперь сделаем так, чтобы камера поворачивалась за игроком.
1. Добавляем камеру внутрь игрока
- В Unity выбери Main Camera.
- Перетащи её внутрь объекта Player (в Hierarchy).
- Установи координаты Position на
(0, 1.6, 0).
2. Пишем код для камеры
- В Scripts создаём новый C#-скрипт CameraController.
- Открываем его и пишем:
using UnityEngine;
public class CameraController : MonoBehaviour
{
public float sensitivity = 2f;
private float rotationX = 0f;
void Update()
{
float mouseX = Input.GetAxis("Mouse X") * sensitivity;
float mouseY = Input.GetAxis("Mouse Y") * sensitivity;
rotationX -= mouseY;
rotationX = Mathf.Clamp(rotationX, -90f, 90f); // Ограничение угла обзора
transform.localRotation = Quaternion.Euler(rotationX, 0, 0); // Камера вверх/вниз
transform.parent.Rotate(Vector3.up * mouseX); // Поворот игрока
}
}
3. Добавляем скрипт камере
- Выбери Main Camera в Hierarchy.
- Добавь на неё скрипт CameraController.
- В поле Sensitivity установи 2.
5. Запускаем игру и тестируем!
- Персонаж двигается на W, A, S, D.
- Мышь вращает камеру.
Теперь у нас есть базовое движение и управление камерой! 🎮
давай сделаем несколько изменений, чтобы добавить возможность бега (Shift) и уточнить приседание (Ctrl).
Что изменим:
- Бег (Shift): При нажатии клавиши Shift скорость движения будет увеличиваться.
- Приседание (Ctrl): Мы уже это добавили, но уточним, как менять высоту коллайдера и скорость движения при приседании.
Шаги изменений:
- Добавим переменную для бега (будет хранить максимальную скорость бега).
- Изменим логику движения: При нажатии на Shift скорость будет увеличиваться.
Обновлённый скрипт:
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[Header("Движение")]
public float speed = 5f; // Скорость передвижения
public float runSpeed = 10f; // Скорость бега
public float crouchSpeed = 2.5f; // Скорость при приседании
private float originalSpeed;
[Header("Прыжок")]
public float jumpForce = 5f; // Сила прыжка
private bool isGrounded; // Проверка, на земле ли игрок
[Header("Компоненты")]
private Rigidbody rb; // Физический компонент
private CapsuleCollider col; // Коллайдер игрока
void Start()
{
rb = GetComponent<Rigidbody>();
col = GetComponent<CapsuleCollider>();
originalSpeed = speed; // Запоминаем стандартную скорость
}
void Update()
{
Move();
Jump();
Crouch();
OpenInventory();
Interact();
}
void Move()
{
float moveX = Input.GetAxis("Horizontal") * speed * Time.deltaTime;
float moveZ = Input.GetAxis("Vertical") * speed * Time.deltaTime;
// Если нажата клавиша Shift — увеличиваем скорость
if (Input.GetKey(KeyCode.LeftShift))
{
speed = runSpeed; // Бег
}
else
{
speed = originalSpeed; // Обычная скорость
}
transform.Translate(moveX, 0, moveZ);
}
void Jump()
{
if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
isGrounded = false;
}
}
void Crouch()
{
if (Input.GetKey(KeyCode.LeftControl))
{
speed = crouchSpeed; // Приседаем, уменьшаем скорость
col.height = 1f; // Уменьшаем высоту коллайдера
}
else
{
speed = originalSpeed; // Возвращаем нормальную скорость
col.height = 2f; // Возвращаем высоту коллайдера
}
}
void OpenInventory()
{
if (Input.GetKeyDown(KeyCode.Tab))
{
Debug.Log("Инвентарь открыт");
}
}
void Interact()
{
if (Input.GetKeyDown(KeyCode.E))
{
Debug.Log("Игрок пытается взаимодействовать (поднять предмет или прочитать записку)");
}
}
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("Ground"))
{
isGrounded = true;
}
}
}
Что изменено и как это работает:
-
Переменная
runSpeed: Мы добавили новую переменную для бега, которая контролирует скорость при нажатии на Shift. Теперь скорость движения будет увеличиваться, когда Shift удерживается. -
Логика бег/приседание:
- Если Shift удерживается, скорость игрока изменяется на runSpeed (бег).
- Если Ctrl удерживается, скорость меняется на crouchSpeed (приседание), и коллайдер игрока становится ниже.
- Если ни одна клавиша не удерживается, скорость восстанавливается до обычной.
Пояснение работы кода:
- В Update() в методе
Move()мы проверяем, нажата ли клавиша Shift с помощьюInput.GetKey(KeyCode.LeftShift). Если она нажата, скорость устанавливается на runSpeed, иначе возвращаемся к обычной скорости. - Приседание работает через проверку Ctrl, как и раньше.
Теперь при нажатии Shift игрок будет бежать быстрее, а при нажатии Ctrl — приседать с уменьшением скорости.
Попробуй этот код в Unity и посмотри, как работает бег и приседание! Если что-то нужно доработать или объяснить подробнее — скажи в коментарии. 🚀
Рекламное место для вашего банера 100% ширина — от 50 евро/мес.