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

Unity中基于收集物品触发功能的C#实现问题求助

物品收集计数问题解决方案

我需要实现收集齐指定物品后触发特定功能的逻辑,当前代码用于拾取螺丝刀、刀具这类物品,要求收集满2件时触发功能。但添加的计数器仅会计数一次,无法累计所有拾取的物品数量。

问题原因

你的问题出在每个物品对象都挂载了独立的PicUpTools脚本,每个脚本里的counter都是各自独立的局部变量。拾取第一个物品时,该物品脚本的counter变成1;拾取第二个物品时,是另一个脚本的counter变成1,永远达不到2的条件。


解决方案

方案一:使用静态变量共享计数

把counter改成静态变量,让所有该脚本的实例共享同一个数值:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PicUpTools : MonoBehaviour
{
    public GameObject objectWithPlayer, PicUpText;
    public RawImage objectRawImage;
    // 改成静态变量,所有实例共享计数
    private static int counter = 0;

    void Start()
    {
        objectWithPlayer.SetActive(false);
        objectRawImage.enabled = false;
        PicUpText.SetActive(false);
    }

    private void OnTriggerStay(Collider other)
    {
        if (other.gameObject.tag == "Player")
        {
            PicUpText.SetActive(true);
            // 改用GetKeyDown,避免按住E重复触发拾取
            if (Input.GetKeyDown(KeyCode.E))
            {
                gameObject.SetActive(false);
                objectWithPlayer.SetActive(true);
                objectRawImage.enabled = true;
                counter++;
                PicUpText.SetActive(false);

                if (counter == 2)
                {
                    Debug.Log("所有物品收集完成");
                    // 在这里添加触发的特定功能逻辑
                }
            }
        }
    }

    private void OnTriggerExit(Collider other)
    {
        PicUpText.SetActive(false);
    }
}

方案二:使用专门的物品管理器(更推荐)

创建独立的管理器脚本统一处理计数,这种方式更利于后续扩展:

  1. 创建ItemCollectionManager脚本:
using UnityEngine;

public class ItemCollectionManager : MonoBehaviour
{
    public static ItemCollectionManager Instance;
    public int collectedItems = 0;
    public int requiredItems = 2; // 需要收集的物品总数

    void Awake()
    {
        // 单例模式,确保全局只有一个管理器实例
        if (Instance == null)
            Instance = this;
        else
            Destroy(gameObject);
    }

    // 外部调用此方法增加计数
    public void AddCollectedItem()
    {
        collectedItems++;
        CheckCollectionComplete();
    }

    // 检查是否收集完成
    private void CheckCollectionComplete()
    {
        if (collectedItems >= requiredItems)
        {
            Debug.Log("所有物品收集完成");
            // 在这里添加触发的特定功能逻辑
        }
    }
}
  1. 修改原PicUpTools脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PicUpTools : MonoBehaviour
{
    public GameObject objectWithPlayer, PicUpText;
    public RawImage objectRawImage;

    void Start()
    {
        objectWithPlayer.SetActive(false);
        objectRawImage.enabled = false;
        PicUpText.SetActive(false);
    }

    private void OnTriggerStay(Collider other)
    {
        if (other.gameObject.tag == "Player")
        {
            PicUpText.SetActive(true);
            if (Input.GetKeyDown(KeyCode.E))
            {
                gameObject.SetActive(false);
                objectWithPlayer.SetActive(true);
                objectRawImage.enabled = true;
                PicUpText.SetActive(false);

                // 调用管理器的方法统一计数
                ItemCollectionManager.Instance.AddCollectedItem();
            }
        }
    }

    private void OnTriggerExit(Collider other)
    {
        PicUpText.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 10:37:10