123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using UnityEngine;
- public class CameraSurround : MonoBehaviour
- {
- public static CameraSurround instance;
- /// <summary>
- /// 旋转点
- /// </summary>
- private Vector3 m_RotationPoint;
- private void Awake()
- {
- instance = this;
- }
- private void Update()
- {
- CameraCtrlRotate();
- CameraCtrlMove();
- CameraCtrlMouseScrllMove();
- }
- /// <summary>
- /// 相机聚焦定位
- /// </summary>
- /// <param name="reset"></param>
- 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);
- }
- }
- }
- /// <summary>
- /// 获取Transform及其子级的包围盒(MeshRenderer),若MeshRenderer包围盒长度为0,则获取BoxCollider包围盒
- /// </summary>
- /// <param name="transform"></param>
- /// <returns></returns>
- private static Bounds GetBounds(Transform target)
- {
- PartMark[] tmpPartMarks = target.GetComponentsInChildren<PartMark>(true);
- List<MeshRenderer> tmpMeshRenders = new List<MeshRenderer>();
- 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;
- }
- /// <summary>
- /// 获取所以模型组的Boundes中心点
- /// </summary>
- 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;
- }
- }
|