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