10 проверенных скриптов движения персонажа на C# для Unity
Для кого эта статья:
- Разработчики игр, начинающие с Unity
- Геймдизайнеры, интересующиеся реализацией механик движения
Программисты, желающие улучшить навыки работы с C# в контексте геймдева
Движение персонажа — фундамент любой игры, от простых 2D-платформеров до масштабных 3D-миров. Но почему многие разработчики застревают именно на этом этапе? Причина проста: между концепцией движения и его реализацией в коде лежит техническая пропасть. Не каждый геймдизайнер готов погрузиться в механику Vector3 и физику Rigidbody. Именно поэтому я собрал 10 проверенных C# скриптов для Unity, которые решат эту проблему раз и навсегда — просто скопируйте, настройте и запустите. Никаких многочасовых поисков в документации или экспериментов с физикой. Готовые решения для любого типа проекта — от ретро-платформера до современного экшена от первого лица. 🚀
Изучаете разработку игр на Unity, но хотите расширить свои навыки до полноценного IT-специалиста? Обучение веб-разработке от Skypro — идеальное дополнение к вашему геймдев-стеку. Многие принципы программирования универсальны, и навыки веб-разработки помогут вам создавать не только игры, но и сайты для их продвижения, личные портфолио и даже онлайн-сервисы, интегрированные с вашими играми. Расширьте горизонты своих возможностей!
Основы реализации движения персонажа в Unity на C#
Реализация движения персонажа — это базовый навык, с которого начинается разработка практически любой игры. В Unity существует несколько ключевых подходов к реализации движения, каждый со своими преимуществами и недостатками.
Основа движения персонажа в Unity строится на трех китах:
- Transform-манипуляции — прямое изменение позиции объекта (Transform.position)
- Физическое движение — использование Rigidbody и сил (AddForce, velocity)
- Character Controller — специализированный компонент Unity для управления персонажами
Выбор подхода определяется типом игры, требуемым уровнем контроля над персонажем и необходимостью взаимодействия с физикой мира.
| Подход | Преимущества | Недостатки | Рекомендуется для |
|---|---|---|---|
| Transform | Простота, точный контроль | Отсутствие физических взаимодействий | Простые 2D-игры, прототипы |
| Rigidbody | Реалистичная физика, взаимодействие с миром | Сложнее контролировать, может быть нестабильным | Игры с физикой, симуляторы |
| Character Controller | Баланс контроля и физических возможностей | Ограниченные физические взаимодействия | 3D-платформеры, экшен-игры |
При создании скриптов движения важно понимать входные данные. Unity предлагает два основных API для обработки ввода:
- Input.GetAxis() — получение плавного значения от -1 до 1, идеально для аналоговых стиков и клавиатуры
- Input.GetKey() — прямая проверка нажатия конкретной клавиши, полезна для дискретных действий
Базовая структура скрипта движения обычно включает следующие элементы:
- Объявление переменных скорости, силы прыжка и других параметров
- Получение компонентов (Rigidbody, Animator и т.д.) в методе Start()
- Считывание пользовательского ввода в Update() или FixedUpdate()
- Применение движения на основе ввода
- Дополнительная логика для прыжков, бега и других действий
Михаил Кузнецов, технический директор игровой студии
Помню, как наша команда работала над первой мобильной игрой — простым раннером с элементами платформера. Мы потратили почти неделю, пытаясь настроить физику движения главного персонажа. Он то "прилипал" к стенам, то неестественно скользил, то вообще проваливался сквозь платформы.
Проблема оказалась в неправильном подходе — мы использовали чистый Rigidbody там, где нужен был гибридный подход. В итоге переписали движение с использованием Rigidbody.velocity вместо AddForce, добавили проверку заземления через Raycast, и настроили материалы физики с нулевым трением. Эти простые изменения полностью преобразили геймплей, сделав управление интуитивным и отзывчивым. Теперь у нас есть готовый набор скриптов для разных типов движения, который мы используем во всех проектах.
Важно также учитывать различие между Update() и FixedUpdate(): первый вызывается каждый кадр и идеален для обработки ввода, второй используется для физических вычислений и имеет постоянный временной шаг.

5 скриптов для 2D-платформеров и top-down проектов
2D-игры требуют особого подхода к реализации движения. Вот пять готовых скриптов, которые можно немедленно интегрировать в ваш проект.
Скрипт #1: Базовое движение для 2D-платформера
using UnityEngine;
public class PlatformerController2D : MonoBehaviour
{
public float moveSpeed = 5f;
public float jumpForce = 10f;
public Transform groundCheck;
public float groundCheckRadius = 0.2f;
public LayerMask groundLayer;
private Rigidbody2D rb;
private bool isGrounded;
private float moveInput;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
// Проверка заземления
isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, groundLayer);
// Получение ввода для движения
moveInput = Input.GetAxisRaw("Horizontal");
// Обработка прыжка
if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
{
rb.velocity = new Vector2(rb.velocity.x, jumpForce);
}
// Поворот персонажа
if (moveInput > 0)
transform.localScale = new Vector3(1f, 1f, 1f);
else if (moveInput < 0)
transform.localScale = new Vector3(-1f, 1f, 1f);
}
void FixedUpdate()
{
// Применение горизонтального движения
rb.velocity = new Vector2(moveInput * moveSpeed, rb.velocity.y);
}
}
Этот скрипт реализует классическое движение платформера с прыжками и поворотом спрайта. Он использует Rigidbody2D для физики и проверяет заземление с помощью Physics2D.OverlapCircle.
Скрипт #2: Top-Down движение с прицеливанием по мыши
using UnityEngine;
public class TopDownMouseAim : MonoBehaviour
{
public float moveSpeed = 5f;
public Camera cam;
private Rigidbody2D rb;
private Vector2 movement;
private Vector2 mousePosition;
void Start()
{
rb = GetComponent<Rigidbody2D>();
if (cam == null)
cam = Camera.main;
}
void Update()
{
// Получаем ввод для движения
movement.x = Input.GetAxisRaw("Horizontal");
movement.y = Input.GetAxisRaw("Vertical");
// Получаем позицию мыши в мировых координатах
mousePosition = cam.ScreenToWorldPoint(Input.mousePosition);
}
void FixedUpdate()
{
// Перемещение персонажа
rb.MovePosition(rb.position + movement.normalized * moveSpeed * Time.fixedDeltaTime);
// Поворот персонажа в сторону мыши
Vector2 lookDirection = mousePosition – rb.position;
float angle = Mathf.Atan2(lookDirection.y, lookDirection.x) * Mathf.Rad2Deg – 90f;
rb.rotation = angle;
}
}
Данный скрипт обеспечивает перемещение в стиле top-down с прицеливанием в направлении курсора мыши. Идеально подходит для шутеров с видом сверху.
Скрипт #3: Платформер с настраиваемой физикой прыжка
using UnityEngine;
public class AdvancedPlatformerController : MonoBehaviour
{
public float moveSpeed = 6f;
public float jumpForce = 14f;
public float fallMultiplier = 2.5f;
public float lowJumpMultiplier = 2f;
public Transform groundCheck;
public float groundCheckRadius = 0.2f;
public LayerMask groundLayer;
private Rigidbody2D rb;
private bool isGrounded;
private float moveInput;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, groundLayer);
moveInput = Input.GetAxisRaw("Horizontal");
// Улучшенная физика прыжка
if (rb.velocity.y < 0)
{
rb.velocity += Vector2.up * Physics2D.gravity.y * (fallMultiplier – 1) * Time.deltaTime;
}
else if (rb.velocity.y > 0 && !Input.GetKey(KeyCode.Space))
{
rb.velocity += Vector2.up * Physics2D.gravity.y * (lowJumpMultiplier – 1) * Time.deltaTime;
}
// Прыжок
if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
{
rb.velocity = new Vector2(rb.velocity.x, jumpForce);
}
// Поворот персонажа
**Читайте также**
- [Основы создания и управления объектами в Unity: руководство](/gamedev/sozdanie-i-upravlenie-obuektami-v-unity/)
- [Создание игрового персонажа в Unity: от модели до анимации](/gamedev/sozdanie-personazhej-i-upravlenie-imi-v-unity/)
- [Интерфейс Unity для начинающих: от страха к мастерству](/gamedev/interfejs-unity-obzor-i-osnovnye-elementy/)
- [Скрипты в Unity: как открывать и редактировать код для новичков](/gamedev/kak-otkryt-i-redaktirovat-skripty-v-unity/)
- [Физика в Unity: как создать реалистичные объекты для первой игры](/gamedev/osnovy-fiziki-v-unity-vvedenie/)
- [Плавное перемещение в Unity: секретные техники разработчиков](/gamedev/plavnoe-peremeshenie-obuektov-v-unity/)
- [Создание игр на Unity: быстрый старт от идеи к прототипу](/gamedev/sozdanie-pervogo-proekta-v-unity/)
- [Создаем онлайн-игры в Unity: пошаговое руководство для новичков](/gamedev/kak-sdelat-onlajn-igru-na-unity/)
- [Разработка идеального UI в Unity: ключ к захватывающим играм](/gamedev/sozdanie-polzovatelskogo-interfejsa-ui-v-unity/)
- [Создание и настройка игровых объектов в Unity: руководство для начинающих](/gamedev/kak-sozdat-i-nastroit-obuekt-v-unity/)