(C #) Установлено в условиях, остальное повторное использование - PullRequest
0 голосов
/ 28 ноября 2018

Я чрезвычайно новичок в программировании, так что терпите меня.

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 не существует в текущем контексте.Как я могу создать что-то в определенных условиях, а затем, после выполнения условия, взять экземпляр объекта и работать с его сценарием / переменными?

Визуальное представление моей проблемы

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Я думаю, вам нужно немного реструктурировать свой код.

Итак, вот как я бы это сделал

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

Я создам базовый класс Item для дерева, железаили что-то еще в вашей игре.

Далее я создам скрипт-обработчик, который отслеживает все элементы, которые были нажаты / не нажаты

Handler.cs

Public Class Handler: 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"].

Надеюсь, это поможет.Просто оставьте комментарий, если хотите, чтобы я прояснил ситуацию.

0 голосов
/ 28 ноября 2018

Как написано в настоящее время, newItem живет только в условии «IF» кода, поэтому предложение «ELSE» не может его увидеть.

Если вы назначаете его полю уровня класса (похоже, у вас есть _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;
    }
}
...