Платформер от первого лица на Unity3D
Учебные материалы для школы программирования. Часть 5
Предыдущие уроки можно найти здесь:
Продолжаем учиться — играя! Это занятие небольшое, но очень важное для дальнейшего движения по образовательной траектории. Мы познакомимся с системой анимации, контейнерами, и попробуем различные анимационные комбинации.
Все материалы к занятию вы найдете здесь.
Порядок выполнения
Создадим новый проект, импортируем в него стандартные ассеты Characters и Prototyping. Из префабов Prototyping создадим подобие игрового уровня.

Создадим платформу и вызовем окно анимации.

Нажмём на Create и назовём нашу анимацию.

Перейдём в режим записи и создадим новое правило для платформы — Transform->position.


Это необходимо, чтобы проставить первый и последний кейфрейм.

Поставим курсор куда-нибудь посередине и подвигаем платформу.

Автоматически создался ещё один кейфрейм. Если запустить проект, можно заметить, что платформа двигается.
Чтобы игрок мог на неё запрыгивать и передвигаться вместе с ней, на платформе нужно создать коллайдер-триггер и назначить скрипт Platform.

Переключившись в режим Curves, немного изменим характер её движения.

Платформа начала по-другому ускоряться и притормаживать. Если сейчас попытаться переместить платформу и нажать на плей, то окажется, что платформа появится всё равно в том же месте. Не лишним будет рассказать о зацикленных анимациях.
Создадим ещё одну платформу, но вложим её в пустой объект и выровняем в нули. Создадим новую анимацию.

Теперь, перемещая родительский объект, можно перемещать платформу вместе с анимацией.
Также, стоит коснуться работы аниматора. Найдём AnimatorController, выделим его и откроем окно Animator.
Создадим ещё одну анимацию и настроим переходы.
На этом этапе стоит объяснить принципы работы аниматора и возможность создавать условные переходы и переходы между анимациями с блендингом.

Теперь платформа воспроизводит первую анимацию, затем, 2 раза вторую, и так — по кругу. Обязательно расскажите ребятам, о возможности менять скорость анимации в аниматоре.

В заключении урока, стоит объяснить, что система анимаций — обширная тема, и мы затронули её лишь поверхностно. Стоит дать ученикам возможность самостоятельной работы, попутно отвечая на все возникающие вопросы.
Юнити от первого лица
Делаю игру от первого лица Но есть проблема Когда я начинаю ходить возле какого-то объекта Например Квадрата и ходить вокруг него то мой персонаж возвращается и разные стороны Я понимаю что это физика но можно ли как-то это убрать, чтобы персонаж вертелся только когда мне нужно Код передвижения Персонажа:
using UnityEngine; public class Movement : MonoBehaviour < public float Speed = 5f; public Rigidbody rb; private bool _isGrounded; void FixedUpdate() < MovementLogic(); >private void MovementLogic() < float moveHorizontal = Input.GetAxis("Horizontal"); float moveVertical = Input.GetAxis("Vertical"); Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); transform.Translate(movement * Speed * Time.fixedDeltaTime); >void OnCollisionEnter(Collision collision) < IsGroundedUpate(collision, true); >void OnCollisionExit(Collision collision) < IsGroundedUpate(collision, false); >private void IsGroundedUpate(Collision collision, bool value) < if (collision.gameObject.tag == ("Ground")) < _isGrounded = value; >> >
Код вражения камеры:
using UnityEngine; public class CameraControl : MonoBehaviour < public Transform player; public float mouseSensitivity = 2f; float cameraVerticalRotation = 0f; //bool lockedCursor = true; // Start is called before the first frame update void Start() < Cursor.visible = false; Cursor.lockState = CursorLockMode.Locked; >// Update is called once per frame void Update() < MouseControl(); >void FixedUpdate() < >private void MouseControl() < float inputX = Input.GetAxis("Mouse X") * mouseSensitivity; float inputY = Input.GetAxis("Mouse Y") * mouseSensitivity; cameraVerticalRotation -= inputY; cameraVerticalRotation = Mathf.Clamp(cameraVerticalRotation , -90f , 90f); transform.localEulerAngles = Vector3.right * cameraVerticalRotation; player.Rotate(Vector3.up * inputX);
Код слежения камеры за персонажем:
using UnityEngine; public class FollowPlayer : MonoBehaviour < public Transform player; public Vector3 offset; public float rotation; // Update is called once per frame void Update() < transform.position = player.position + offset; >>
Вид от 1 лица в Unity 5

Всем привет. Народ столкнулся с такой бедой. Раньше работал в Unity3D Pro 3.5 сейчас перешел на Unity3D 5.
И вот в чём вопрос - Не магу сделать вид от первого лица на c# не выходит так как только с vb.net работал.
Поиск не дал особого результата. Как мне реализовать вид от 1 лица чтобы можно было управлять персонажем как в обычных 3d играх.
Мне бы ссылки где посмотреть и почитать об этом.
Заранее извиняюсь за глупый вопрос
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Unity 5, камера от 3 лица
Привет вам добрые форумчане, столкнулся с небольшой проблемой. Написал механику движения от 3 лица.
Где можно почитать основы разработки в Unity/Unity 3D
До этого был небольшой опыт работы с Windows.Forms и WFP с C#. Где можно разобраться и научится.
Есть тут кто пишет на C# для Unity? Под игры созданные в Unity читы делаются?
Привет. Есть тут кто пишет на C# для Unity? Под игры созданные в Unity читы делаются? Такое.
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
Чем отличается вид от первого лица от остальных видов? Положением камеры. Какие проблемы-то?
Регистрация: 05.01.2016
Сообщений: 288
Вот скрипт на действия игрока перемещения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
public float speed = 6.0F; public float jumpSpeed = 8.0F; public float gravity = 20.0F; private Vector3 moveDirection = Vector3.zero; void Update() { CharacterController controller = GetComponentCharacterController>(); if (controller.isGrounded) { moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); moveDirection = transform.TransformDirection(moveDirection); moveDirection *= speed; if (Input.GetButton("Jump")) moveDirection.y = jumpSpeed; } moveDirection.y -= gravity * Time.deltaTime; controller.Move(moveDirection * Time.deltaTime); }
Привязал скрипт стандартный на камеру Simple Mouse Rotator
Склеил персонажа с камерой.
Кода двигаюсь по осям камера работает нормально но мне надо чтобы куда повернул камеру туда и пошел игрок.
Добавлено через 25 секунд
Да скрипт не мой
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, ну и прочее. В общем, поэкспериментируйте с настройками.
Скачать пример проекта: