Net.Like.Xue.Tokyo/Assets/Plugins/MeshCombineStudio/Scripts/Navigation Camera/NavigationCamera.cs

125 lines
3.9 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MeshCombineStudio
{
public class NavigationCamera : MonoBehaviour
{
public static float fov;
public SO_NavigationCamera data;
Quaternion rot;
Vector3 currentSpeed;
float tStamp;
float deltaTime;
Vector3 startPosition, position;
Quaternion startRotation;
float scrollWheel;
void Awake()
{
tStamp = Time.realtimeSinceStartup;
startPosition = position = transform.position;
startRotation = rot = transform.rotation;
}
void OnDestroy()
{
RestoreCam();
}
void Update()
{
scrollWheel = Input.mouseScrollDelta.y * data.mouseScrollWheelMulti;
}
void LateUpdate()
{
deltaTime = Time.realtimeSinceStartup - tStamp;
tStamp = Time.realtimeSinceStartup;
Vector2 deltaMouse = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
if (Input.GetMouseButtonDown(1))
{
rot = transform.rotation;
deltaMouse = Vector2.zero;
}
Vector3 speed = Vector3.zero;
if (Input.GetMouseButton(1))
{
// rot *= Quaternion.Euler(new Vector3(-deltaMouse.y * data.mouseSensitity * deltaTime * 100, deltaMouse.x * data.mouseSensitity * deltaTime * 100, 0));
Quaternion oldRot = transform.rotation;
transform.Rotate(0, deltaMouse.x * data.mouseSensitity * 1.66f, 0, Space.World);
transform.Rotate(-deltaMouse.y * data.mouseSensitity * 1.66f, 0, 0, Space.Self);
rot = transform.rotation;
transform.rotation = oldRot;
if (Input.GetKey(KeyCode.W)) speed.z = 1;
else if (Input.GetKey(KeyCode.S)) speed.z = -1;
if (Input.GetKey(KeyCode.D)) speed.x = 1;
else if (Input.GetKey(KeyCode.A)) speed.x = -1;
if (Input.GetKey(KeyCode.E)) speed.y = 1;
else if (Input.GetKey(KeyCode.Q)) speed.y = -1;
speed *= GetSpeedMulti();
}
if (Input.GetMouseButton(2))
{
speed.x = -deltaMouse.x;
speed.y = -deltaMouse.y;
speed *= GetSpeedMulti();
currentSpeed = speed;
}
else Lerp2Way(ref currentSpeed, speed, data.speedUpLerpMulti, data.speedDownLerpMulti);
position += transform.TransformDirection(currentSpeed * deltaTime) + (transform.forward * scrollWheel * deltaTime);
transform.rotation = rot;
transform.position = position;
}
public void SetCam()
{
transform.rotation = rot;
transform.position = position;
}
public void RestoreCam()
{
transform.position = startPosition;
transform.rotation = startRotation;
}
float GetSpeedMulti()
{
if (Input.GetKey(KeyCode.LeftShift)) return data.speedFast;
if (Input.GetKey(KeyCode.LeftControl)) return data.speedSlow;
else return data.speedNormal;
}
void Lerp2Way(ref Vector3 v, Vector3 targetV, float upMulti, float downMulti)
{
Lerp2Way(ref v.x, targetV.x, upMulti, downMulti);
Lerp2Way(ref v.y, targetV.y, upMulti, downMulti);
Lerp2Way(ref v.z, targetV.z, upMulti, downMulti);
}
void Lerp2Way(ref float v, float targetV, float upMulti, float downMulti)
{
float multi;
if (Mathf.Abs(v) < Mathf.Abs(targetV)) multi = upMulti; else multi = downMulti;
v = Mathf.Lerp(v, targetV, multi * deltaTime);
}
}
}