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

Unity 2021.3.13f1库存系统代码报错修复求助

Unity库存系统编译错误修复

错误详情

  • 错误1:

    Assets\Scripts\InventoryScripts\InventorySystem.cs(31,33): error CS1579: foreach语句无法操作InventorySlot类型变量,因为该类型未包含GetEnumerator的公共实例或扩展定义

  • 错误2:

    Assets\Scripts\InventoryScripts\InventorySystem.cs(55,19): error CS0029: 无法将类型'System.Collections.Generic.List'隐式转换为'InventorySlot'

修复方案

错误2修复(类型不匹配)

ContainsItem方法中,Where查询返回的是符合条件的槽位列表,但方法输出参数要求单个InventorySlot实例。将ToList()替换为FirstOrDefault(),直接获取第一个匹配的槽位,即可解决类型不匹配问题。

错误1修复(foreach遍历错误)

AddToInventory方法中,invSlot是单个InventorySlot实例,不能用foreach遍历。直接检查该槽位是否有剩余堆叠空间,执行添加逻辑即可。

修复后的InventorySystem代码

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Events;

[System.Serializable]
public class InventorySystem
{
    [SerializeField] private List<InventorySlot> inventorySlots;

    public int InventorySize => InventorySlots.Count;
    public List<InventorySlot> InventorySlots => inventorySlots;

    public UnityAction<InventorySlot> OnInventorySlotChanged;

    public InventorySystem(int size)
    {
        inventorySlots = new List<InventorySlot>(size);

        for(int i = 0; i < size; i++) 
        {
            inventorySlots.Add(new InventorySlot());
        }
    }

    public bool AddToInventory(InventoryItemData itemToAdd, int amountToAdd)
    {
        if(ContainsItem(itemToAdd, out InventorySlot invSlot))
        {
            // 直接检查单个槽位的剩余堆叠空间
            if(invSlot.RoomLeftInStack(amountToAdd))
            {
                invSlot.AddToStack(amountToAdd);
                OnInventorySlotChanged?.Invoke(invSlot);
                return true;
            }
        }

        if(HasFreeSlot(out InventorySlot freeSlot))
        {
            freeSlot.UpdateInvSlot(itemToAdd, amountToAdd);
            OnInventorySlotChanged?.Invoke(freeSlot);
            return true;
        }
        
        return false;
    }

    public bool ContainsItem(InventoryItemData itemToAdd, out InventorySlot invSlot)
    {
        // 获取第一个匹配的物品槽位,替代列表返回
        invSlot = InventorySlots.FirstOrDefault(i => i.ItemData == itemToAdd);
        return invSlot != null;
    }

    public bool HasFreeSlot(out InventorySlot freeSlot)
    {
        freeSlot = InventorySlots.FirstOrDefault(i => i.ItemData == null);
        return freeSlot != null;
    }
}

其他脚本说明

InventoryHolder和InventorySlot脚本无需修改,保持原代码即可正常配合使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:10:20