Camera Director
Compose camera presentation chains around gameplay events. It is intentionally simpler than Cinemachine and focused on event-driven camera moves.
Structure
CameraDirector (MonoBehaviour runner for coroutines)
- Holds the Camera reference and runs action sequences
CameraAction (abstract, [Serializable])
├── ZoomCameraAction - Changes field of view
├── ShakeCameraAction - Camera shake
├── MoveCameraAction - Position movement
└── WaitCameraAction - Wait
Quick Start
1. Add CameraDirector
Add CameraDirector to a scene object. If the Camera field is empty, it uses Camera.main.
2. Play One Action
using AchUtils.Camera;
[SerializeField] CameraDirector cameraDirector;
cameraDirector.Play(new ShakeCameraAction
{
Duration = 0.5f,
Intensity = 0.3f,
Frequency = 30f
});
3. Play a Sequence
[SerializeField] CameraDirector cameraDirector;
cameraDirector.PlaySequence(new CameraAction[]
{
new MoveCameraAction
{
FollowTarget = boss.transform,
Duration = 1.5f,
Ease = AnimationCurve.EaseInOut(0,0,1,1)
},
new ZoomCameraAction { TargetFOV = 35f, Duration = 0.8f },
new WaitCameraAction { Duration = 2.0f },
new ShakeCameraAction { Duration = 0.5f, Intensity = 0.4f },
new ZoomCameraAction { TargetFOV = 60f, Duration = 1.0f },
});
API
CameraDirector
CameraDirector cameraDirector
Camera Camera
void Play(CameraAction action)
void PlaySequence(IEnumerable<CameraAction> actions)
void Stop()
bool IsPlaying
event Action OnSequenceCompleted
ZoomCameraAction
float TargetFOV
float Duration
AnimationCurve Ease
ShakeCameraAction
float Duration
float Intensity
float Frequency
AnimationCurve AttenuationCurve
MoveCameraAction
Vector3 Destination
Transform FollowTarget
float Duration
AnimationCurve Ease
WaitCameraAction
float Duration
Completion Callback
cameraDirector.OnSequenceCompleted += () =>
{
player.EnableControl();
UI.ShowBossHealthBar();
};
cameraDirector.PlaySequence(bossIntroActions);
Custom Actions
[Serializable]
public class RotateCameraAction : CameraAction
{
public Vector3 TargetAngle;
public float Duration;
public override IEnumerator Execute(CameraDirector director)
{
var cam = director.Camera.transform;
Quaternion startRot = cam.rotation;
Quaternion endRot = Quaternion.Euler(TargetAngle);
float elapsed = 0f;
while (elapsed < Duration)
{
elapsed += Time.deltaTime;
cam.rotation = Quaternion.Lerp(startRot, endRot, elapsed / Duration);
yield return null;
}
cam.rotation = endRot;
}
}
Boss Intro Example
Boss trigger
↓
MoveCameraAction Move toward boss for 1.5s
↓
ZoomCameraAction FOV 60 -> 35 for 0.8s
↓
WaitCameraAction Wait 2s
↓
ShakeCameraAction Shake for 0.5s
↓
ZoomCameraAction FOV 35 -> 60 for 1s
↓
OnSequenceCompleted -> Show UI
::: tip With SequenceRunner
Use CallbackStep in SequenceRunner to start a camera sequence at a precise point in a presentation flow.
:::