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<Rigidbody>();
		body.freezeRotation = true;
		layerMask = 1 << gameObject.layer | 1 << 2;
		layerMask = ~layerMask;
	}
	
	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, ну и прочее. В общем, поэкспериментируйте с настройками.

Скачать пример проекта:

Внимание! Посетители, находящиеся в группе Гости, не могут скачивать файлы.
Тестировалось на: Unity 5.5.0

Комментариев 23

Офлайн
msn1983 1 декабря 2015
Здравствуйте,! А можно ли где скачать готовый исходник, а то толи у меня руки не так толи в программе чего то не хватает. скорее первое.
А научиться хочу! Очень хочу!!! помогите люди добрые!
Офлайн
Light 1 декабря 2015
Цитата: msn1983
А можно ли где скачать готовый исходник

Исходник чего?
Офлайн
msn1983 2 декабря 2015
Light,
Простите, нет так выразился.
Если не затруднит выложить по этой страничке скрипт ( готовый проект) - персонаж с управлением от первого лица.
Ну не могу я что то сделать так как у вас. А научиться хочется.
Спасибо!
Офлайн
Light 2 декабря 2015
Цитата: msn1983
Если не затруднит выложить по этой страничке скрипт ( готовый проект)

Добавлено.

Статья и скрипт - обновлены.
Офлайн
bruner 13 декабря 2016
Отличный сайт!
Спасибо огромное за вашу работу! Все понятно, удобно и доступно !
То что нужно, для начинающих. Для себя нашел много полезных скриптов.
Спасибо!
Офлайн
А на кокой версии unity сделано? У меня на 5.4.1 не работает.
Офлайн
Light 27 декабря 2016
Андрей Федотов, проект обновлен.
Офлайн
Light, большое спасибо!
Офлайн
Fobos 29 января 2017
Подскажите новичку, кто знает. Скачал демку, запустил, все нормально, бегает прыгает. Но. При повороте камеры искажается геометрия по углам, т.е квадрат например растягивается к краю экрана. Все в настройках перекопал, не могу избавится от этого эффекта. Или это считается нормальным?
Офлайн
Yaolegol 27 августа 2017
А как сделать движение камеры (вращение головой) на андроид?
Офлайн
AndreyLunev 24 сентября 2017
Здравствуйте, только начал работу с Unity по учёбе.
Появилась непонятная проблема. Камера не запускается от первого лица. Т.е. на демо сцене запускается, на моей сцене (пока объектов мало) запускается, но как только объектов становится немного больше - всё, хана. Камера берёт непонятный угол обзора и держится там (не на модельке)
P.S. персонажем двигать можно
P.P.S. помогите пожалуйста, проект в универе надо сдать)
Офлайн
AndreyLunev 24 сентября 2017
Fobos,
А объекты трёхмерные? Просто если нарисован обычный прямоугольник (не объёмный) то может так растягиваться.
Офлайн
Light 24 сентября 2017
AndreyLunev, какой еще угол? Камера должна быть дочерним объектом модельки игрока и неважно сколько там других моделек на сцене.
Офлайн
AndreyLunev 25 сентября 2017
Light,
Она и является, но через неё не идёт отображение. Когда запускаешь проект, вид вообще откуда-то сверху.

Light,
Обновление скрипта кстати не спасает.
Офлайн
Light 25 сентября 2017
AndreyLunev, значит изображение идет с другой камеры.
Офлайн
Anics . 6 октября 2018
вдруг, мне здесь ответят. все сделал как написано. скрипт скопипащен. персонаж скользит по текстурам. скачал проект - у вас тоже самое. как скрипт пофиксить?
Офлайн
Light 6 октября 2018
Anics ., а он не должен скользить?
Офлайн
Anics . 6 октября 2018
Light,
ну, скрипт на управление от первого лица. вроде обычно не скользит)) а он должен скользить? если да. то подскажи неверующему как это изменить. только начал юньку
Офлайн
Light 7 октября 2018
Anics ., объект перемещается в пространстве? Если да, то цель достигнута. Если речь идет о анимации движения, то это другая тема совсем.
Офлайн
Anics . 7 октября 2018
Light, он, конечно, передвигается, но скользит как по катку. Не знаю как это пофиксить( или скрипт это не контролирует?
P.s уточню проблему.когда я зажимаю W, он едет как надо, но когда отжимаю w, он продолжает думаю, вы поняли
Офлайн
Light 7 октября 2018
Anics ., у Rigidbody есть параметр Drag, который отвечает за сопротивление.
Офлайн
Anics . 7 октября 2018
Light,
огромное спасибо. нашел еще одну штуку ( я на сайте недавно, правил не знаю, если очень надоедаю, то просто пошлите)) если с вашим скриптов просто зажать W, то персонаж двигается под небольшим углом влево. зачем это он так и как пофиксить? еще раз извините
Офлайн
Light 8 октября 2018
Anics ., само по себе смещение быть не может, этого нет в формулах. Либо мышкой, либо клавишей можно дать направление.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Дешевый хостинг
  • Яндекс.Метрика