◆ 持续开发中 · 当前为非稳定版本,如需抢先体验请通过 GitHub Issues 联系作者

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. 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 双屏。