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

416 lines
12 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();
}
}
public void QieHuan()
{
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));
}
}
}