| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- using UnityCommon;
- using UnityEngine;
- using UnityGameFramework.Runtime;
- using Cinemachine;
- namespace GFMain
- {
- public class CameraCtrlComponent : GameFrameworkComponent
- {
- [SerializeField]
- private GameObject goCameraController;
- [HideInInspector]
- public CameraController cameraController;
- /// <summary>
- /// 当前相机状态
- /// </summary>
- public UnityCommon.CameraState cameraStateCurrent
- {
- get { return cameraController.cameraStateCurrent; }
- }
- protected override void Awake()
- {
- base.Awake();
- goCameraController = Instantiate(goCameraController, transform);
- cameraController = goCameraController.GetComponent<CameraController>();
- stateNone = new NoneState(cameraController.cameraMain);
- }
- private NoneState stateNone;
- /// <summary>
- /// 飞行视角
- /// </summary>
- /// <param name="p"></param>
- /// <param name="q"></param>
- public void ToFly(Vector3 p, Quaternion q)
- {
- var flyState = new FlyState(cameraController.cameraMain, p, q);
- cameraController.Enter(flyState);
- }
- /// <summary>
- /// 飞行视角,注视目标对象
- /// </summary>
- /// <param name="pFocus"></param>
- /// <param name="distance"></param>
- 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);
- }
- /// <summary>
- /// 特写视角
- /// </summary>
- /// <param name="pFocus">目标对象位置</param>
- /// <param name="pOrignal">初始相机位置</param>
- public void ToCloseUp(Vector3 pFocus, Vector3 pOrignal)
- {
- var closeUpState = new CloseUpState(cameraController.cameraMain, pFocus, pOrignal);
- cameraController.Enter(closeUpState);
- }
- /// <summary>
- /// 特写视角
- /// </summary>
- /// <param name="pFocus">目标对象位置</param>
- /// <param name="distance">离目标对象的初始距离</param>
- public void ToCloseUp(Vector3 pFocus, float distance)
- {
- Vector3 pOrignal = pFocus + ((cameraController.cameraMain.transform.position - pFocus).normalized * distance);
- ToCloseUp(pFocus, pOrignal);
- }
- /// <summary>
- /// 特写视角,根据目标Transform包围盒自动计算合适距离
- /// </summary>
- /// <param name="tf">目标对象</param>
- 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);
- }
- /// <summary>
- /// 第一人称视角
- /// </summary>
- /// <param name="p">位置</param>
- /// <param name="q">旋转</param>
- public void ToFP(Vector3 p, Quaternion q)
- {
- var fpState = new FPState(cameraController.cameraMain, p, q, cameraController.fpsController);
- cameraController.Enter(fpState);
- }
- /// <summary>
- /// 第一人称视角
- /// </summary>
- /// <param name="tfTarget">目标对象</param>
- public void ToFP(Transform tfTarget)
- {
- ToFP(tfTarget.position, tfTarget.rotation);
- }
- /// <summary>
- /// 跟随视角
- /// </summary>
- /// <param name="tfTarget">跟随对象</param>
- public void ToFollow(Transform tfTarget)
- {
- var follow = new FollowState(cameraController.cameraMain, tfTarget);
- cameraController.Enter(follow);
- }
- /// <summary>
- /// 切换相机状态
- /// </summary>
- /// <param name="state"></param>
- public void To(UnityCommon.CameraState state)
- {
- cameraController.Enter(state);
- }
- /// <summary>
- /// 相机关闭
- /// </summary>
- public void ToNone()
- {
- cameraController.Enter(stateNone);
- }
- public void ToCinemachine()
- {
- cameraController.Enter(new CinemachineState(cameraController.cameraMain));
- }
- /// <summary>
- /// 返回前一个相机控制状态
- /// </summary>
- 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;
- }
- }
- }
|