GQ_Communicate/GQ_TongXin/Assets/script/相机/ExtendedFlycam.cs

171 lines
5.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using UnityEngine;
/// <summary>
/// 上帝视角
/// </summary>
[AddComponentMenu("ExtendedFlycam/上帝视角")]
public class ExtendedFlycam : MonoBehaviour
{
static ExtendedFlycam _inst;
public static ExtendedFlycam Inst
{
get
{
if (_inst == null)
{
_inst = new ExtendedFlycam();
}
return _inst;
}
}
public float cameraSensitivity = 90;
public float climbSpeed = 4;
public float normalMoveSpeed = 10;
public float slowMoveFactor = 0.25f;
public float fastMoveFactor = 3;
/// <summary>
/// 旋转X增量
/// </summary>
[HideInInspector] public float rotationX = 0.0f;
/// <summary>
/// 旋转Y增量
/// </summary>
[HideInInspector] public float rotationY = 0.0f;
private Vector3 previousMousePosition;
public Vector3 initialRotationEulerAngles; // 保存初始角度
private void Awake()
{
_inst = this;
previousMousePosition = Input.mousePosition;
//DateTime now = new DateTime(2023, 7, 25, 23, 0, 0);
//DateTime acquisition_time = now.Date.AddHours(now.Hour);//采集时间
//var dateTime_0C = acquisition_time.AddHours(1);//当前小时不再计算
//Debug.Log("acquisition_time:" + acquisition_time + "\ndateTime_0C:" + dateTime_0C);
}
void Start()
{
Cursor.visible = true;
//initialRotationEulerAngles = transform.localEulerAngles;
}
private void OnEnable()
{
//initialRotationEulerAngles = transform.localEulerAngles;
}
private bool HasMouseMoved()
{
float mouseX = Input.GetAxisRaw("Mouse X");
float mouseY = Input.GetAxisRaw("Mouse Y");
if (mouseX != 0 || mouseY != 0)
{
previousMousePosition = Input.mousePosition;
return true;
}
return false;
}
Vector3 ClampAngle(float x, float y, float z, Vector3 v)
{
if (x <= -360)
x += 360;
if (x >= 360)
x -= 360;
if (y <= -360)
y += 360;
if (y >= 360)
y -= 360;
if (z <= -360)
z += 360;
if (z >= 360)
z -= 360;
v.Set(x, y, z);
return v;
}
void Update()
{
//initialRotationEulerAngles = transform.localEulerAngles;
if (Input.GetMouseButton(1))
{
if (HasMouseMoved())
{
// 累加旋转增量
rotationX += Input.GetAxis("Mouse X") * cameraSensitivity;
rotationY += Input.GetAxis("Mouse Y") * cameraSensitivity;
rotationY = Mathf.Clamp(rotationY, -90, 90);
//Debug.Log(rotationX + "\n" + rotationX);
// 从initialRotationEulerAngles开始旋转然后添加旋转增量。
Vector3 rotation = initialRotationEulerAngles + new Vector3(rotationY, rotationX, 0);
transform.localRotation = Quaternion.Euler(rotation);
//transform.localEulerAngles = rotation;
}
}
if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
{
//GetComponent<ImageEffect_GaussianBlur>().enabled = true;
transform.position += transform.forward * (normalMoveSpeed * fastMoveFactor) * Input.GetAxis("Vertical") * Time.deltaTime;
transform.position += transform.right * (normalMoveSpeed * fastMoveFactor) * Input.GetAxis("Horizontal") * Time.deltaTime;
}
else if (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl))
{
transform.position += transform.forward * (normalMoveSpeed * slowMoveFactor) * Input.GetAxis("Vertical") * Time.deltaTime;
transform.position += transform.right * (normalMoveSpeed * slowMoveFactor) * Input.GetAxis("Horizontal") * Time.deltaTime;
}
else
{
transform.position += transform.forward * normalMoveSpeed * Input.GetAxis("Vertical") * Time.deltaTime;
transform.position += transform.right * normalMoveSpeed * Input.GetAxis("Horizontal") * Time.deltaTime;
}
if (Input.GetAxis("Mouse ScrollWheel") < 0)
{
//transform.position += transform.up * climbSpeed * Time.deltaTime*100;
if (GetComponent<Camera>().fieldOfView >= 60)
{
GetComponent<Camera>().fieldOfView = 60;
return;
}
GetComponent<Camera>().fieldOfView += Time.deltaTime * 100;
}
if (Input.GetAxis("Mouse ScrollWheel") > 0)
{
//transform.position -= transform.up * climbSpeed * Time.deltaTime*100;
if (GetComponent<Camera>().fieldOfView <= 10)
{
GetComponent<Camera>().fieldOfView = 10;
return;
}
GetComponent<Camera>().fieldOfView -= Time.deltaTime * 100;
}
if (Input.GetKeyDown(KeyCode.End))
{
Cursor.visible = (Cursor.visible == true) ? false : true;
}
}
/// <summary>
/// 重置相机角度初始增量
/// </summary>
public void init_mainCamera_rot()
{
rotationX = 0;
rotationY = 0;
}
}