Помещение скриптов в массив? - PullRequest
0 голосов
/ 29 мая 2018

Я только начал программировать в Unity и пока не очень хорош в этом.Я пытаюсь сделать простую игру для кликеров с использованием cookie, и смотрел этот урок , и примерно в 18:34 он записал какой-то код, как показано ниже.Я думаю, что его код устарел, и Unity не работает, как раньше (хотя я не уверен).

Его код

public Text Gps;
public Click click;
public ItemManager[] items;
public int getGoldPerSecond()
{
    int tick=0;
    foreach(ItemManager item in items)
    {
        tick +=item.count * item.tickvalue;
    }
}

Мой код:

public Text LPS;
public MainButton mb; //same as his Click click script
public ClicksPerSecondManager[] cps;

// Use this for initialization
void Start () 
{
    cps = GameObject.FindGameObjectsWithTag("CPS");
}

public int getLikesPerSecond()
{
    int tick = 0;
    foreach(ClicksPerSecondManager item in cps)
    {
        tick += cps.count * cps.LikesPersecond;
    }
    return tick;
}

Я знаю, что код не может получить доступ к переменным или что-то в этом роде.Кто-нибудь, пожалуйста, объясните мне, как хранить объекты в массиве.

Здесь происходит то, что у меня есть магазин, и в нем 3 предмета.Это сценарий, прикрепленный к 3 элементам

public Text itemDesc;
MainButton mainButton;
public float cost;
public int LikesPerSecond;
public int count;
public string itemName;
private float baseCost;
public GameObject sucessfulPurchase;
public GameObject failedPurchase;
public Image Panel;


// Use this for initialization
void Start () {
    baseCost = cost;
  mainButton = GameObject.FindGameObjectWithTag("Player").GetComponent<MainButton>();

}

// Update is called once per frame
void Update () {
    itemDesc.text =itemName+ "\nCost : "+cost+"\nLPS : "+LikesPerSecond   ;
}

public void purchasedItem()
{
    if (mainButton.noOfLikes >= this.cost)
    {
        mainButton.noOfLikes -= cost; //minus away cost
        count += 1;  
        cost = Mathf.Round(baseCost * Mathf.Pow(1.15f, count));
        sucessfulPurchase.gameObject.SetActive(true);
        StartCoroutine(WaitFor1Second());
    }
    else if (mainButton.noOfLikes < cost)
    {
        failedPurchase.gameObject.SetActive(true);
        StartCoroutine(WaitFor1Second());
    }
}

IEnumerator WaitFor1Second()
{
    yield return new WaitForSeconds(1);
    if (failedPurchase.activeSelf == true)
    {
        failedPurchase.SetActive(false);
    }
    else if (sucessfulPurchase.activeSelf == true)
    {
        sucessfulPurchase.gameObject.SetActive(false);
    }
}

Итак, я пытаюсь сейчас получить доступ к переменным count и likesPerSecond в этих 3 объектах и ​​умножить их все вместе, используяцикл foreach.

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

Я получаю следующие ошибки:

Невозможно неявно преобразовать UnityEngine.GameObject [] в ClicksPerSecondManager []

и

ClickerPerSecondManager [] не содержит определения для «count» и «LikesPersecond» (возможно, из-за того, что он не может получить доступ к сценарию на объекте)

Я сталкивался с подобной проблемой раньше в другом проекте, однако это был один объект, поэтому я использовал

public Playerhealth hp;
hp = gameObject.FindObjectWithTag("Player").getComponent<PlayerHealth>();

Однако на этот раз он долженхраниться в массиве, и я понятия не имею, как написать это.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Итак, ваша проблема, по сути, заключается здесь:

The Problem

Вы правильно перебираете массив, но две выделенные части, на которые вы ссылаетесь массив опять же, а не один элемент в массиве!Обратите внимание, что item полностью не используется в вашем цикле.

Милад Касеми также прав в том, что FindGameObjectsWithTag возвращает массив GameObects, поэтому его решение определенно будет работать.Я просто хотел указать на присутствующую логическую ошибку, поскольку у вас было правильно отформатированное объявление foreach, просто что действие, выполняемое внутри него, было искажено.

0 голосов
/ 29 мая 2018

проблема в том, что cps = GameObject.FindGameObjectsWithTag("CPS"); возвращает массив GameObject, поэтому при использовании ForEach каждый возвращаемый объект будет иметь тип GameObject, поэтому вы не можете просто использовать foreach(ClicksPerSecondManager item in cps), потому что cps не содержит массив ClicksPerSecondManager, он содержит массив GameObject, поэтому вы можете сделать это следующим образом

foreach(GameObject item in cps){
    ClicksPerSecondManager cpsm = item.getComponent<ClicksPerSecondManager>(); 
    //now you have access to its public properties or methods
    Debug.log(cpsm.count);
    //etc
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...