Cinemachine 相机装配与分屏
rig prefab 就是配置本体:菜单一键生成「大脑(CinemachineBrain)+ 多机位」结构的 prefab,之后所有调配都在 Rig Editor 窗口里点选完成;运行期用 Addressables 实例化 rig,CinemachineRigBinder 负责绑挂点、列机位、切机位。
命名空间 HYC.Framework.Cinemachine(Runtime)/ HYC.Framework.Cinemachine.Editor(Editor)。锁 CM 3.1.5。
运行期用法
// 1) 实例化 rig(Addressables key 由你自己的配置/常量给出,框架不规定)
var op = Addressables.InstantiateAsync("PlayerRig", spawnPos, spawnRot);
var rig = op.WaitForCompletion(); // 或用 await / Completed 回调
// 2) 绑挂点 + 切机位
var binder = rig.GetComponent<HYC.Framework.Cinemachine.CinemachineRigBinder>();
binder.SetTargets(playerHead, playerHead); // 跟随 + 朝向,赋完即下发
binder.SwitchTo(HYC.Framework.Cinemachine.RigKind.ThirdPerson);
同屏 / 分屏(ViewSplitter,1× 像素)
using HYC.Framework.Cinemachine;
splitter.Register(rigA); // 每实例化一份 rig 就登记一次
splitter.Register(rigB);
splitter.Focused = rigA; // 同屏 / 画中画时谁占主视角
splitter.SetLayout(ViewLayout.Vertical); // ← 一键:左右分屏
splitter.SetLayout(ViewLayout.Single); // ← 一键:回同屏(B 的相机停渲染,不销毁)
splitter.SetLayout(ViewLayout.Quad, rigB, rigA); // 指定槽位顺序:B 进左上
splitter.LayoutChanged += layout => RebuildHud(layout);
接缝合成分屏(DualView,2× 像素)
两半需不需要拼成一张连续画面?需要 → 合成路径(CinemachineDualView,双 RT,2× 像素);不需要 → Camera.rect 路径(CinemachineViewSplitter,1× 像素)。
using HYC.Framework.Cinemachine;
using Unity.Cinemachine;
using UnityEngine;
public sealed class DualStyleBootstrap : MonoBehaviour
{
[SerializeField] private CinemachineRigBinder m_RigA;
[SerializeField] private CinemachineRigBinder m_RigB;
[SerializeField] private Transform m_PlayerA;
[SerializeField] private Transform m_PlayerB;
private CinemachineDualView m_View;
private void Start()
{
m_View = gameObject.AddComponent<CinemachineDualView>();
m_View.Bind(m_RigA, m_RigB, m_PlayerA, m_PlayerB);
// 固定机位(相机不跟人跑)必须关;跟着人跑的那种保持默认 true
m_View.AutoFraming = false;
m_View.Separate(SplitStyle.Vertical);
var mirror = gameObject.AddComponent<CinemachineDualMirror>();
mirror.Refresh();
// B 侧是镜像相机:把它的 Brain 关掉(rig prefab 默认带一个)
var brainB = m_RigB.GetComponentInChildren<CinemachineBrain>(true);
if (brainB != null)
brainB.enabled = false;
}
}
编辑器入口
HYC Framework/Cinemachine/Rig Editor(pri 80,打开相机装配编辑器,选中 rig prefab 时自动加载)HYC Framework/Cinemachine/New Rig(pri 81,新建 rig prefab,默认四机位)
坑(最重要的几条)
✕
1.
2. 机位不能做成
3. 多份 rig 各带 Brain 必须分流输出通道。CM 3 的 Brain 是从全局机位表里挑优先级最高的,
4.
5.
6. CM 管线每个 Stage(Body/Aim/Noise)只取首个组件,切换机位类型时必须移除同 Stage 旧组件。
7.
Camera.cullingMask 是「掩码」不是「层号」。传层号 28 得到的是 0b11100 = 层 2/3/4——相机什么都看不到:只有清屏色、一点几何都不渲染,而且不报任何错。必须写 1 << layer;想「什么都看,只排除 UI」就写 ~(1 << 5)。2. 机位不能做成
Camera 的子物体。Brain 每帧写回位姿,父子关系反喂给机位 ⇒ 跟随机位发飘、固定机位原地不动。Rig/ 下 Camera 与 vcam_* 平级。3. 多份 rig 各带 Brain 必须分流输出通道。CM 3 的 Brain 是从全局机位表里挑优先级最高的,
IsValidChannel 只看 OutputChannel / ChannelMask,不看层级;不分流就是「两半画面一模一样且不报错」。CinemachineViewSplitter.Register 已自动分配。4.
PrioritySettings.Enabled 默认 false,只写 Value 会被当 0;Priority = int 赋值才打开。5.
Viewport 与 Composite 不能混切:SetSeam 会把 RenderMode 单向切成 Composite,DowngradeToViewport 回不来。路线 ① 禁挂 CinemachineDualView。6. CM 管线每个 Stage(Body/Aim/Noise)只取首个组件,切换机位类型时必须移除同 Stage 旧组件。
7.
Lens 是公共字段:改 FOV 必须 var lens = cam.Lens; lens.FieldOfView = x; cam.Lens = lens;(拷-改-写回)。
◈
两个可运行场景(同一地图双人分屏 + 同场景视觉分叉)见 示例 · Cinemachine 双屏。