Table of Contents

Cinemachine


Cinemachine Brain

The Cinemachine Brain is a component in the Unity Camera itself. Cinemachine Brain monitors all active Virtual Cameras in the Scene. To specify the next live Virtual Camera, you activate or deactivate the desired Virtual Camera's game object. Cinemachine Brain then chooses the most recently activated Virtual Camera with the same or higher priority as the live Virtual Camera. It performs a cut or blend between the previous and new Virtual Cameras.

Cinemachine Brain 是挂载在真实相机上面的。它(根据逻辑)在多个 Virtual Camera 之间切换,并处理过渡,控制真实相机的表现。

  1. 附加在Unity的Camera上,从Virtual Camera中获取信息,控制真正的相机的行为,就像是Virtual Camera控制真正的实体相机的一层代理
  2. Live Camera是正在生效的虚拟相机
  3. Live Blend是正在进行中的过渡
  4. Default Blend是任意两个相机切换的默认效果
  5. Custom Blends是自定义的相机切换效果,是一个资源文件,可以参考一下这个Asset的内容。可以看到,存储的内容中,From和To相机都只是存储了名字,并不是引用,所以只要相机名字对应的上,使用的就是对应的Blend。另外,「所有相机」是使用这个常字符串表示的:"**ANY CAMERA**"。还有,在Edit Mode下,相机切换都是直接Cut,在Play Mode才有Blend的效果

存储的Blend资源中,存储的都是相机的名字:

m_CustomBlends:
- m_From: CM FreeLook1
  m_To: Timeline
  m_Blend:
    m_Style: 1
    m_Time: 2.5
    m_CustomCurve:
      serializedVersion: 2
      m_Curve:
      ...

Virtual Camera

Cinemachine does not create new cameras. Instead, it directs a single Unity camera for multiple shots. You compose these shots with Virtual Cameras. Virtual Cameras move and rotate the Unity camera and control its settings.

Cinemachine不会创建新相机,而是通过创建 Virtual Camera 控制原来的相机。

The Virtual Cameras are separate GameObjects from the Unity Camera, and behave independently.

Virtual Cameras 都是单独的Game Object。

Cinemachine encourages you to create many Virtual Cameras. The Virtual Camera is designed to consume little processing power. If your Scene is performance-sensitive, deactivate all but the essential Virtual Cameras at any given moment for extreme performance.

Virtual Camera 的消耗很小,可以放心使用,创建多个也没关系。如果对性能很敏感,就及时关掉不用的 Virtual Camera。

Virtual Camera是Cinemachine拓展功能的基础,各种不同功能的相机都是继承自Virtual Camera。基础的Virtual Camera就像Unity中原生的Camera,可以调整Fov、Near Far Clip等参数,初次之外还增加了Follow和Lookat等关联目标(原生相机没有的),相机的Body和Aim状态(也就是位移和朝向)也有多种自带的控制方案,可能需要绑定上述的Follow和Lookat目标,把这两个功能关掉就很像原生的Camera了。Solo是在场景中临时切换到这个相机看效果

Live是正在生效的状态,Standby是没有生效的状态,Standby Update就是不生效的时候的更新方式

FreeLook

通过3个圆环描述相机轨迹,相机可以由玩家的输入控制

BlendList

BlendList对象下面会有N个Virtual Camera,BlendList的属性中可以填写一个相机依次切换的队列,当这个BlendList被激活时,就会按照这个队列进行相机的依次切换。可以控制每个相机阶段停留的时长和过渡时长,但是不能控制相机运动的具体路径

StateDriven

和BlendList类似,也是1个StateDriven下面会挂载N个Virtual Camera,由一个Animator(上面所挂载的Animator Controller)所处的状态确定激活哪一个相机

Manager Camera

A manager camera oversees many Virtual Cameras but acts as a single Virtual Camera from the point of view of Cinemachine Brain and Timeline.

Manager Camera 管理多个 Virtual Camera,但是可以像处理单个 Virtual Camera 一样进行使用。Manager Camera 为我们提供了更多功能。

Body控制

3rd Person Follow

Framing Transposer

Hard Lock To Target

Orbital Transposer

Tracked Dolly

  1. DollyTrack (CinemachinePath) 是轨道本身
  2. DollyCart 是移动控制器

Transposer

Aim控制

Composer

也是看向一个目标,但是有一定的宽容度,使用Dead Zone和Soft Zone来描述这个宽容程度,Damping描述回到可容忍位置的速度(Damping,阻尼)。进入Solo状态时两个Zone的范围才能看得比较清楚

Group Composer

Hard Look At

直接朝向

POV

Same As Follow Target

相机路径

CinemachinePath(实际用起来感觉不太完善,还是得自己实现曲线插值)

相机切换

每个Virtual Camera都有一个Priority属性,描述其优先级,优先级最高的相机就是生效的相机。对于优先级相同的相机,后创建出来(或者后启用)的生效,但是不保证一定是这样(待验证)。可以通过在编辑器中关闭再开启一个相机将其切换为Live状态,代码可以参考:

public void LiveVirtualCamera(enumVirtualCamera liveTarget)
{
    // Avoid Camera Shake
    if (liveTarget == m_LivingVirtualCamera) return;
 
    m_LivingVirtualCamera = liveTarget;
 
    // Pop & Push
    System.Action<GameObject> PopPushOfQueue = Go =>
    {
        Go.SetActive(false);
        Go.SetActive(true);
    };
 
    switch(liveTarget)
    {
        case enumVirtualCamera.VC_LUA:
            PopPushOfQueue(m_Lua.gameObject);
            break;
 
        case enumVirtualCamera.VC_LOCK:
            PopPushOfQueue(m_Lock.gameObject);
            break;
 
        case enumVirtualCamera.VC_STATIC:
            PopPushOfQueue(m_Static.gameObject);
            break;
 
        case enumVirtualCamera.VC_DYNAMIC:
            PopPushOfQueue(m_Dynamic.gameObject);
            break;
 
        case enumVirtualCamera.VC_OVERLOOK:
            PopPushOfQueue(m_Overlook.gameObject);
            break;
 
        case enumVirtualCamera.VC_DEBUG:
            PopPushOfQueue(m_Debug.gameObject);
            break;
 
        default: break;
    }
}

相机之间的Blend效果可控制的内容有限,基本都是插值过去,只能用曲线描述一下快慢。要想控制路径的话,还是要用其他的方法单独做。

Virtual Camera 之间的切换混合只在 Play Mode 生效,在 Edit Mode 里面是 Hard Cut。

关于World Up方向
因为很多相机动画的过渡,都是 Cinemachine 直接提供的,所以 Up 方向是很重要的,会影响到相机的运动方式。比如在俯视角情况下(摄像机和玩家角色的朝向有很大的偏差角度),应该需要修改 Up 方向,才能让相机的运动更加自然。一般情况下使用默认的Up(0,1,0)就足够了。

Cinemachine Component

Cinemachine Extension

问题

  1. Cinemachine 只能控制一个 Main Camera。那如果需要多个 Camera 呢?比如,使用 Render Texture 在画面上同时渲染多个摄像机。场景中可以同时存在多个Brain吗?
  2. 从无到一个Virtual Camera,是瞬间切换,没有切换过程。

外链资料

  1. Unity Cinemachine 初识 https://icode.best/i/57754231126980