using UnityCommon; using UnityEngine; using UnityGameFramework.Runtime; using Cinemachine; namespace GFMain { public class CameraCtrlComponent : GameFrameworkComponent { [SerializeField] private GameObject goCameraController; [HideInInspector] public CameraController cameraController; /// /// 当前相机状态 /// public UnityCommon.CameraState cameraStateCurrent { get { return cameraController.cameraStateCurrent; } } protected override void Awake() { base.Awake(); goCameraController = Instantiate(goCameraController, transform); cameraController = goCameraController.GetComponent(); stateNone = new NoneState(cameraController.cameraMain); } private NoneState stateNone; /// /// 飞行视角 /// /// /// public void ToFly(Vector3 p, Quaternion q) { var flyState = new FlyState(cameraController.cameraMain, p, q); cameraController.Enter(flyState); } /// /// 飞行视角,注视目标对象 /// /// /// public void ToFly_lookat(Vector3 pFocus, float distance) { Vector3 pOrignal = pFocus + ((cameraController.cameraMain.transform.position - pFocus).normalized * distance); //var r = Quaternion.Euler(pFocus - pOrignal); var r = Quaternion.LookRotation(pFocus - pOrignal, Vector3.up); ToFly(pOrignal, r); } /// /// 特写视角 /// /// 目标对象位置 /// 初始相机位置 public void ToCloseUp(Vector3 pFocus, Vector3 pOrignal) { var closeUpState = new CloseUpState(cameraController.cameraMain, pFocus, pOrignal); cameraController.Enter(closeUpState); } /// /// 特写视角 /// /// 目标对象位置 /// 离目标对象的初始距离 public void ToCloseUp(Vector3 pFocus, float distance) { Vector3 pOrignal = pFocus + ((cameraController.cameraMain.transform.position - pFocus).normalized * distance); ToCloseUp(pFocus, pOrignal); } /// /// 特写视角,根据目标Transform包围盒自动计算合适距离 /// /// 目标对象 public void ToCloseUp(Transform tf) { var p = Utility.GetCenterPosition(tf); var bounds = Utility.GetBounds(tf); MainEntry.CameraCtrl.ToCloseUp(p, Mathf.Max(bounds.size.x, bounds.size.y, bounds.size.z) + 1); } /// /// 第一人称视角 /// /// 位置 /// 旋转 public void ToFP(Vector3 p, Quaternion q) { var fpState = new FPState(cameraController.cameraMain, p, q, cameraController.fpsController); cameraController.Enter(fpState); } /// /// 第一人称视角 /// /// 目标对象 public void ToFP(Transform tfTarget) { ToFP(tfTarget.position, tfTarget.rotation); } /// /// 跟随视角 /// /// 跟随对象 public void ToFollow(Transform tfTarget) { var follow = new FollowState(cameraController.cameraMain, tfTarget); cameraController.Enter(follow); } /// /// 切换相机状态 /// /// public void To(UnityCommon.CameraState state) { cameraController.Enter(state); } /// /// 相机关闭 /// public void ToNone() { cameraController.Enter(stateNone); } public void ToCinemachine() { cameraController.Enter(new CinemachineState(cameraController.cameraMain)); } /// /// 返回前一个相机控制状态 /// public void ToPreCamerastate() { cameraController.Enter(cameraStateCurrent?.preCameraState); } public UnityCommon.CameraState ToMotionless(Transform tfTarget) { return ToMotionless(tfTarget.position, tfTarget.rotation); } public UnityCommon.CameraState ToMotionless(Vector3 p, Quaternion r) { var state = new MotionlessState(cameraController.cameraMain, p, r); cameraController.Enter(state); return state; } } }