Skip to main content
The LCK tablet is the user-facing interface for recording, streaming, and camera control. This page covers its architecture and how to customize it.

Architecture overview

LCK manages standard Unity Camera components through three core MonoBehaviours: LckService is the central entry point. It handles recording, streaming, audio, camera switching, and configuration. Access it via dependency injection:
[InjectLck] private ILckService _lckService;
LckCamera connects a standard Unity Camera component to the LCK capture system. Cameras are managed using string IDs, which avoids tight coupling across project hierarchies. Once activated, a camera immediately starts capturing. LckMonitor provides access to the current active capture RenderTexture for display or further processing. Since LCK builds directly on Unity’s native cameras, all existing camera settings and rendering options remain available.

Tablet interface

The tablet provides three camera modes: Selfie — front/back facing camera on the tablet. Settings: FOV (50—100), Smoothing (0—100), Flip (front/back), Follow. First-person — films from the player’s HMD perspective. The camera transform uses the HMD Transform field in LCKCameraController (defaults to main camera). Settings: FOV (50—100), Smoothing (0—100). Third-person — tracks the user’s head at a configurable distance. Settings: FOV (50—100), Smoothing (0—100), Distance (1—5), Flip (forward/behind). Additional tablet controls include mute microphone with audio level display, flip aspect ratio (landscape/portrait), and record start/stop with duration display.

Quality configuration

Quality presets are defined in the LckQualityConfig ScriptableObject. See Recording for default values and how to create custom presets. The quality selector button on the tablet lets users switch between SD/HD on Quest, and SD/HD/2K/4K on desktop.

Higher quality capture rendering

If you want the capture to have higher visual quality than the in-game experience (for example, higher-detail player avatars), the recommended approach is separate render layers:
  1. Create a higher-quality duplicate of the object.
  2. Place it on a render layer visible only to LCK cameras.
  3. Keep the original on a different layer for gameplay.

Alternative: Command Buffers

camera.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, myCommandBuffer);
This requires careful GPU-side handling and may involve custom shader work for skinned meshes.

Alternative: URP Render Features

If using Universal Render Pipeline, implement a custom Render Feature to handle scaling at the pipeline level.

What does not work

Direct pre/post render callbacks do not work because LCK rendering uses Unity’s command buffer system, which executes asynchronously on the GPU. CPU-side mesh modifications will not sync reliably with capture frames.

Camera switching

You can switch the active camera at any time, including during recording:
_lckService.SetActiveCamera("my-camera-id");
_lckService.SetActiveCamera("my-camera-id", "my-monitor-id");

// Get current camera
_lckService.GetActiveCamera(); // LckResult<ILckCamera>

// Listen for camera changes
_lckService.OnActiveCameraSet += (result) => { /* handle */ };

Preview mode

Enable preview rendering without recording:
_lckService.SetPreviewActive(true);