Added Observation Scene to show the Replay
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace Unity.Cinemachine.Samples
|
||||
{
|
||||
public class BlendStyleManager : MonoBehaviour
|
||||
{
|
||||
class EarlyLookBlender : CinemachineBlend.IBlender
|
||||
{
|
||||
// This method is free to blend the states any way it likes.
|
||||
// In this case, we do a default blend then override the rotation to make
|
||||
// it happen at the beginning of the blend.
|
||||
public CameraState GetIntermediateState(ICinemachineCamera CamA, ICinemachineCamera CamB, float t)
|
||||
{
|
||||
var stateA = CamA.State;
|
||||
var stateB = CamB.State;
|
||||
|
||||
// Standard blend - first we disable cylindrical position
|
||||
stateA.BlendHint &= ~CameraState.BlendHints.CylindricalPositionBlend;
|
||||
stateB.BlendHint &= ~CameraState.BlendHints.CylindricalPositionBlend;
|
||||
var state = CameraState.Lerp(stateA, stateB, t);
|
||||
|
||||
// Override the rotation blend: look directly at the new target
|
||||
// at the start of the blend
|
||||
const float kFinishRotatingAt = 0.2f;
|
||||
var rotB = Quaternion.LookRotation(
|
||||
stateB.ReferenceLookAt - state.RawPosition, state.ReferenceUp);
|
||||
state.RawOrientation = Quaternion.Slerp(
|
||||
stateA.RawOrientation, rotB, Damper.Damp(1, kFinishRotatingAt, t));
|
||||
|
||||
return state;
|
||||
}
|
||||
}
|
||||
|
||||
EarlyLookBlender m_CustomBlender = new ();
|
||||
|
||||
bool m_UseCustomBlend;
|
||||
|
||||
public void OnBlendCreated(CinemachineCore.BlendEventParams evt)
|
||||
{
|
||||
// Override the blender with a custom blender
|
||||
if (m_UseCustomBlend)
|
||||
evt.Blend.CustomBlender = m_CustomBlender;
|
||||
}
|
||||
|
||||
public void DefaultBlend()
|
||||
{
|
||||
m_UseCustomBlend = false;
|
||||
ChangeCamera();
|
||||
}
|
||||
|
||||
public void CustomBlend()
|
||||
{
|
||||
m_UseCustomBlend = true;
|
||||
ChangeCamera();
|
||||
}
|
||||
|
||||
void ChangeCamera()
|
||||
{
|
||||
// Cycle through all the virtual cameras, assuming that they all have the same priority.
|
||||
// Prioritize the least-recently used one.
|
||||
int numCameras = CinemachineCore.VirtualCameraCount;
|
||||
CinemachineCore.GetVirtualCamera(numCameras - 1).Prioritize();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user