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

Unity+C#拾取物品后图标异常全激活问题求助

问题分析与解决建议

问题根源

你当前的代码存在两个核心问题:

  1. 未区分当前拾取的物品类型:在OnTriggerStay中,不管玩家触发的是螺丝刀还是刀具的碰撞体,按下E后都会同时执行两个物品的激活逻辑,导致所有图标一起显示。
  2. 输入检测逻辑不合理:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:33:21