簡體   English   中英

如何調試為什么我的Unity3D游戲不增加得分?

[英]How to debug why my Unity3D game does not increase score?

我正在與Unity一起練習。 我基本上想做的是使用gameManager腳本中的單例設計模式。 我想提示玩家擊中空格,使得分每次增加,每次降低生命值,並且當生命值達到0且魔方被破壞時金錢增加。 我想我有些腳本分配錯了,或者我不確定如何引用正確的游戲對象。 無論出於何種原因,擊中空格都不會增加得分或降低健康狀況。

我得到了3個文本:得分,健康狀況和金錢,以及場景中間的一個立方體,並為其分配了腳本DestroyBySpace。

我有一個分配給gameManager腳本的gameManager空對象

這是Game Manager的腳本:

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);
    }
}

如果您能引導我朝正確的方向發展,我將不勝感激。

我認為您已經混淆了onTriggerEnter()行為。

當另一個GameObject進入腳本附加到的onTriggerEnter()的碰撞器時,將調用onTriggerEnter() 這里不是檢查鍵盤按鍵的地方。

您可能要使用的是Update()行為。 它每幀運行一次,因此可以確保如果用戶按下某個鍵,該功能將能夠看到它。

您的代碼如下所示:

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

另外,我認為您在gameManager腳本中執行Destroy(gameObject)時誤解了gameObject指的是什么。 gameObject指的是附加了腳本的gameObject。 這意味着當您在gameManager腳本中執行Destroy(gameObject) ,您將銷毀其附加到gameManager腳本的對象。

要擺脫稱為目標的GameObject,您需要訪問它。 您可以通過以下幾種方法來做到這一點:

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

這將直接搜索稱為“目標”的GameObject並將其銷毀。 不利的一面是,它要求將GameObject精確地稱為“目標”,如果有多個稱為“ target”的GameObject,則只會銷毀第一個。

2)創建一個公共變量(如public GameObject target ),並通過檢查器將目標的物理實例存儲在其中。 然后,當您想銷毀它時,只需執行Destroy(target)

這就是我最有可能這樣做的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM