无法弄清楚如何在一个功能中完成所有这些操作

时间:2017-03-31 08:28:48

标签: c# unity3d

我正在使用C#在Unity 5.4.0f3中创建动物园模拟游戏。我试图产生一个熊预制克隆,做一些数学,等待一段时间,做一些数学,然后在一个函数中销毁克隆对象。这就是我现在所拥有的。我想在WaitForBearLife()中尝试做的数学运算不会发生。提前谢谢!

using UnityEngine;
using System.Collections;

public class BuyBearButton : MonoBehaviour 
{
    [SerializeField] GameManager gameManager;
    [SerializeField] GameObject bearPrefab;
    [SerializeField] Visitor visitor;

    GameObject bearClone;

    float xMin = -15;
    float xMax = 15;
    float yMin = 5;
    float yMax = 6;

    public void BuyBear()
    {
        Vector2 pos = new Vector2 (Random.Range (xMin, xMax), Random.Range (yMin, yMax));

        if (gameManager.myMoney >= gameManager.bearCost) 
        {
            gameManager.numberOfBears++;
            gameManager.myMoney = gameManager.myMoney - gameManager.bearCost;
            visitor.spawnTime = visitor.spawnTime / visitor.bearAttraction;
            bearClone = (GameObject) Instantiate (bearPrefab, pos, transform.rotation);
            StartCoroutine (WaitForBearLife ());
            Destroy (bearClone, gameManager.bearLife);
        }
    }

    IEnumerator WaitForBearLife()
    {
        yield return new WaitForSeconds (gameManager.bearLife);
        visitor.spawnTime = visitor.spawnTime * visitor.bearAttraction;
    }
}

2 个答案:

答案 0 :(得分:1)

您需要将Destroy功能从BuyBear移动到WaitForBearLife

问题是现在StartCouroutine调用立即返回,并且立即调用Destroy()

答案 1 :(得分:0)

我刚刚将您的代码复制到一个空项目中,并为GameManager和Visitor创建了占位符类,只需在此脚本中需要的变量中使用随机值。它工作得很好......真的。所以,我会给你一些问题(因为我还没有在你的帖子中发表评论的声誉......)

首先,熊预制件中有任何类型的脚本吗?

这是因为可能有可能会中断协程的东西。这似乎不太可能,但在你尝试之前你无法确定。

接下来,访客和GameManager的声明如何?

一开始,当您定义类名等时。事实上,我想了解更多关于你使用的变量,比如gameManager.bearLife等。

现在,让我们看看值。

我试过了:

public int myMoney = 50000;
public int bearCost = 50;
public int numberOfBears = 0;
public float bearLife = 2.0f;

在GameManager中。和

public float spawnTime = 5;
public float bearAttraction = 2;

在访客中。它做了一些奇怪的数学运算,我想这个脚本本身的逻辑现在正在开发中。但关键是,它有效,并且有了这个:

IEnumerator WaitForBearLife()
{
    yield return new WaitForSeconds (gameManager.bearLife);
    print (visitor.spawnTime);
    visitor.spawnTime = visitor.spawnTime * visitor.bearAttraction;
    print (visitor.spawnTime);
}

如果我只点击一次,我会在对应的打印件中获得2.5和5。一些印刷品(如@ Benjamin-lecomte所述)可以帮助您了解它是否正在执行该部分。

现在,如果不了解更多,我无法帮助你。所以我会等你的回答。