Unity+C#拾取物品后图标异常全激活问题求助
问题分析与解决建议
问题根源
你当前的代码存在两个核心问题:
- 未区分当前拾取的物品类型:在
OnTriggerStay中,不管玩家触发的是螺丝刀还是刀具的碰撞体,按下E后都会同时执行两个物品的激活逻辑,导致所有图标一起显示。 - 输入检测逻辑不合理:使用
Input.GetKey会在按住E键的每帧都执行拾取代码,可能引发重复激活的问题。
解决方案
最合理的方式是给每个拾取物品挂载独立的拾取脚本,让每个物品只负责自身的拾取逻辑,避免多个物品的代码互相干扰。
修改后代码示例
创建一个通用的PickupItem脚本,给螺丝刀、刀具分别挂载该脚本,并在Inspector面板中对应赋值:
using UnityEngine; using UnityEngine.UI; public class PickupItem : MonoBehaviour { [Header("拾取配置")] public GameObject carriedItem; // 玩家携带的该物品对象 public RawImage itemIcon; // 对应的屏幕显示图标 public GameObject pickUpText; // 拾取提示文本 void Start() { // 初始化状态:隐藏携带物品、图标和提示文本 carriedItem.SetActive(false); itemIcon.enabled = false; pickUpText.SetActive(false); } private void OnTriggerStay(Collider other) { if (other.CompareTag("Player")) { pickUpText.SetActive(true); // 使用GetKeyDown确保只在按下E的瞬间触发一次拾取 if (Input.GetKeyDown(KeyCode.E)) { // 隐藏当前地面上的物品 gameObject.SetActive(false); // 显示玩家携带的物品和对应图标 carriedItem.SetActive(true); itemIcon.enabled = true; // 隐藏拾取提示 pickUpText.SetActive(false); } } } private void OnTriggerExit(Collider other) { if (other.CompareTag("Player")) { pickUpText.SetActive(false); } } }
关键修改说明
- 模块化设计:每个物品单独管理自身的拾取逻辑,不会出现一个脚本控制多个物品导致的混乱。
- 输入优化:改用
Input.GetKeyDown替代Input.GetKey,确保拾取动作只触发一次,避免按住E重复执行。 - 规范标签检测:使用
CompareTag代替直接比较字符串,性能更优且符合Unity的最佳实践。 - 冗余代码移除:删除了原代码中重复的
gameObject.SetActive(false)调用。
内容的提问来源于stack exchange,提问作者user15365798
相关产品推荐
相关产品推荐

