欢迎光临
我们一直在努力

Unity 中 Camera 和 CinemachineVirtualCamera 的区别:导入 FBX 相机后应该怎么处理

前言

在 Unity 项目中使用 Cinemachine 做镜头控制时,很多人会遇到一个很常见的问题:

从 Blender、Maya、3ds Max 等软件导入一个带相机节点的 FBX 后,Unity 场景或模型实例下面会自动出现一个 Camera 组件。

这时就容易产生疑问:

这个 FBX 自带的 Camera 能不能直接用?
它和 CinemachineVirtualCamera 是什么关系?
项目里已经有 Main Camera 了,还需要这个 Camera 吗?

这个问题看起来只是一个组件选择问题,实际涉及 Unity 的真实渲染相机、Cinemachine 虚拟相机、镜头切换结构和后期维护方式。

本文用一个通用例子来说明:

美术导出了一个带相机动画的 FBX。
程序把 FBX 导入 Unity。
Unity 自动生成了一个 Camera 组件。
项目本身使用 Cinemachine 管理镜头。

在这种情况下,我们应该如何理解 Camera 和 CinemachineVirtualCamera,以及应该如何处理 FBX 自带的相机。

一、Camera 组件是什么

Camera 是 Unity 真正负责渲染画面的组件。

只要一个 Camera 组件处于启用状态,它就会根据自己的位置、旋转、视野、裁剪距离、渲染层级等参数,把场景渲染到 Game 视图、屏幕或者 RenderTexture 中。

简单理解:

Camera = 真正拍摄并输出画面的相机

它的主要职责包括:

  • 决定玩家最终看到什么画面。
  • 决定画面的透视关系和视野范围。
  • 决定近裁剪面、远裁剪面。
  • 决定渲染哪些 Layer。
  • 决定画面输出到屏幕还是 RenderTexture。
  • 在 URP 或 HDRP 中参与相机堆叠、后处理、渲染顺序等逻辑。

所以,Camera 是一个真实的渲染入口。

如果场景里同时启用了多个真实 Camera,Unity 就可能让多个相机一起渲染。最终画面会受到 Depth、Clear Flags、Culling Mask、渲染管线设置等因素影响。

这也是为什么在项目中不能随便启用多个 Camera。多个真实相机不是不能用,而是必须有明确目的。

二、CinemachineVirtualCamera 是什么

CinemachineVirtualCamera 不是 Unity 的真实渲染相机。

它不会自己把画面渲染到 Game 视图,也不会单独输出图像。它本质上是一个“虚拟机位”,用来描述真实相机应该处在什么位置、朝向哪里、使用什么镜头参数。

简单理解:

CinemachineVirtualCamera = 镜头方案 / 虚拟机位 / 相机控制数据

它的主要职责包括:

  • 记录一个镜头的位置和旋转。
  • 提供 Field Of View、Near Clip、Far Clip 等镜头参数。
  • 通过 Priority 决定当前哪个虚拟相机生效。
  • 配合 CinemachineBrain 控制真实 Camera。
  • 提供跟随、看向、阻尼、轨道、噪声、镜头混合等高级镜头功能。

所以,CinemachineVirtualCamera 更像是一个“导演给真实相机下达的镜头指令”。

它本身不是摄影机,真正拍摄画面的仍然是场景中的真实 Camera。

三、CinemachineBrain 的作用

如果场景里只有 CinemachineVirtualCamera,画面不会自动变化。

真正让虚拟相机生效的是 CinemachineBrain。

CinemachineBrain 通常挂在场景中的 Main Camera 上。它会在运行时查找当前优先级最高的 CinemachineVirtualCamera,然后把真实 Main Camera 移动到对应的位置、旋转和镜头参数。

一个常见结构如下:

Main Camera
Camera
CinemachineBrain

Cameras
VCam_Start
CinemachineVirtualCamera

VCam_CloseUp
CinemachineVirtualCamera

VCam_Action
CinemachineVirtualCamera

最终负责渲染的是:

Main Camera 上的 Camera 组件

负责提供镜头数据的是:

VCam_Start、VCam_CloseUp、VCam_Action 上的 CinemachineVirtualCamera

负责把虚拟相机结果应用到真实相机的是:

Main Camera 上的 CinemachineBrain

三者关系可以概括为:

CinemachineVirtualCamera 决定怎么拍。
CinemachineBrain 负责调度。
Camera 负责真正输出画面。

四、为什么 FBX 导入后会多出 Camera

假设美术在 Blender 或 Maya 中制作了一段镜头动画:

角色走到桌前
镜头从远景推到近景
相机带有位移、旋转和 FOV 参数

如果导出的 FBX 文件中包含相机节点,并且 Unity 导入设置中开启了 Import Cameras,Unity 就会把 FBX 里的相机节点转换成 Unity 的 Camera 组件。

这就是导入 FBX 后模型下面出现 Camera 的原因。

这个 Camera 代表的是 DCC 软件中导出的原始相机。它通常包含:

  • 原始相机位置。
  • 原始相机旋转。
  • 原始 FOV 或焦距参数。
  • 可能随 FBX 一起导入的相机 Transform 动画。

这个相机不是没有用。

它的价值在于:可以作为镜头构图、镜头动画和镜头参数的参考。

但如果项目本身已经使用 Cinemachine 管理镜头,一般不建议直接把这个 FBX 自带的 Camera 当作运行时主相机使用。

五、Camera 和 CinemachineVirtualCamera 的核心区别

对比项CameraCinemachineVirtualCamera
是否直接渲染画面 是 否
是否能单独显示 Game 视图画面 是 否
是否需要 CinemachineBrain 不需要 需要
主要职责 输出最终画面 提供虚拟机位和镜头控制数据
常见挂载位置 Main Camera、RenderTexture 相机、UI 相机 普通镜头节点、剧情镜头节点、跟随镜头节点
是否适合大量创建用于切镜头 不太适合 适合
是否参与 Cinemachine 镜头混合 默认不参与 参与

最关键的一句话是:

Camera 负责真正拍摄,CinemachineVirtualCamera 负责告诉 Camera 应该怎么拍。

六、为什么不建议直接启用 FBX 自带 Camera

在使用 Cinemachine 的项目中,默认建议只有一个主要真实相机负责最终画面输出。

这个真实相机通常是:

Main Camera
Camera
CinemachineBrain

其他镜头使用 CinemachineVirtualCamera 来管理。

如果直接启用 FBX 自带的 Camera,容易出现下面几个问题。

1. 多个真实相机同时渲染

场景中可能已经有一个 Main Camera 在渲染。

如果 FBX 自带的 Camera 也启用,那么就会出现多个真实相机同时工作:

Main Camera 在渲染
FBX Camera 也在渲染

这时最终画面可能取决于相机的 Depth、Clear Flags、Culling Mask 和渲染管线设置。

结果可能表现为:

  • Game 视图画面突然变了。
  • 某些模型消失或叠加。
  • 镜头切换逻辑看起来失效。
  • 编辑器预览正常,运行时画面不对。

这些问题排查起来通常比较麻烦。

2. 可能出现多个 AudioListener

真实 Camera 上经常会带有 AudioListener。

如果场景中同时存在多个启用的 AudioListener,Unity 会提示:

There are 2 audio listeners in the scene.
Please ensure there is always exactly one audio listener in the scene.

FBX 导入的相机不一定都会带 AudioListener,但只要项目中复制过相机、替换过预制体或手动添加过组件,就可能出现这个问题。

3. 不参与 Cinemachine 的镜头切换

Cinemachine 的常见用法是通过虚拟相机的 Priority 或代码控制来切换镜头。

例如:

using Cinemachine;
using UnityEngine;

public class CameraSwitcher : MonoBehaviour
{
public CinemachineVirtualCamera closeUpCamera;
public CinemachineVirtualCamera fullShotCamera;

/// <summary>
/// 切换到近景镜头。
/// 通过调整虚拟相机优先级,让 CinemachineBrain 自动选择当前生效的镜头。
/// </summary>
public void SwitchToCloseUp()
{
// 当前要使用的镜头设置为更高优先级
closeUpCamera.Priority = 20;

// 其他镜头降低优先级,避免多个镜头竞争同一个输出结果
fullShotCamera.Priority = 10;
}
}

这段逻辑控制的是 CinemachineVirtualCamera。

如果你启用的是 FBX 自带的真实 Camera,它不会自动参与 Cinemachine 的虚拟相机优先级系统,也不会自动获得 Cinemachine 的镜头混合效果。

4. 后续维护人员难以判断画面来源

项目规模变大后,镜头结构最好保持统一。

如果有的镜头来自 Main Camera + CinemachineVirtualCamera,有的镜头直接来自 FBX 自带 Camera,后续维护人员就很难判断:

当前 Game 视图到底是哪个相机渲染出来的?
这段镜头切换到底是代码控制的,还是 FBX Camera 自己在工作?
为什么调整虚拟相机没有效果?

这种混用方式短期看起来方便,长期会增加调试成本。

七、通用处理方式:把 FBX Camera 转成 CinemachineVirtualCamera

如果项目使用 Cinemachine,导入带相机的 FBX 后,可以按下面方式处理。

1. 保留 FBX 相机的 Transform 和动画数据

FBX 相机的位置、旋转和动画通常是有价值的。

它们可以作为镜头构图和相机动画的来源。

不要一开始就直接删除整个相机节点,除非已经确认不需要它的机位和动画。

2. 禁用或移除 FBX 自带的 Camera 组件

如果这个相机只是普通剧情镜头、操作镜头或过场镜头,一般不需要让它作为真实相机参与渲染。

推荐做法是:

保留 GameObject
保留 Transform
保留 Animator 或 Animation
禁用或移除 Camera 组件

这样可以避免它和 Main Camera 抢画面。

3. 在同一个物体上添加 CinemachineVirtualCamera

在 FBX 相机对应的物体上添加 CinemachineVirtualCamera。

这样这个物体就从“真实渲染相机”变成了“Cinemachine 虚拟机位”。

常见结构可以变成:

Imported_FBX_Camera
Transform
Animator
CinemachineVirtualCamera

这里保留 Animator 的原因是:如果原 FBX 相机带有位置或旋转动画,可以继续让动画驱动这个物体的 Transform。

CinemachineVirtualCamera 再把这个 Transform 作为虚拟机位结果交给 CinemachineBrain。

4. 对齐 Lens 参数

FBX 自带 Camera 中的镜头参数可能和新加的 CinemachineVirtualCamera 不完全一致。

重点检查:

  • Field Of View。
  • Near Clip Plane。
  • Far Clip Plane。
  • Dutch。
  • Lens Shift。

其中最常影响画面观感的是 Field Of View。

如果原始镜头是 35mm、50mm 这类焦距概念,需要注意 Unity 的 FOV 显示方式和 DCC 软件里的相机参数可能不完全一致,最终仍然要以 Game 视图实际构图为准。

5. 让 Main Camera 挂上 CinemachineBrain

虚拟相机能否生效,关键在于真实相机上是否有 CinemachineBrain。

常见结构如下:

Main Camera
Camera
CinemachineBrain

如果 Main Camera 上没有 CinemachineBrain,虚拟相机本身不会驱动画面。

6. 使用 Priority 或脚本切换虚拟相机

如果只是简单切镜头,可以直接调整不同虚拟相机的 Priority。

例如:

using Cinemachine;
using UnityEngine;

public class SimpleCinemachineSwitcher : MonoBehaviour
{
public CinemachineVirtualCamera defaultCamera;
public CinemachineVirtualCamera importedFbxCamera;

/// <summary>
/// 切换到由 FBX 相机转换而来的虚拟镜头。
/// </summary>
public void SwitchToImportedCamera()
{
// 提高目标虚拟相机优先级,使 CinemachineBrain 选择它作为当前镜头
importedFbxCamera.Priority = 20;

// 降低默认镜头优先级,避免两个虚拟相机同时竞争
defaultCamera.Priority = 10;
}
}

实际项目中也可以封装一个相机管理器,用名称、枚举或流程状态来统一切换镜头。

核心原则不是一定要怎么封装,而是保持一个清晰规则:

真实 Camera 只负责输出。
虚拟相机负责镜头变化。
镜头切换统一走 Cinemachine。

八、什么时候可以保留真实 Camera

并不是所有 FBX 自带的 Camera 都必须删除。

下面几种情况可以保留真实 Camera,但需要明确它的用途。

1. 临时对照原始镜头

在编辑器中,可以短时间启用 FBX 自带 Camera,用来对照 DCC 软件里的原始构图。

确认 FOV、位置和旋转后,再把它禁用。

这种情况下它只是参考工具,不建议作为运行时正式镜头。

2. 渲染到 RenderTexture

如果功能明确需要一个额外真实相机,例如:

  • 小地图。
  • 监控屏。
  • 角色头像预览。
  • UI 中的 3D 模型预览窗口。

那么可以保留额外 Camera,并让它输出到 RenderTexture。

这种相机属于独立功能相机,不是普通剧情镜头。

3. 多相机渲染系统

有些项目会刻意设计多个真实相机,例如:

  • UI Camera。
  • Weapon Camera。
  • Portal Camera。
  • Reflection Camera。
  • AR / MR 特殊相机。

这种情况下多个 Camera 是合理的,但需要明确每个相机的职责、渲染层级和输出目标。

不要因为 FBX 自动导入了一个 Camera,就让它无意识地参与主画面渲染。

九、常见错误和排查方式

1. 调整 CinemachineVirtualCamera 后 Game 视图没变化

优先检查:

  • Main Camera 上是否有 CinemachineBrain。
  • 当前虚拟相机的 Priority 是否最高。
  • 是否有其他启用的真实 Camera 正在覆盖画面。
  • 虚拟相机是否被禁用。
  • Timeline 或脚本是否正在控制其他镜头。

2. Game 视图突然变成 FBX 相机视角

优先检查:

  • FBX 自带的 Camera 组件是否启用。
  • 场景中是否存在多个启用的 Camera。
  • 相机的 Depth 是否高于 Main Camera。
  • Target Display 是否设置到了同一个显示目标。

3. 镜头构图和美术软件中不一致

优先检查:

  • FOV 是否一致。
  • 近远裁剪面是否一致。
  • Unity 和 DCC 软件的相机单位、焦距换算是否存在差异。
  • FBX 导入后的 Transform 是否有父物体缩放影响。
  • 动画曲线是否正确导入。

4. 运行时报多个 AudioListener

优先检查:

  • 是否复制了带 AudioListener 的 Camera。
  • FBX 相机或临时相机上是否也有 AudioListener。
  • 场景中是否只保留一个启用的 AudioListener。

通常主场景只需要 Main Camera 上保留一个 AudioListener。

十、推荐的最终结构

对于大多数使用 Cinemachine 的项目,推荐结构如下:

Main Camera
Camera
AudioListener
CinemachineBrain

CameraRoot
VCam_Default
CinemachineVirtualCamera

VCam_CloseUp
CinemachineVirtualCamera

VCam_From_FBX
Animator
CinemachineVirtualCamera

其中:

  • Main Camera 负责最终渲染。
  • CinemachineBrain 负责选择和混合虚拟相机。
  • VCam_Default、VCam_CloseUp、VCam_From_FBX 负责提供不同镜头。
  • 从 FBX 导入的相机节点可以保留 Transform 和动画,但不直接作为真实 Camera 输出画面。

这样做的好处是:

  • 镜头来源清晰。
  • 切镜头逻辑统一。
  • 不容易出现多个真实相机抢画面。
  • 后续扩展新的镜头更方便。
  • 和 Timeline、脚本切镜头、镜头混合都更容易配合。

总结

Camera 和 CinemachineVirtualCamera 的区别可以这样记:

Camera 是真正输出画面的相机。
CinemachineVirtualCamera 是虚拟机位,只提供镜头数据。
CinemachineBrain 是调度者,把虚拟相机结果应用到真实 Camera 上。

当导入 FBX 后出现额外 Camera 组件时,不要急着把它当作正式运行时镜头使用。

更通用、更稳定的做法是:

保留 FBX 相机的 Transform 和动画数据。
禁用或移除 FBX 自带的真实 Camera 组件。
添加 CinemachineVirtualCamera。
让 Main Camera 上的 CinemachineBrain 统一接管镜头输出。

如果这个相机只是普通剧情镜头、操作镜头或过场镜头,优先把它接入 Cinemachine 虚拟相机体系。

如果它是小地图、监控屏、RenderTexture 预览窗口等特殊用途相机,才保留真实 Camera,并明确它的渲染层级、输出目标和使用边界。

一句话总结:

真实 Camera 越少越清晰,虚拟相机越统一越好维护。

赞(0)
未经允许不得转载:171主机测评 » Unity 中 Camera 和 CinemachineVirtualCamera 的区别:导入 FBX 相机后应该怎么处理
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址