Unity射线触发显示弹道后无法关闭的技术求助
问题修复方案
核心问题分析
- 变量命名冲突:
GameObject是Unity内置关键字,用作自定义变量会导致逻辑异常 - 输入判断逻辑颠倒:当前代码在未按下E键时激活轨迹,按下时反而关闭,与需求完全相反
- 状态变量
activatedObject未正确更新:无法记录轨迹激活状态,导致重复判断失效 - 未处理射线未击中弹孔的场景:移开视线后轨迹仍保持激活
- 内部方法
SetFalse未被调用,完全无效
修改后的完整代码
public class Trajectory : MonoBehaviour { public Camera camera; public float ray_Range = 5f; public KeyCode interact = KeyCode.E; public GameObject interactUI; // 重命名变量避免与内置关键字冲突 public GameObject trajectoryObject; // 记录轨迹当前激活状态 private bool isTrajectoryActive = false; void Start() { trajectoryObject.SetActive(false); interactUI.SetActive(false); } void Update() { Ray ray_Cast = camera.ScreenPointToRay(new Vector2(Screen.width / 2, Screen.height / 2)); RaycastHit ray_Hit; bool isLookingAtTrigger = Physics.Raycast(ray_Cast, out ray_Hit, ray_Range) && ray_Hit.collider.CompareTag("Trigger"); // 更新交互UI显示 interactUI.SetActive(isLookingAtTrigger); // 按下E键切换轨迹显示状态 if (Input.GetKeyDown(interact)) { // 允许在看向弹孔时切换,或已激活轨迹时关闭 if (isLookingAtTrigger || isTrajectoryActive) { isTrajectoryActive = !isTrajectoryActive; trajectoryObject.SetActive(isTrajectoryActive); } } // 可选:移开视线时自动关闭轨迹 if (!isLookingAtTrigger && isTrajectoryActive) { isTrajectoryActive = false; trajectoryObject.SetActive(false); } } }
关键修改说明
- 变量重命名:将
GameObject改为trajectoryObject,规避Unity内置关键字冲突 - 逻辑修正:
- 用
isLookingAtTrigger统一判断是否看向弹孔,简化嵌套逻辑 - 按下E键时切换轨迹激活状态,符合"按E显示/关闭"的需求
- 用
- 状态管理:用
isTrajectoryActive准确记录轨迹状态,确保切换逻辑可靠 - 场景补全:添加移开视线自动关闭轨迹的逻辑(可根据需求选择保留或删除)
- 冗余清理:移除未被调用的
SetFalse方法,精简代码结构
内容的提问来源于stack exchange,提问作者Sey Maple
相关产品推荐
相关产品推荐

