You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

277 lines
8.5 KiB

using UnityEngine;
using System.Collections;
public class ExplorationCamera : MonoBehaviour
{
//Turn
[Range(1f, 50)]
public float sensitivity = 30;
[Range(.1f, 50)]
public float smoothing = 5f;
//Movement
private float speedZ;
private float speedX;
private float speedY;
[Range(.1f, 10)]
public float Speed = .1f;
[HideInInspector]
public float InitialSpeed = .1f;
[HideInInspector]
public float FOV;
private float initialFOV;
Vector2 initialLook;
Vector2 Look;
private Vector3 MovementDirection;
public float MaxAcceleration = 4;
[Range(1f, 10)]
public float AccelerationSmoothing = 10, SpeedSmooth = 1;
Vector2 _smoothMouse;
public bool HideCursor = false;
float focalLength = 0, focalSize = 1;
public bool ConstantMove = false;
Camera ThisCamera;
[HideInInspector]
public float tilt;
void Start()
{
try
{
//gamepad
Input.GetAxis("LookHorizontal");
}
catch
{
print("Import the custom input to support gamepad in this camera script\n http://davidmiranda.me/files/FogVolume3/InputManager.asset");
}
//if (this.GetComponent<UnityStandardAssets.ImageEffects.DepthOfField>())
//{
// focalLength = this.GetComponent<UnityStandardAssets.ImageEffects.DepthOfField>().focalLength;
// focalSize = this.GetComponent<UnityStandardAssets.ImageEffects.DepthOfField>().focalSize;
//}
}
Vector2 lastPos;
void OnGUI()
{
//ratón
if (Event.current.type == EventType.MouseDown)
{
lastPos = Event.current.mousePosition;
}
else if (Event.current.type == EventType.MouseDrag || Event.current.type == EventType.MouseMove)
{
Vector3 diff = Event.current.mousePosition - lastPos;
Look += new Vector2(diff.x * sensitivity / 50, -diff.y * sensitivity / 50);
lastPos = Event.current.mousePosition;
}
}
public float tiltSmoothing = 50, FOVTransitionSpeed = .1f;
public float inclination = 13;
public bool ApplyGravity;
[Range(0f, 1)]
public float gravityAccelerationScale = .1f;
void OnDestroy()
{ Cursor.visible = true; }
void FixedUpdate()
{
// if (Input.GetKey(KeyCode.Escape)) Application.Quit();
try
{
//gamepad
if (Mathf.Abs(Input.GetAxis("LookHorizontal")) > 0.017f || Mathf.Abs(Input.GetAxis("LookVertical")) > 0.017f)
{
Look += new Vector2(Input.GetAxis("LookHorizontal"), -Input.GetAxis("LookVertical")) * sensitivity;
if (Input.GetAxis("LookHorizontal") > 0)
tilt = Mathf.Lerp(tilt, -inclination * Mathf.Abs(Input.GetAxis("LookHorizontal")) * sensitivity, 1f / tiltSmoothing);
else
tilt = Mathf.Lerp(tilt, inclination * Mathf.Abs(Input.GetAxis("LookHorizontal")) * sensitivity, 1f / tiltSmoothing);
}
}
catch
{
//
}
tilt = Mathf.Lerp(tilt, 0, 1f / tiltSmoothing);
//DOF
if (Input.GetKey(KeyCode.PageDown))
focalLength -= .05f;
if (Input.GetKey(KeyCode.PageUp))
focalLength += .05f;
if (Input.GetKey(KeyCode.End))
focalSize -= .05f;
if (Input.GetKey(KeyCode.Home))
focalSize += .05f;
//if (this.GetComponent<UnityStandardAssets.ImageEffects.DepthOfField>())
//{
// this.GetComponent<UnityStandardAssets.ImageEffects.DepthOfField>().focalLength = focalLength;
// this.GetComponent<UnityStandardAssets.ImageEffects.DepthOfField>().focalSize = focalSize;
//}
//Turn interpolation
_smoothMouse.x = Mathf.Lerp(_smoothMouse.x, Look.x, 1f / smoothing);
_smoothMouse.y = Mathf.Lerp(_smoothMouse.y, Look.y, 1f / smoothing);
//Aplica giro suave
transform.localEulerAngles = new Vector3(-_smoothMouse.y, _smoothMouse.x, tilt);
//Traslación:
if (Input.GetKey(KeyCode.W) || Input.GetAxis("Vertical") > 0 || ConstantMove)
{
MovementDirection = new Vector3(0, 0, 1);
speedZ = Mathf.Lerp(speedZ, Speed, 1f / smoothing);
}
if (Input.GetKey(KeyCode.S) || Input.GetAxis("Vertical") < 0)
{
MovementDirection = new Vector3(0, 0, -1);
speedZ = Mathf.Lerp(speedZ, -Speed, 1f / smoothing);
}
if (Input.GetKey(KeyCode.A) || Input.GetAxis("Horizontal") < 0)
{
MovementDirection = new Vector3(-1, 0, 0);
speedX = Mathf.Lerp(speedX, -Speed, 1f / smoothing);
}
if (Input.GetKey(KeyCode.D) || Input.GetAxis("Horizontal") > 0)
{
MovementDirection = new Vector3(1, 0, 0);
speedX = Mathf.Lerp(speedX, Speed, 1f / smoothing);
}
if (Input.GetKey(KeyCode.Q) || Input.GetKey(KeyCode.JoystickButton4))
{
MovementDirection = new Vector3(0, -1, 0);
speedY = Mathf.Lerp(speedY, -Speed, 1f / smoothing);
}
if (Input.GetKey(KeyCode.E) || Input.GetKey(KeyCode.JoystickButton5))
{
MovementDirection = new Vector3(0, 1, 0);
speedY = Mathf.Lerp(speedY, Speed, 1f / smoothing);
}
//desaceleración
speedZ = Mathf.Lerp(speedZ, 0, 1f / smoothing);
MovementDirection.z = speedZ;
speedY = Mathf.Lerp(speedY, 0, 1f / smoothing);
MovementDirection.y = speedY;
speedX = Mathf.Lerp(speedX, 0, 1f / smoothing);
MovementDirection = new Vector3(speedX, speedY, speedZ);
if (ApplyGravity)
{
MovementDirection += Physics.gravity * gravityAccelerationScale;
}
transform.Translate(MovementDirection);
// transform.Rotate(Vector3.forward, tilt * 150);
//Speed Ratón
Speed = Mathf.Clamp(Speed, .001f, 100f);
if (Input.GetMouseButton(1))
{
InitialSpeed += Input.GetAxis("Mouse ScrollWheel") * .5f;
InitialSpeed = Mathf.Max(.1f, InitialSpeed);
}
//FOV
if (Input.GetMouseButton(1) & Input.GetKey(KeyCode.C) & FOV > 5)
{
FOV -= 1;
}
if (Input.GetMouseButton(1) & Input.GetKey(KeyCode.Z) & FOV < 120)
{
FOV += 1;
}
//Al soltar la tecla:
if (Input.GetMouseButton(1) == false)
{
FOV = Mathf.Lerp(FOV, initialFOV, FOVTransitionSpeed);//El último valor sería la velocidad a la que vuelve al fov original
//Rueda:
// speedZ += Input.GetAxis("Mouse ScrollWheel");
}
//Aplicar
//
//
if (ThisCamera)
if (ThisCamera.stereoEnabled == false)
GetComponent<Camera>().fieldOfView = FOV;
}
float TriggerValue = 0;
void Update()
{
//Extra velocidad:
try
{
TriggerValue = Mathf.Pow(Input.GetAxis("FasterCamera") * 1 / AccelerationSmoothing + 1, 2);
}
catch { }
//print(Speed);
if (Input.GetKeyDown(KeyCode.LeftShift))
{
Speed *= MaxAcceleration;
}
try
{
if (Input.GetAxis("FasterCamera") > 0 && Speed < InitialSpeed * MaxAcceleration)
{
Speed *= TriggerValue;
}
else
if (!Input.GetKey(KeyCode.LeftShift))
Speed = Mathf.Lerp(Speed, InitialSpeed, 1 / AccelerationSmoothing);
}
catch
{
if (!Input.GetKey(KeyCode.LeftShift))
Speed = Mathf.Lerp(Speed, InitialSpeed, 1 / AccelerationSmoothing);
}
// print(Speed);
if (Input.GetKeyUp(KeyCode.LeftShift))
{
Speed /= MaxAcceleration;
}
}
void OnEnable()
{
if (GetComponent<Camera>())
ThisCamera = GetComponent<Camera>();
InitialSpeed = Speed;
if (HideCursor)
Cursor.visible = false;
if(ThisCamera)
FOV = this.gameObject.GetComponent<Camera>().fieldOfView;
initialFOV = FOV;
initialLook = new Vector2(transform.eulerAngles.y, transform.eulerAngles.x * -1);
// Debug.Log (transform.eulerAngles);
Look = initialLook;
_smoothMouse = initialLook;
}
}