Контроллеры персонажа (Character Controllers)
Персонажу в игре от первого или третьего лица часто требуется некоторая физика основанная на столкновениях, чтобы он не падал сквозь пол или не ходил сквозь стены. Обычно, всё же ускорение и движение персонажа физически нереалистичны, таким образом он может ускоряться, тормозить и менять направление мгновенно, не подвергаясь влиянию импульса.
В 3D физике этот тип поведения можно создать используя Character Controller. Этот компонент даёт персонажу простой коллайдер в форме капсулы, который всегда находится в вертикальном положении. У Controller’а есть свои особые функции для назначения скорости и направления объекта, но, в отличие от настоящих коллайдеров, он не требует Rigidbody и его эффекты импульса нереалистичны.
Character Controller не может проходить сквозь Static коллайдеры в сцене, поэтому он будет двигаться по полу и блокироваться стенами. Во время движения он может отталкивать Rigidbody объекты, но входящие столкновения не будут влиять на его ускорение. Это значит, что вы можете использовать стандартные 3D коллайдеры, чтобы создать сцену по которой будет ходить Controller, но вы не ограничены реалистичным, с точки зрения физики, поведением самого персонажа.
You can find out more about character controllers on the reference page.
FPS скрипт управлениия от первого лица
Шутеры от первого лица довольно популярны, особенно если они грамотно сделаны. Однако, если вы только начинаете изучать Unity и хотите сделать что-то наподобие Counter-Strike или вроде того. Могу возникнуть некоторые трудности с управлением персонажа. Заставить объект двигаться, просто, но в нашем случае нужно, чтобы персонаж двигался туда, куда он «смотрит». Конечно, в играх есть еще анимация движения и прочие мелочи, всё это вы уже сами добавите в скрипт, если будет нужно. Нам главное сделать управление движения и прыжок. Впрочем, есть и другой тип игр, где такой простой скрипт подойдет, например: Dear Esther, The Vanishing of Ethan Carter и т.п.

Создаем скрипт PlayerControl
using UnityEngine; using System.Collections; [RequireComponent(typeof(Rigidbody))] public class PlayerControl : MonoBehaviour < public float speed = 1.5f; public Transform head; public float sensitivity = 5f; // чувствительность мыши public float headMinY = -40f; // ограничение угла для головы public float headMaxY = 40f; public KeyCode jumpButton = KeyCode.Space; // клавиша для прыжка public float jumpForce = 10; // сила прыжка public float jumpDistance = 1.2f; // расстояние от центра объекта, до поверхности private Vector3 direction; private float h, v; private int layerMask; private Rigidbody body; private float rotationY; void Start () < body = GetComponent(); body.freezeRotation = true; layerMask = 1 void FixedUpdate() < body.AddForce(direction * speed, ForceMode.VelocityChange); // Ограничение скорости, иначе объект будет постоянно ускоряться if(Mathf.Abs(body.velocity.x) >speed) < body.velocity = new Vector3(Mathf.Sign(body.velocity.x) * speed, body.velocity.y, body.velocity.z); >if(Mathf.Abs(body.velocity.z) > speed) < body.velocity = new Vector3(body.velocity.x, body.velocity.y, Mathf.Sign(body.velocity.z) * speed); >> bool GetJump() // проверяем, есть ли коллайдер под ногами < RaycastHit hit; Ray ray = new Ray(transform.position, Vector3.down); if (Physics.Raycast(ray, out hit, jumpDistance, layerMask)) < return true; >return false; > void Update () < h = Input.GetAxis("Horizontal"); v = Input.GetAxis("Vertical"); // управление головой (камерой) float rotationX = head.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivity; rotationY += Input.GetAxis("Mouse Y") * sensitivity; rotationY = Mathf.Clamp (rotationY, headMinY, headMaxY); head.localEulerAngles = new Vector3(-rotationY, rotationX, 0); // вектор направления движения direction = new Vector3(h, 0, v); direction = head.TransformDirection(direction); direction = new Vector3(direction.x, 0, direction.z); if(Input.GetKeyDown(jumpButton) && GetJump()) < body.velocity = new Vector2(0, jumpForce); >> void OnDrawGizmosSelected() // подсветка, для визуальной настройки jumpDistance < Gizmos.color = Color.red; Gizmos.DrawRay(transform.position, Vector3.down * jumpDistance); >>
Чтобы всё работало как надо, персонажу нужно придумать и назначить отдельный слой. Это нужно для того, чтобы работал Raycast в скрипте, который определяет возможность прыжка и в тоже время для того, чтобы любой другой Raycast, мог взаимодействовать и игроком.
Всё достаточно просто. Различные детали, каждый сможет настроить под себя, плюс можно еще сделать материал для физики тела, например, чтоб увеличить коэффициент трения или наоборот, изменить массу Rigidbody, ну и прочее. В общем, поэкспериментируйте с настройками.
Скачать пример проекта:
Как скрыть часть тела персонажа для камеры?

Практикую игру от первого лица. Хочу понять, как убрать или скрыть части тела с виду от камеры. Подумал, что настройка Near на камере поможет это убрать. Возможно это банальная вещь, но мне это немного сложно понять. Хочу в будущем сделать игру с возможность онлайн. Сложно ли сделать так, чтобы у игрока была игра от первого лица видны только руки, а остальные игроки видели полностью модель игрока?
Отслеживать
задан 21 сен 2022 в 14:37
669 8 8 серебряных знаков 18 18 бронзовых знаков
По хорошему — это разные модели, «себя» отрисовываем моделью без тела(только руки), остальных — полноценной моделью. Ваш подход — минус к производительности
21 сен 2022 в 14:40
@ВладимирКлыков, т. е можно сделать, чтобы «капсула», двигалась по оси Y вместе с руками?
21 сен 2022 в 14:50
Т.е. рисуется модель у которой есть только руки, а тела вообще нет, и используется в качестве модели «себя» 🙂 что за капсула — я не очень понимаю
Как сделать управление персонажем на Unity 3D и 2D. Уроки Unity для детей
Мы покажем, как запрограммировать движение персонажа в 2D- и 3D-проектах на Unity. Урок будет полезен детям и подросткам, которые начинают изучать Unity.
Разрабатывать игры на движке Unity (Юнити) могут дети уже с 10 лет. Создание игр является очень увлекательным, но трудоемким процессом, который требует много внимания и навыков. Чтобы сделать одну игру, нужно учесть много деталей, в том числе научиться делать управление персонажем на Unity. Школа программирования для детей «Пиксель» подготовила подробный урок о том, как научить персонажа двигаться в 2D- и 3D-играх на Unity. Вы также можете посмотреть видеоинструкцию (в конце статьи).
Проработка движений персонажа в 3D
Начнем урок по Unity с разделения игровой сцены на два компонента, где первый — это площадка, по которой персонаж будет перемещаться. Иначе говоря, это Plane. Второй компонент — объект самого героя, Sphere.
Далее переходим к оживлению объектов. Управление персонажем на Юнити должно быть физически правильным. Обеспечить это позволяет компонент RigidBody. В инспекторе нажимаем Add Component, затем Physics и RigidBody.
Как заставить объекты существовать по своим законам? Именно вы являетесь создателем своего мира и вольны сами задавать ему физику. Проработка этого момента почти полностью лежит на скрипте. Писать его будем с помощью такого языка программирования, как Си Шарп (C#).
Создаем пустой скрипт и прописываем переменные, которые будут отвечать за скорость движения, быстроту поворота, передвижение по вертикали и горизонтали. В нашем случае переменные в Си Шарп будут названы MovementSpeed, TurningSpeed, vertical и horizontal соответственно.