首页 > 解决方案 > (C#) 在条件下实例化,否则重用

问题描述

我对编程非常陌生,所以请耐心等待。

public void clickWood()
{
   //Check If The Player Has Gotten Wood Previously
   if(_hasWood == false)
    {

        GameObject newItem = Instantiate(wood_prefab) as GameObject;

        //Initial Displayed Name
        newItem.GetComponent<ButtonSetter>().setName("WOOD: ");

        //Starts with 0 Wood, set to 1
        newItem.GetComponent<ButtonSetter>().item_count += 1;

        newItem.transform.SetParent(GameObject.Find("Content").transform,false);

        //Got their first wood, should run else from now on
        _hasWood = true;
    }
    else
    {
        //SEE CONTINUED POST
    }
}

所以,在 else 语句中,我基本上想说,

他们得到了他们的第一块木材,因此我们创建了一个面板来显示有关他们拥有的木材的信息。现在我想说,既然我们已经实例化了 displayPanel,我们只想从中工作并调整控制“Wood:0”整数部分的对象变量

这应该是

newItem.GetComponent<ButtonSetter>().item_count

但是,如果我尝试在 else 语句中访问它,如图所示:

newItem.GetComponent<ButtonSetter>().item_count += 1;

它告诉我 newItem 在当前上下文中不存在。如何在某些条件下实例化某些东西,然后在满足条件后,获取实例化对象并使用其脚本/变量?

我的问题的可视化表示

标签: c#unity3dinstantiation

解决方案


我认为你需要稍微重构你的代码。

所以这就是我会怎么做

public class Item : MonoBehaviour {
    public string itemName;
    public int count;
}

我将为Item你的游戏中的木头、铁或任何东西创建一个基类。

接下来,我将创建一个处理程序脚本,用于跟踪所有已单击/未单击的项目

处理程序.cs

公共类处理程序:MonoBehaviour {

public Item itemPrefab;

public Dictionary<string, Item> displayItems= new Dictionary<string, Item>();

public void OnWoodClicked()
{
    OnItemClicked("wood");
}

public void OnIronClicked()
{
    OnItemClicked("iron");
}

private void OnItemClicked(string itemKey)
{
    if (displayItems.ContainsKey(itemKey))
    {
        displayItems[itemKey].count++;
    }
    else
    {
        Item item = Instantiate(itemPrefab);
        item.count = 1;
        item.itemName=itemKey;
        displayItems.Add(itemKey, item);

    }
}
}

所以为了跟踪创建的项目,我创建了一个公共字典Dictionary<string, Item> displayItems;

在此脚本OnItemClicked(string itemKey)中,方法将检查是否已创建此类型的项目。(通过检查该密钥是否存在)

如果该项目未创建,那么我们将实例化新Item的(您要显示的显示项目的预制件)并根据其键将其添加到字典中。

但是,如果它已经存在,那么只需随意访问该displayItems[itemKey]对象

因此,例如,如果您单击 Wood,您将可以访问木材展示项目,如displayItems["wood"].

我希望这有帮助。如果您想让我说得更清楚,请发表评论。


推荐阅读