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); } } } } }