将脚本放入阵列?

时间:2018-05-29 14:26:28

标签: c# unity3d

我刚开始在Unity编程,但我还不太擅长。 我正在尝试制作一个简单的cookie Clicker游戏并且正在观看this tutorial并且在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);
    }
}

所以我现在要做的就是在这3个对象中访问countlikesPerSecond的变量,并使用foreach循环将它们一起计时。

我面临的问题是我无法从我的新脚本访问这些变量,它基本上试图将所有这些项目脚本存储到一个数组中(至少这是我认为视频正在尝试做的事情)和然后将变量相乘并得到总和。

它给我的错误是:

  

无法将UnityEngine.GameObject []隐式转换为ClicksPerSecondManager []

  

ClickerPerSecondManager []不包含'count'和'LikesPersecond'的定义(可能导致它无法访问对象上的脚本)

我之前在另一个项目中遇到过类似的问题,但它只是一个对象所以我用了

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

但是这次它应该存储在一个数组中,我不知道如何编写它。

2 个答案:

答案 0 :(得分:1)

问题是cps = GameObject.FindGameObjectsWithTag("CPS"); 返回GameObject数组,因此当您使用ForEach时,返回的每个对象都来自类型GameObject,因此您不能只使用foreach(ClicksPerSecondManager item in cps)因为{{1}不包含cps的数组,它包含ClicksPerSecondManager的数组,所以你可以像这样做

GameObject

答案 1 :(得分:0)

所以,你的问题基本上就在这里:

The Problem

您正在迭代数组,但是两个突出显示的部分再次引用数组,而不是数组中的单个项目!请注意,item在循环中完全未使用。

Milad Qasemi也是正确的,FindGameObjectsWithTag返回GameObects数组,所以他的解决方案肯定会有用。我只是想指出存在的逻辑错误,因为你有一个格式正确的foreach声明,只是在它内部执行的操作格式不正确。