Unity 6.3 中切换检查相机后为何没有画面?
结论
从代码看,切换逻辑会尝试启用 inspectionCamera。如果玩家相机已关闭,但检查相机没有画面,先确认 inspectionCamera 已在 Inspector 中赋值、对应的 GameObject 已激活,并且相机输出到 Display 1。仅凭这段代码和现有信息,无法判断具体是哪项设置导致问题。
有一种情况可能直接导致黑屏:执行 playerCamera.enabled = false 后,如果 inspectionCamera 未赋值,下一行访问 inspectionCamera.enabled 时会触发 NullReferenceException,检查相机也就无法启用。
先检查相机引用与激活状态
在 Inspector 中确认 InspectionSystem 的 Player Camera 和 Inspection Camera 字段都已赋值。playerCamera 通过 Camera.main 获取,因此玩家相机还需要带有 MainCamera 标签。缺少这个标签时,Camera.main 会返回 null。
同时确认检查相机所在的 GameObject 已激活。Camera.enabled = true 只会启用相机组件,不会激活整个 GameObject。GameObject 处于禁用状态时,相机无法渲染。
可以在切换前检查引用和激活状态,避免关闭玩家相机后才发现检查相机不可用:
void StartInspection(InspectableItem item)
{
if (playerCamera == null || inspectionCamera == null)
{
Debug.LogError("Player Camera 或 Inspection Camera 未赋值。", this);
return;
}
if (!inspectionCamera.gameObject.activeInHierarchy)
{
Debug.LogError("Inspection Camera 所在的 GameObject 未激活。", this);
return;
}
// 其余检查逻辑……
playerCamera.enabled = false;
inspectionCamera.enabled = true;
}
检查相机的渲染设置
逐项确认以下设置:
Target Display与 Game 视图当前显示的屏幕一致,通常是Display 1。Target Texture没有指向其他 Render Texture。设置后,画面会输出到该纹理,而不会直接显示在 Game 视图中。Culling Mask包含检查物品所在的 Layer。- 物品位于相机的
Near和Far裁剪范围内。 - 检查相机朝向物品,物品没有位于相机背后。
inspectionPoint和物品的 Transform 位置符合预期。
可以暂时关闭玩家相机,单独启用检查相机,然后在 Scene 视图中选中它并观察视锥。如果仍然没有画面,查看 Console 是否出现空引用异常或其他运行时错误。
检查物品的位置计算
代码将检查点放在相机位置加上固定的世界坐标偏移:
inspectionPoint.transform.position =
inspectionCamera.transform.position + new Vector3(0, 0, -1.5f);
这个偏移始终沿世界 Z 轴,方向不一定是相机前方。随后,代码又把物品的本地位置设为 z = inspectionDistance。如果检查点的位置或旋转不合适,物品可能会落在相机视野之外。若要沿相机朝向放置检查点,可以根据相机的 forward 计算:
inspectionPoint.position =
inspectionCamera.transform.position + inspectionCamera.transform.forward * 1.5f;
inspectionPoint.rotation = inspectionCamera.transform.rotation;
如果检查相机朝向检查点,而物品设置为正的本地 Z 距离,也要确认物品最终位于相机前方。可以在运行时检查物品的世界坐标,或暂时把物品放到相机前方的固定距离,以排查位置问题。
Canvas 与相机画面的层级
如果变暗的 Canvas 使用 Screen Space - Overlay,它会显示在相机画面上方。全屏不透明面板可能会遮住检查物品。若要让相机画面显示在暗化面板上方,可以改用 Screen Space - Camera 并指定对应相机,也可以调整 Canvas 的渲染模式和层级。
代码中的滚轮逻辑允许距离增加到 5,但 SetInspectionDistance 会将距离限制在 3。两个范围不一致会影响检查距离,但本身不会导致相机没有渲染。
备注:内容仅供参考。
