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

如何在其他脚本中引用已创建的物品Dictionary实例?

嘿,我来帮你搞定这个问题!要在其他脚本里访问那个itemsDictionary,有几种常用的方法,我一个个给你说清楚:

方法1:使用单例模式(全局场景首选)

如果这个物品字典是整个项目里唯一的全局存储,单例模式是最常用的方案。它能确保你在任何脚本里都能轻松访问到同一个字典实例。

首先修改你的物品管理类(假设你用的是Unity,非Unity场景可以去掉MonoBehaviour):

public class ItemManager : MonoBehaviour
{
    // 公开的单例实例,全局唯一
    public static ItemManager Instance { get; private set; }

    // 你的物品字典
    public Dictionary<string, Item> itemsDictionary = new Dictionary<string, Item>();

    private void Awake()
    {
        // 确保只有一个单例实例
        if (Instance != null && Instance != this)
        {
            Destroy(this);
        }
        else
        {
            Instance = this;
        }

        // 在这里初始化物品并添加到字典
        Item Emspada = new Item
        {
            ID = 1,
            name = "Emspada"
        };
        itemsDictionary.Add(Emspada.name, Emspada);
    }
}

然后在其他脚本里这样访问:

public class OtherScript : MonoBehaviour
{
    private void Start()
    {
        // 直接通过单例访问字典
        if (ItemManager.Instance.itemsDictionary.TryGetValue("Emspada", out Item foundItem))
        {
            Debug.Log($"找到物品:{foundItem.name},ID:{foundItem.ID}");
        }
        else
        {
            Debug.Log("没找到这个物品哦");
        }
    }
}
方法2:使用静态字典(无实例场景)

如果你的物品存储不需要实例化对象,直接把字典做成静态成员更简单,适合纯数据存储的场景:

// 静态类,不需要实例化
public static class ItemDatabase
{
    // 静态字典,全局可访问
    public static Dictionary<string, Item> itemsDictionary = new Dictionary<string, Item>();

    // 静态构造函数,自动初始化数据
    static ItemDatabase()
    {
        Item Emspada = new Item
        {
            ID = 1,
            name = "Emspada"
        };
        itemsDictionary.Add(Emspada.name, Emspada);
    }
}

其他脚本里直接访问:

// 不需要任何实例,直接用类名调用
if (ItemDatabase.itemsDictionary.TryGetValue("Emspada", out Item item))
{
    // 处理找到的物品
}
方法3:通过引用传递(局部场景)

如果只是在特定的几个脚本之间共享字典,可以通过引用传递的方式,适合不需要全局访问的场景:

首先是拥有字典的脚本:

public class ItemHolder : MonoBehaviour
{
    public Dictionary<string, Item> itemsDictionary = new Dictionary<string, Item>();

    private void Start()
    {
        Item Emspada = new Item
        {
            ID = 1,
            name = "Emspada"
        };
        itemsDictionary.Add(Emspada.name, Emspada);
    }
}

然后在需要访问的脚本里添加引用字段,在编辑器里拖入对应的ItemHolder对象:

public class OtherScript : MonoBehaviour
{
    // 在Unity编辑器里把ItemHolder对象拖到这个字段上
    public ItemHolder itemHolder;

    private void Start()
    {
        if (itemHolder != null && itemHolder.itemsDictionary.TryGetValue("Emspada", out Item foundItem))
        {
            Debug.Log(foundItem.name);
        }
    }
}

重要提示:不管用哪种方法,访问字典时都建议用TryGetValue而不是直接用索引(比如dict["Emspada"]),这样能避免因键不存在而抛出的异常,让代码更健壮。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:23:52