You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity手电筒拾取脚本偶尔失效,求助排查与修复方法

解决Unity手电筒拾取脚本偶尔失效的问题

核心问题分析与修复

你的脚本偶尔失效的主要原因是使用Input.GetKey检测按键,配合OnTriggerStay的帧调用机制会导致检测不稳定——如果玩家快速按下E键,可能刚好错过OnTriggerStay执行的帧,导致拾取逻辑不触发。

修复步骤

  1. 替换按键检测方式
    将Input.GetKey(KeyCode.E)改为Input.GetKeyDown(KeyCode.E),GetKeyDown只会在按键按下的第一帧触发,能确保单次按键的准确检测。修改后的代码:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PickUp : Interactable
    {
        public GameObject FlashLightOnPlayer;
    
        void Start()
        {
            // 空引用防护,避免初始化报错
            if(FlashLightOnPlayer != null)
                FlashLightOnPlayer.SetActive(false);
        }
        
        private void OnTriggerStay(Collider other) 
        { 
            if (other.CompareTag("Player")) // 用CompareTag比直接访问Tag性能更好
            {
                if(Input.GetKeyDown(KeyCode.E))
                {
                    this.gameObject.SetActive(false);
                    if(FlashLightOnPlayer != null)
                        FlashLightOnPlayer.SetActive(true);
                }
            }
        }
    }
    
  2. 检查触发器与碰撞体设置

    • 拾取对象(Flashlight)的碰撞体必须勾选Is Trigger选项
    • Player对象必须添加非运动学的Rigidbody(如果用CharacterController,确保其Trigger Detection设置正确)
    • 打开Edit > Project Settings > Physics,检查层碰撞矩阵,确保Player所在层和拾取对象所在层的触发碰撞是启用状态
  3. 排查父类Interactable的冲突
    检查你继承的Interactable类,如果该类也实现了OnTriggerStay、OnTriggerEnter等触发方法,可能会和当前脚本的逻辑冲突,确保父类方法没有覆盖或干扰子类的触发检测。

  4. 验证对象引用正确性
    在Inspector面板中确认FlashLightOnPlayer已经正确拖入Player的子对象Flashlight(1),避免空引用导致逻辑不执行。

内容的提问来源于stack exchange,提问作者Shaormentiul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:32:21