Unity:Input.GetButtonDown()内调用SetActive无法执行的问题求助
嘿,我来帮你搞定这个书本交互的问题!看你给出的代码片段,有几个关键的逻辑错误,我一步步给你拆解修复:
问题排查与修复方案
1. 方向向量与角度判断完全搞反了
你现在计算的direction = player.transform.position - this.transform.position,这是书本指向玩家的方向,但我们需要的是玩家指向书本的方向——只有这个方向和玩家的forward做夹角,才能判断玩家是不是在看向书本。
而且你的角度条件写反了:angle >= 160意味着玩家的视线和书本方向的夹角在160°-180°之间,也就是玩家几乎背对着书本,这和你要的“朝向书本”完全相反!正确的逻辑应该是夹角≤20°左右(玩家大致看向书本的范围)。
2. 缺失动作键的输入检测
你的代码里完全没加检测E键或鼠标左键的逻辑!哪怕满足了距离和角度条件,没有触发按键的判断,面板也不会被调用显示。必须加上Input.GetKeyDown(检测按键按下的瞬间,适合单次触发)。
修正后的完整代码示例
// 记得在Inspector里赋值这两个变量 public GameObject player; public GameObject bookPage; void Update () { // 计算玩家到书本的方向向量(从玩家指向书本) Vector3 directionToBook = this.transform.position - player.transform.position; // 计算玩家视线(forward)与书本方向的夹角 float angle = Vector3.Angle(directionToBook, player.transform.forward); // 计算玩家到书本的直线距离 float distance = directionToBook.magnitude; // 满足三个条件:大致朝向书本(夹角≤20°)、距离≤2米、按下动作键 if (angle <= 20f && distance <= 2f) { if (Input.GetKeyDown(KeyCode.E) || Input.GetMouseButtonDown(0)) { // 显示书本UI面板 bookPage.SetActive(true); } } }
额外注意事项
- 如果你用的是第三人称视角,玩家的transform.forward可能和相机视角不一致,这时候应该改用主相机的forward来计算夹角,更符合玩家实际看到的方向:
float angle = Vector3.Angle(directionToBook, Camera.main.transform.forward); - 确保
player和bookPage都已经在Inspector窗口正确关联到对应的对象,且bookPage初始状态是隐藏的(SetActive(false)) - 可以给角度阈值(20°)和距离阈值(2米)设为公开变量,这样不用改代码就能在编辑器里调整交互灵敏度
内容的提问来源于stack exchange,提问作者David Menear
相关产品推荐
相关产品推荐

