Boat Attack使用了Universal RP的许多新图形功能,可以用于探索 Universal RP 的使用方式和技巧。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

89 行
3.5 KiB

using System.Collections.Generic;
using UnityEngine;
namespace Cinemachine
{
/// <summary>
/// Base class for a Cinemachine Virtual Camera extension module.
/// Hooks into the Cinemachine Pipeline.
/// </summary>
[DocumentationSorting(23, DocumentationSortingAttribute.Level.API)]
public abstract class CinemachineExtension : MonoBehaviour
{
/// <summary>Useful constant for very small floats</summary>
protected const float Epsilon = Utility.UnityVectorExtensions.Epsilon;
/// <summary>Get the associated CinemachineVirtualCameraBase</summary>
public CinemachineVirtualCameraBase VirtualCamera
{
get
{
if (m_vcamOwner == null)
m_vcamOwner = GetComponent<CinemachineVirtualCameraBase>();
return m_vcamOwner;
}
}
CinemachineVirtualCameraBase m_vcamOwner;
/// <summary>Connect to virtual camera pipeline.
/// Override implementations must call this base implementation</summary>
protected virtual void Awake()
{
ConnectToVcam();
}
/// <summary>Disconnect from virtual camera pipeline.
/// Override implementations must call this base implementation</summary>
protected virtual void OnDestroy()
{
if (VirtualCamera != null)
VirtualCamera.RemovePostPipelineStageHook(PostPipelineStageCallback);
}
void ConnectToVcam()
{
if (VirtualCamera == null)
Debug.LogError("CinemachineExtension requires a Cinemachine Virtual Camera component");
else
VirtualCamera.AddPostPipelineStageHook(PostPipelineStageCallback);
mExtraState = null;
}
/// <summary>
/// This callback will be called after the virtual camera has implemented
/// each stage in the pipeline. This method may modify the referenced state.
/// If deltaTime less than 0, reset all state info and perform no damping.
/// </summary>
protected abstract void PostPipelineStageCallback(
CinemachineVirtualCameraBase vcam,
CinemachineCore.Stage stage, ref CameraState state, float deltaTime);
/// <summary>Because extensions can be placed on manager cams and will in that
/// case be called for all the vcam children, vcam-specific state information
/// should be stored here. Just define a class to hold your state info
/// and use it exclusively when calling this.</summary>
protected T GetExtraState<T>(ICinemachineCamera vcam) where T : class, new()
{
if (mExtraState == null)
mExtraState = new Dictionary<ICinemachineCamera, System.Object>();
System.Object extra = null;
if (!mExtraState.TryGetValue(vcam, out extra))
extra = mExtraState[vcam] = new T();
return extra as T;
}
/// <summary>Ineffeicient method to get all extra state infor for all vcams.
/// Intended for Editor use only, not runtime!
/// </summary>
protected List<T> GetAllExtraStates<T>() where T : class, new()
{
var list = new List<T>();
if (mExtraState != null)
foreach (var v in mExtraState)
list.Add(v.Value as T);
return list;
}
private Dictionary<ICinemachineCamera, System.Object> mExtraState;
}
}