Files
2025-05-26 18:56:25 +02:00

65 lines
2.3 KiB
C#

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