首次显示UI文本(物品名称)时Camera出现偏移故障求助
首次鼠标悬停物品显示名称时主相机随机跳转的怪异Bug排查方案
问题描述
首次运行游戏时,鼠标悬停物品并显示名称的瞬间,主相机会随机切换到新角度,后续操作完全正常。代码中无相机控制逻辑,重置相机设置后问题仍存在。
负责文本显示的代码
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TMPro; public class SelectionManager : MonoBehaviour { public static SelectionManager Instance {get; set;} public GameObject interaction_Info_UI; TextMeshProUGUI interaction_text; public bool onTarget; public GameObject selectedObject; private void Start() { interaction_text = interaction_Info_UI.GetComponent<TextMeshProUGUI>(); onTarget = false; } private void Awake() { if(Instance != null && Instance != this) { Destroy(gameObject); } else { Instance = this; } } void Update() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { var selectionTransform = hit.transform; InteractableObject interactable = selectionTransform.GetComponent<InteractableObject>(); if (interactable && interactable.playerInRange) { interaction_text.text = interactable.GetItemName(); interaction_Info_UI.SetActive(true); onTarget = true; selectedObject = interactable.gameObject; } else { interaction_Info_UI.SetActive(false); onTarget = false; } } else { interaction_Info_UI.SetActive(false); onTarget = false; } } }
排查方向
- 检查InteractableObject脚本逻辑:重点排查
GetItemName()方法、playerInRange属性的赋值逻辑,以及该脚本的Awake/Start/OnEnable等生命周期方法,看是否存在意外修改主相机Transform、触发动画或协程影响相机的代码。同时确认相机是否被误设为该物品的子物体。 - 检查Unity编辑器设置:
- 查看主相机是否挂载Animator/Animation组件,是否有默认播放的动画片段在UI激活时触发;
- 检查相机父物体是否有刚体、动画或其他脚本在首次运行时移动,带动相机位置/旋转变化;
- 排查EventSystem是否存在绑定错误的事件,导致UI激活时误操作相机;
- 确认射线检测的碰撞层,是否误检测到带有特殊逻辑的物体触发意外行为。
- 代码隐性问题排查:
- 检查
interaction_Info_UI是否挂载其他脚本,首次激活时是否执行了相机控制逻辑; - 修复
Camera.main的缓存问题:首次调用Camera.main会查找场景中带MainCamera标签的物体,若场景中有多个该标签物体可能导致相机对象切换。建议在Start方法中提前缓存相机:
后续Update中使用private Camera mainCam; private void Start() { mainCam = Camera.main; interaction_text = interaction_Info_UI.GetComponent<TextMeshProUGUI>(); onTarget = false; }mainCam.ScreenPointToRay(Input.mousePosition)替代直接调用Camera.main。
- 检查
- 调试技巧:
- 在相机Transform组件上添加调试日志,或在相机位置/旋转变化时打断点,通过调用栈定位修改相机的源头;
- 临时注释掉
interaction_Info_UI.SetActive(true)和interaction_text.text赋值代码,验证是否是UI激活触发的问题; - 新建干净测试场景,逐步添加元素,排查是否是场景其他元素的冲突导致。
内容的提问来源于stack exchange,提问作者BunHead
相关产品推荐
相关产品推荐

