using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class CameraSurround : MonoBehaviour
{
public static CameraSurround instance;
///
/// 旋转点
///
private Vector3 m_RotationPoint;
private void Awake()
{
instance = this;
}
private void Update()
{
CameraCtrlRotate();
CameraCtrlMove();
CameraCtrlMouseScrllMove();
}
///
/// 相机聚焦定位
///
///
public void SetCameraPosition(bool reset = false)
{
Bounds tmpBounds = GetBounds(DeviceController.instance.transform);
//物体最大长度
float a = tmpBounds.size.magnitude;
if (tmpBounds.size != Vector3.zero)
{
if (reset)
{
if (tmpBounds.size.x > tmpBounds.size.z)
{
transform.position = tmpBounds.center +((tmpBounds.center + new Vector3(0.2f, 0, 1)) - tmpBounds.center).normalized * a / 2 * 1.9f;
}
else
{
transform.position = tmpBounds.center +
((tmpBounds.center + new Vector3(1, 0.2f, 0)) - tmpBounds.center).normalized
* a / 2 * 1.9f;
}
}
else
{
transform.position = tmpBounds.center + (transform.position - tmpBounds.center).normalized * a / 2 * 1.9f;
}
}
m_RotationPoint = tmpBounds.center;
transform.LookAt(m_RotationPoint);
}
public void CameraCtrlMove()
{
if (Input.GetAxis("Mouse ScrollWheel") > 0)
{
transform.Translate(Vector3.forward * 1f);
}
if (Input.GetAxis("Mouse ScrollWheel") < 0)
{
transform.Translate(Vector3.forward * -1f);
}
}
Vector3 PreMouseMPos;
public void CameraCtrlMouseScrllMove()
{
if (Input.GetMouseButton(2))
{
if (PreMouseMPos.x <= 0)
{
PreMouseMPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0.0f);
}
else
{
Vector3 CurMouseMPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0.0f);
Vector3 offset = CurMouseMPos - PreMouseMPos;
offset = -offset * 0.01f;//0.1这个数字的大小可以调节速度
transform.Translate(offset);
PreMouseMPos = CurMouseMPos;
}
}
else
{
PreMouseMPos = new Vector3(0.0f, 0.0f, 0.0f);
}
}
private void CameraCtrlRotate()
{
var mouse_X = Input.GetAxis("Mouse X");
var mouse_Y = Input.GetAxis("Mouse Y");
if (Input.GetKey(KeyCode.Mouse1))
{
if (m_RotationPoint.x.ToString() != "NaN" && m_RotationPoint.y.ToString() != "NaN" && m_RotationPoint.z.ToString() != "NaN")
{
transform.RotateAround(m_RotationPoint, Vector3.up, mouse_X * 5);
transform.RotateAround(m_RotationPoint, transform.right, mouse_Y * -5);
}
else
{
SetCameraPosition(true);
}
}
}
///
/// 获取Transform及其子级的包围盒(MeshRenderer),若MeshRenderer包围盒长度为0,则获取BoxCollider包围盒
///
///
///
private static Bounds GetBounds(Transform target)
{
PartMark[] tmpPartMarks = target.GetComponentsInChildren(true);
List tmpMeshRenders = new List();
foreach (var item in tmpPartMarks)
{
tmpMeshRenders.AddRange(item.GetMeshRender(item.transform));
}
Bounds bounds = new Bounds(GetModelGroupBoundesConent(tmpMeshRenders.ToArray()), Vector3.zero);
foreach (Renderer renderer in tmpMeshRenders)
{
bounds.Encapsulate(renderer.bounds);
}
return bounds;
}
///
/// 获取所以模型组的Boundes中心点
///
private static Vector3 GetModelGroupBoundesConent(Renderer[] renderers)
{
Vector3 conent = Vector3.zero;
for (int i = 0; i < renderers.Length; i++) conent += renderers[i].bounds.center;
//获取到中心点
conent /= renderers.Length;
return conent;
}
}