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