如何调试为什么我的Unity3D游戏不会增加分数?

时间:2017-09-08 22:56:30

标签: c# unity3d singleton instance destroy

我正在与Unity做一些练习。我基本上想要做的是使用gameManager脚本中的单例设计模式。我想提示玩家击中空间,每次都会导致得分增加,每次健康降低,一旦生命值达到0并且立方体被摧毁,金钱就会增加。我想我把一些脚本分配混淆了,或者我不确定如何引用正确的游戏对象。无论出于何种原因,击中空间不会增加分数或降低健康状况。

我有三个文本:得分,健康和金钱,以及场景中间的一个立方体,分配给它的脚本DestroyBySpace。

我有一个分配给gameManager脚本的gameManager空对象

这是游戏管理器的脚本:

private int currentScore;
private int currentHealth;
private int currentMoney;

public Text scoreText;
public Text healthText;
public Text moneyText;

public static GameManager instance;

void Start()
{
    currentScore = 0;
    currentHealth = 20;
    currentMoney = 0;
    updateScore();
    updateMoney();
    updateHealth();
}

void Awake()
{
    instance = this;
}

public void adjustScore(int newScore)
{
    currentScore += newScore;
    updateScore();
}

public void adjustHealthAndMoney(int newHealth, int newMoney)
{
    currentHealth -= newHealth;
    updateHealth();

    if (currentHealth == 0)
    {          
        currentMoney += newMoney;
        updateMoney();
        Destroy(gameObject);
    }
}

void updateScore()
{
    scoreText.text = "Score: " + currentScore;
}

void updateHealth()
{
    healthText.text = "Health: " + currentHealth;
}

void updateMoney()
{
    moneyText.text = "Money: " + currentMoney;
}

这是我的DestroyBySpace脚本:

public int scoreValue;
public int healthValue;
public int moneyValue;
public GameObject target;
public GameManager gameManager;

void Start()
{
    GameObject gameManagerObject = GameObject.FindWithTag("GameManager");

    if (gameManagerObject != null)
    {
        gameManager = gameManagerObject.GetComponent<GameManager>();
    }

    if (gameManager == null)
    {
        Debug.Log("Cannot find Game Manager script");
    }
}

void onTriggerEnter()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        GameManager.instance.adjustHealthAndMoney(healthValue,moneyValue);
        GameManager.instance.adjustScore(scoreValue);
    }
}

如果你能帮我引导我走向正确的方向,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

我认为你已经混淆了monobehavior onTriggerEnter()所做的事情。

当另一个GameObject进入脚本附加到的GameObject的对撞机时,将调用

onTriggerEnter()。这不是检查键盘按下的地方。

您可能想要使用的是Update()单行为。它运行每一帧,因此您可以保证,如果用户按下某个键,该功能将能够看到它。

您的代码看起来像这样:

void Update(){
    if (Input.GetKeyDown(KeyCode.Space))
    {
        GameManager.instance.adjustHealthAndMoney(healthValue,moneyValue);
        GameManager.instance.adjustScore(scoreValue);
    }
}

另外,我认为您在gameObject脚本中Destroy(gameObject)时误解了gameManager所指的内容。 gameObject指的是附加了它所提到的脚本的gameObject。这意味着当您在Destroy(gameObject)脚本中执行gameManager时,您正在销毁其附加到的gameManager脚本的对象。

要摆脱GameObject调用目标,您需要访问它。您可以通过以下几种方式实现这一目标:

1)Destroy(GameObject.Find(“target”));

这会直接搜索名为“target”的GameObject并将其销毁。这样做的缺点是它需要GameObject被称为“目标”,如果有多个GameObjects被称为“目标”,它只会破坏第一个。

2)创建一个公共变量(如public GameObject target)并通过检查器将目标的物理实例存储在其中。然后当你想要销毁它时,只需Destroy(target);

这就是我最有可能做到的。