Камера свободного полета

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

Подготовка. Создаем пустой объект, затем делаем камеру на сцене, дочерней этому объекту, сбрасываем позицию камеры по нулям. Вешаем на камеру Box Collider. Создадим физический материал и ставим по нулям параметры у него:

Камера свободного полета

Его закидываем в коллайдер камеры, он нужен, чтобы камера не цеплялась за объекты.

Теперь, на родительский объект нашей камеры, вешаем скрипт FreeCamera:

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(Rigidbody))]

public class FreeCamera : MonoBehaviour {

	public float speed = 1.5f;
	public float acceleration = 10f;
	public float sensitivity = 5f; // чувствительность мыши
	public Camera mainCamera;
	public BoxCollider boxCollider;

	private Rigidbody body;
	private float rotY;
	private Vector3 direction;

	void Start()
	{
		body = GetComponent<Rigidbody>();
		body.freezeRotation = true;
		body.useGravity = false;
		body.mass = 0.1f;
		body.drag = 10;

		SetBoxColliderSize();
	}

	public void SetBoxColliderSize()
	{
		Vector3 point_A = mainCamera.ScreenPointToRay(Vector2.zero).origin;

		// определяем размер коллайдера по ширине экрана
		Vector3 point_B = mainCamera.ScreenPointToRay(new Vector2(Screen.width, 0)).origin;

		float dist = Vector3.Distance(point_A, point_B);
		boxCollider.size = new Vector3(dist, boxCollider.size.y, 0.1f);

		// определяем размер бокса по высоте
		point_B = mainCamera.ScreenPointToRay(new Vector2(0, Screen.height)).origin;

		dist = Vector3.Distance(point_A, point_B);
		boxCollider.size = new Vector3(boxCollider.size.x, dist, 0.1f);

		boxCollider.center = new Vector3(0, 0, mainCamera.nearClipPlane);
	}

	void Update()
	{
		float h = Input.GetAxis("Horizontal");
		float v = Input.GetAxis("Vertical");

		float rotX = mainCamera.transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivity;
		rotY += Input.GetAxis("Mouse Y") * sensitivity;
		rotY = Mathf.Clamp(rotY, -90, 90);
		mainCamera.transform.localEulerAngles = new Vector3(-rotY, rotX, 0);

		direction = new Vector3(h, 0, v);
		direction = mainCamera.transform.TransformDirection(direction);
	}

	void FixedUpdate()
	{
		body.AddForce(direction.normalized * speed * acceleration);

		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);
		if(Mathf.Abs(body.velocity.y) > speed) body.velocity = new Vector3(body.velocity.x, Mathf.Sign(body.velocity.y) * speed, body.velocity.z);
	}
}

Функция SetBoxColliderSize масштабирует коллайдер под размеры камеры, при этом нужно иметь ввиду, что если изменяется соотношение сторон, то эту функцию нужно запустить повторно, поэтому она сделана публичной.

Скачать демку:

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

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

Офлайн
Капельку изменил скрипт для возможности внедрения в RTS проект
if (Input.GetKey(KeyCode.Mouse1)&&Input.GetKey(KeyCode.Mouse0))
{
mainCamera.transform.localEulerAngles = new Vector3(rotY, rotX, 0);
}

Теперь камеру можно вращать если нажаты ЛКМ и ПКМ одновременно

Как по мне так это самый годный вариант, так как по отдельности на эти кнопки назначаются нужные функции в других скриптах
Офлайн
Moonspill 2 ноября 2017
MACTEP_SCHEFFFF,
Приветствую.совсем не соображаю в програмировании,а камера нужна именно с возможностью,которую Вы описали.куда или вместо чего вставляется Ваша поправка в коде?
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика