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

500 lines
16 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;
using UnityEngine.EventSystems;
using DG.Tweening;
using static WebInteraction;
using System;
using System.Collections.Generic;
/// <summary>
/// 上帝视角
/// </summary>
[AddComponentMenu("ExtendedFlycam/上帝视角")]
public class ExtendedFlycam : MonoBehaviour
{
static ExtendedFlycam _inst;
public CameraTypes cameraTypes = CameraTypes.;
public Room room = Room.None;
public List<GameObject> jiFang;
public List<GameObject> peiDianShi;
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; // 保存初始角度
public bool isvalid = true;
private void Awake()
{
_inst = this;
previousMousePosition = Input.mousePosition;
BoolMonitor.ValueChanged += BoolMonitor_ValueChanged;
}
//检测bool是否变化
private static void BoolMonitor_ValueChanged(object sender, EventArgs e)
{
//Debug.Log("当前是否不动" + BoolMonitor.Value);
//if (!BoolMonitor.Value)
//{
// if (!string.IsNullOrEmpty(WebInteraction.Inst.current_videoNumber) && WebInteraction.Inst.isVideoPlay)
// {
// WebInteraction.Inst.CloseVideo(WebInteraction.Inst.current_videoNumber);
// }
//}
}
private Transform cameraTransform;
private Vector3 lastPosition;
private Quaternion lastRotation;
void Start()
{
Cursor.visible = true;
//initialRotationEulerAngles = transform.localEulerAngles;
// 获取相机的Transform组件
cameraTransform = GetComponent<Transform>();
// 初始化上一帧的位置和旋转
lastPosition = cameraTransform.position;
lastRotation = cameraTransform.rotation;
}
private void OnEnable()
{
transform.rotation = Quaternion.Euler(initialRotationEulerAngles);
}
public 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;
}
//检测相机是否移动
public bool ismove()
{
// 检查当前帧的位置和旋转是否与上一帧不同
if (cameraTransform.position != lastPosition || cameraTransform.rotation != lastRotation)
{
// 相机移动了,可以在这里执行相应的操作
//Debug.Log("相机移动了"+ BoolMonitor.Value);
// 更新上一帧的位置和旋转
lastPosition = cameraTransform.position;
lastRotation = cameraTransform.rotation;
return false;
}
return true;
}
public void setisvalid(bool b)
{
isvalid = b;
}
void Update()
{
//if (mask_img.activeSelf) return;
//else if (!GameManager.Inst.isLoading) return;
BoolMonitor.Value = ismove();
if (!isvalid)
{
init_mainCamera_rot();
return;
}
//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, -45, 45);
//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 (!EventSystem.current.IsPointerOverGameObject())
{
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;
}
public CameraRT CameraRT;
public void CameraRtEnable()
{
CameraRT.enabled = true;
}
public void CameraRtDisable()
{
CameraRT.enabled = false;
}
/// <summary>
/// 镜头全景
/// </summary>
public void QuanJing()
{
for (int i = 0; i < CabinetUIManager.Instance.cabine_hights_now.Count; i++)
{
CabinetUIManager.Instance.cabine_hights_now[i].SetActive(true);
}
CabinetUIManager.Instance.cabine_hights_now.Clear();
if (GameManager.Inst.objectToShow_add.activeSelf)
{
var SN1 = GameManager.Inst.objectToShow_add.GetComponent<SearchName1>();
SN1.hide_menu();
GameManager.Inst.objectToShow_add.SetActive(false);
}
CameraRtEnable();
CameraRT.InitPanoramic();
return;
Array.ForEach(GameObject.FindObjectsOfType<ClickEvent>(), itme =>
{
itme.My_magnifyState = false;
});
//Array.ForEach(GameObject.FindObjectsOfType<TransparentGlow>(), itme =>
//{
// itme.F2();
//});
PatternChoose.Inst.sb_bj_page.SetActive(false);
PatternChoose.Inst.sb_xz_page.SetActive(false);
PatternChoose.Inst.dk_bj_page.SetActive(false);
PatternChoose.Inst.dk_xz_page.SetActive(false);
GameManager.Inst.magnifyState = false;
Inst.init_mainCamera_rot();
Inst.transform.DOLocalMove(new Vector3(4.73694f, 20.1847f, -4.738012f), 1);
Inst.transform.DORotateQuaternion(Quaternion.Euler(Inst.ClampAngle(67.072f, -179.714f, -0.025f, Vector3.zero)), 1f).OnComplete(() =>
{
//更新相机初始旋转角度
Inst.initialRotationEulerAngles = new Vector3(67.072f, -179.714f, -0.025f);
});
}
/// <summary>
/// 镜头鸟瞰
/// </summary>
public void NiaoKan()
{
CameraRtEnable();
CameraRT.InitBirds_Eye();
return;
Array.ForEach(GameObject.FindObjectsOfType<ClickEvent>(), itme =>
{
itme.My_magnifyState = false;
});
PatternChoose.Inst.sb_bj_page.SetActive(false);
PatternChoose.Inst.sb_xz_page.SetActive(false);
PatternChoose.Inst.dk_bj_page.SetActive(false);
PatternChoose.Inst.dk_xz_page.SetActive(false);
GameManager.Inst.magnifyState = true;
Inst.init_mainCamera_rot();
Inst.transform.DOLocalMove(new Vector3(18.35136f, 2.717596f, -10.86447f), 1);
Inst.transform.DORotateQuaternion(Quaternion.Euler(Inst.ClampAngle(22.6f, -91.1f, 0, Vector3.zero)), 1f).OnComplete(() =>
{
//更新相机初始旋转角度
Inst.initialRotationEulerAngles = new Vector3(22.6f, -91.1f, 0);
});
}
public void OnDestroy()
{
// 停止并清除所有DOTween动画
transform.DOKill();
// 清除DOTween Tweener和Sequence缓存
DOTween.Clear(true);
}
float GetLimitedAngle(float angle)
{
// 将角度转换为在 0-360 范围内
angle %= 360f;
// 处理负数角度
if (angle < 0f)
{
angle += 360f;
}
return angle;
}
public enum CameraTypes
{
,
}
public enum Room
{
None,
,
}
public void JingTou(int index)
{
if (index == 0)
{
QuanJing();
}
else
{
NiaoKan();
}
}
/// <summary>
/// 切换模式
/// </summary>
/// <param name="iscut">是否切换视角</param>
public void QieHuan(Menu menu, bool iscut = true)
{
CabinetUIManager.Instance.current_menu = menu;
if (iscut)
{
if (CabinetUIManager.Instance.current_menu == Menu.M_数字孪生_智能巡检)
room = Room.None;
else if (CabinetUIManager.Instance.current_menu == Menu.M_全景监控_现场作业)
room = Room.None;
else if (CabinetUIManager.Instance.current_menu == Menu.M_全景监控_摄像头)
room = Room.None;
else
room = Room.;
#region MyRegion
//else if (CabinetUIManager.Instance.current_menu == Menu.M_数字孪生_机柜容量)
// room = Room.配电室;
//else if (CabinetUIManager.Instance.current_menu == Menu.M_全景监控_设备告警)
// room = Room.配电室;
//else if (CabinetUIManager.Instance.current_menu == Menu.M_全景监控_温度 ||
// CabinetUIManager.Instance.current_menu == Menu.M_全景监控_湿度 ||
// CabinetUIManager.Instance.current_menu == Menu.M_全景监控_水浸 ||
// CabinetUIManager.Instance.current_menu == Menu.M_全景监控_烟感)
// room = Room.配电室;
//else if (CabinetUIManager.Instance.current_menu == Menu.M_全景监控_柜门状态)
// room = Room.配电室;
//else if (CabinetUIManager.Instance.current_menu == Menu.M_全景监控_红外监测)
// room = Room.配电室;
//else if (CabinetUIManager.Instance.current_menu == Menu.M_数字孪生_接地网)
// room = Room.配电室;
//else if (CabinetUIManager.Instance.current_menu == Menu.M_数字孪生_线缆连接_展示)
// room = Room.配电室;
//else if (CabinetUIManager.Instance.current_menu == Menu.M_数字孪生_场景管理)
// room = Room.配电室;
//else if (CabinetUIManager.Instance.current_menu == Menu.M_数字孪生_线缆连接_配置)
// room = Room.配电室;
//else if (CabinetUIManager.Instance.current_menu == Menu.M_数字孪生_线缆组配置)
// room = Room.配电室;
#endregion
if (Room.None == room)
{
cameraTypes = CameraTypes.;
room = Room.;
for (int i = 0; i < peiDianShi.Count; i++)
{
peiDianShi[i].SetActive(false);
}
for (int i = 0; i < jiFang.Count; i++)
{
jiFang[i].SetActive(true);
}
//JingTou(((int)cameraTypes));
}
else if (Room. == room)
{
cameraTypes = CameraTypes.;
room = Room.;
for (int i = 0; i < peiDianShi.Count; i++)
{
peiDianShi[i].SetActive(true);
}
for (int i = 0; i < jiFang.Count; i++)
{
jiFang[i].SetActive(false);
}
//JingTou(((int)cameraTypes));
}
else if (Room. == room)
{
cameraTypes = CameraTypes.;
room = Room.None;
for (int i = 0; i < peiDianShi.Count; i++)
{
peiDianShi[i].SetActive(true);
}
for (int i = 0; i < jiFang.Count; i++)
{
jiFang[i].SetActive(true);
}
//JingTou(((int)cameraTypes));
}
JingTou(((int)cameraTypes));
}
else
{
if (Room.None == room)
{
cameraTypes = CameraTypes.;
for (int i = 0; i < peiDianShi.Count; i++)
{
peiDianShi[i].SetActive(true);
}
for (int i = 0; i < jiFang.Count; i++)
{
jiFang[i].SetActive(true);
}
}
else if (Room. == room)
{
cameraTypes = CameraTypes.;
for (int i = 0; i < peiDianShi.Count; i++)
{
peiDianShi[i].SetActive(false);
}
for (int i = 0; i < jiFang.Count; i++)
{
jiFang[i].SetActive(true);
}
}
else if (Room. == room)
{
cameraTypes = CameraTypes.;
for (int i = 0; i < peiDianShi.Count; i++)
{
peiDianShi[i].SetActive(true);
}
for (int i = 0; i < jiFang.Count; i++)
{
jiFang[i].SetActive(false);
}
}
JingTou(((int)cameraTypes));
}
}
}