using UnityEngine;
using UnityEngine.EventSystems;
using DG.Tweening;
using static WebInteraction;
using System;
using System.Collections.Generic;
///
/// 上帝视角
///
[AddComponentMenu("ExtendedFlycam/上帝视角")]
public class ExtendedFlycam : MonoBehaviour
{
static ExtendedFlycam _inst;
public CameraTypes cameraTypes = CameraTypes.全景;
public Room room = Room.None;
public List jiFang;
public List 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;
///
/// 旋转X增量
///
[HideInInspector] public float rotationX = 0.0f;
///
/// 旋转Y增量
///
[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();
// 初始化上一帧的位置和旋转
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().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().fieldOfView >= 60)
{
GetComponent().fieldOfView = 60;
return;
}
GetComponent().fieldOfView += Time.deltaTime * 100;
}
if (Input.GetAxis("Mouse ScrollWheel") > 0)
{
//transform.position -= transform.up * climbSpeed * Time.deltaTime*100;
if (GetComponent().fieldOfView <= 10)
{
GetComponent().fieldOfView = 10;
return;
}
GetComponent().fieldOfView -= Time.deltaTime * 100;
}
}
//if (Input.GetKeyDown(KeyCode.End))
//{
// Cursor.visible = (Cursor.visible == true) ? false : true;
//}
}
///
/// 重置相机角度初始增量
///
public void init_mainCamera_rot()
{
rotationX = 0;
rotationY = 0;
}
public CameraRT CameraRT;
public void CameraRtEnable()
{
CameraRT.enabled = true;
}
public void CameraRtDisable()
{
CameraRT.enabled = false;
}
///
/// 镜头全景
///
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();
SN1.hide_menu();
GameManager.Inst.objectToShow_add.SetActive(false);
}
CameraRtEnable();
CameraRT.InitPanoramic();
return;
Array.ForEach(GameObject.FindObjectsOfType(), itme =>
{
itme.My_magnifyState = false;
});
//Array.ForEach(GameObject.FindObjectsOfType(), 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);
});
}
///
/// 镜头鸟瞰
///
public void NiaoKan()
{
CameraRtEnable();
CameraRT.InitBirds_Eye();
return;
Array.ForEach(GameObject.FindObjectsOfType(), 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();
}
}
///
/// 切换模式
///
/// 是否切换视角
public void QieHuan(bool iscut = true)
{
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.配电室;
if (iscut)
{
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);
}
}
}
}
}