(C#) 在条件下实例化,否则重用

(C#) Instantiated Under Conditions, Else Reuse

我对编程非常陌生,所以请多多包涵。

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。 如何在特定条件下实例化某些东西,然后在满足条件后,获取实例化对象并使用其 script/variables?

Visual representation of my issue

按照目前的写法,newItem 仅存在于代码的 "IF" 子句中,因此 "ELSE" 子句看不到它。

如果您将它分配给 class 级别的字段(就像您在 class 级别分配了 _hasWood 一样)那么您将能够在 "IF" 或 "ELSE" 块,并在调用对象 "clickWood()" 的生命周期内维护计数。

private bool _hasWood;
private GameObject _woodItem;

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

        _woodItem= Instantiate(wood_prefab) as GameObject;

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

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

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

        //Got their first wood, should run else from now on
        _hasWood = true;
    }
    else
    {
        _woodItem.GetComponent<ButtonSetter>().item_count += 1;
    }
}

我认为您需要稍微重构一下代码。

这就是我的做法

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

我将创建一个底座 class Item 用于木头、铁或您游戏中的任何东西。

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

Handler.cs

public class 处理程序: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);

    }
}
}

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

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

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

但是如果它已经存在,那么只要你喜欢displayItems[itemKey]就可以访问那个对象

例如,如果您点击木材,您将获得木材显示项目 displayItems["wood"]

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