前言
在 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 的核心区别
| 是否直接渲染画面 | 是 | 否 |
| 是否能单独显示 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 越少越清晰,虚拟相机越统一越好维护。


