GQ_Communicate/GQ_URP/GQ/Assets/script/相机/ExtendedFlycam.cs

704 lines
22 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.UI;
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 GameObject jiFangD;
public GameObject peiDianShiD;
//地面
public GameObject jiFang_ground;
public GameObject peiDianShi_ground;
//接地网地面
public GameObject jiFang_JDW_ground;
public GameObject peiDianShi_JDW_ground;
//线缆地面
public List< GameObject> jiFang_Cable_ground;
public Image xunJian_img;
public List<Sprite> sprites;
public Image room_img1;
public Image room_img2;
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()
{
//Debug.Log("版本号 1.1.1");
Cursor.visible = true;
//initialRotationEulerAngles = transform.localEulerAngles;
// 获取相机的Transform组件
cameraTransform = GetComponent<Transform>();
// 初始化上一帧的位置和旋转
lastPosition = cameraTransform.position;
lastRotation = cameraTransform.rotation;
//Debug.Log("版本号 1.1.1");
}
private void OnEnable()
{
//Debug.Log("版本号 1.1.1");
transform.rotation = Quaternion.Euler(initialRotationEulerAngles);
//Debug.Log("版本号 1.1.1");
}
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;
//Debug.Log("RT_OP");
}
public void CameraRtDisable()
{
CameraRT.enabled = false;
//Debug.Log("RT_CL");
}
/// <summary>
/// 镜头全景
/// </summary>
public void QuanJing()
{
if (PatternChoose.Inst.current_menu == CabinetUIManager.Instance.current_menu)
{
for (int i = 0; i < CabinetUIManager.Instance.cabine_hights_now.Count; i++)
{
CabinetUIManager.Instance.cabine_hights_now[i].SetActive(PatternChoose.Inst.current_menu == CabinetUIManager.Instance.current_menu);
}
}
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 (CabinetUIManager.Instance.current_menu == Menu.M_数字孪生_智能巡检)
{
for (int i = 0; i < peiDianShi.Count; i++)
{
peiDianShi[i].SetActive(false);
}
for (int i = 0; i < jiFang.Count; i++)
{
jiFang[i].SetActive(false);
}
xunJian_img.gameObject.SetActive(true);
return;
}
else
{
xunJian_img.gameObject.SetActive(false);
}
GameObject createLine = PatternChoose.Inst.xianlan.gameObject;
if (CabinetUIManager.Instance.jieDiWang.activeSelf)
{
if (!jiFang[1].activeInHierarchy)
{
CabinetUIManager.Instance.jieDiWang.SetActive(false);
}
else
{
jiFang[4].SetActive(false);
}
}
else if (CabinetUIManager.Instance.current_menu == Menu.M_数字孪生_接地网)
{
jiFang[4].SetActive(false);
if (jiFang[1].activeInHierarchy)
{
CabinetUIManager.Instance.jieDiWang.SetActive(true);
}
}
if (CabinetUIManager.Instance.current_menu != Menu.M_数字孪生_线缆连接_展示 || room == Room.)
{
for (int i = 0; i < createLine.transform.childCount; i++)
{
createLine.transform.GetChild(i).gameObject.SetActive(false);
}
}
//for (int i = 0; i < createLine.transform.childCount; i++)
//{
// createLine.transform.GetChild(i).gameObject.SetActive(false);
//}
bool isgo = true;
reminder((x) =>
{
isgo = x;
if (!isgo || SecondConfirmPanel.Instance.transform.GetChild(0).gameObject.activeInHierarchy)
return;
//if (Vector3.Distance(Camera.main.transform.position, new Vector3(5.47000027f, 19.2399025f, -4.70852375f)) <= 1f)
// return;
if (index == 0)
{
QuanJing();
}
else if (index == 99)
{
return;
}
else
{
NiaoKan();
}
});
}
/// <summary>
/// 切换模式
/// </summary>
/// <param name="state">选择状态</param>
public void QieHuan(Menu menu, int state = 1)
{
CabinetUIManager.Instance.current_menu = menu;
//菜单栏(不切换)
if (state == 1)
{
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_数字孪生_线缆连接_展示)
{
}
else
{
room = Room.None;
}
showRoom();
}
//房间状态变(会切换)
else if (state == 2)
{
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);
}
jiFang_JDW_ground.SetActive(true);
peiDianShi_JDW_ground.SetActive(false);
}
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);
}
jiFang_JDW_ground.SetActive(false);
peiDianShi_JDW_ground.SetActive(true);
}
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);
}
jiFang_JDW_ground.SetActive(true);
peiDianShi_JDW_ground.SetActive(true);
}
jiFangD.SetActive(false);
peiDianShiD.SetActive(false);
if (CabinetUIManager.Instance.current_menu != Menu.M_数字孪生_接地网)
{
jiFang_JDW_ground.SetActive(false);
peiDianShi_JDW_ground.SetActive(false);
}
if (CabinetUIManager.Instance.current_menu == Menu.M_数字孪生_线缆连接_展示)
{
jiFang_ground.SetActive(false);
peiDianShi_ground.SetActive(false);
}
JingTou(((int)cameraTypes));
}
// 房间状态显示(无转换)
else
{
showRoom(state);
}
if (room == Room.)
{
room_img1.sprite = sprites[1];
room_img2.sprite = sprites[1];
}
else if (room == Room.None)
{
room_img1.sprite = sprites[0];
room_img2.sprite = sprites[0];
}
else if (room == Room.)
{
room_img1.sprite = sprites[2];
room_img2.sprite = sprites[2];
}
}
/// <summary>
/// 展示房间
/// </summary>
void showRoom(int _none = 1)
{
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);
}
jiFang_JDW_ground.SetActive(true);
peiDianShi_JDW_ground.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);
}
jiFang_JDW_ground.SetActive(true);
peiDianShi_JDW_ground.SetActive(false);
}
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);
}
jiFang_JDW_ground.SetActive(false);
peiDianShi_JDW_ground.SetActive(true);
}
jiFangD.SetActive(false);
peiDianShiD.SetActive(false);
if (CabinetUIManager.Instance.current_menu != Menu.M_数字孪生_接地网)
{
jiFang_JDW_ground.SetActive(false);
peiDianShi_JDW_ground.SetActive(false);
}
if (CabinetUIManager.Instance.current_menu == Menu.M_数字孪生_线缆连接_展示)
{
jiFang_ground.SetActive(false);
peiDianShi_ground.SetActive(false);
}
if (_none == 1)
JingTou(((int)cameraTypes));
else
{
cameraTypes = CameraTypes.;
JingTou(((int)cameraTypes));
}
}
/// <summary>
/// 提示暂存箱
/// </summary>
public void reminder(Action<bool> callback = null)
{
if (Menu.M_数字孪生_场景管理 == CabinetUIManager.Instance.current_menu && CabinetUIManager.Instance.Stagin.childCount > 0)
{
SecondConfirmPanel.DeleteConform((delete) =>
{
if (delete)
{
var d = PatternChoose.Inst.transform.Find("设备类").GetComponent<DeleteDevice>();
d.mybody.ids.Clear();
for (int z = CabinetUIManager.Instance.Stagin.childCount - 1; z >= 0; z--)
{
var s = CabinetUIManager.Instance.Stagin.GetChild(z).GetComponent<DeviceQuery>().deviceList.id;
if (!string.IsNullOrEmpty(s)) d.mybody.ids.Add(s);
}
StartCoroutine(d.SaveJsonCoroutine((x) =>
{
if (x)
{
for (int z = CabinetUIManager.Instance.Stagin.childCount - 1; z >= 0; z--)
{
DestroyImmediate(CabinetUIManager.Instance.Stagin.GetChild(z).gameObject);
}
var content = GameManager.Inst.stagingPanel.transform.Find("Viewport/Content");
for (int i = content.childCount - 1; i >= 0; i--)
{
DestroyImmediate(content.GetChild(i).gameObject);
}
GameManager.Inst.stagingPanel.SetActive(false);
callback.Invoke(true);
}
else
{
callback.Invoke(false);
}
}));
}
else
{
callback.Invoke(false);
}
}, "是否删除暂存箱子中所有设备");
}
else
{
callback.Invoke(true);
}
}
}