【问题标题】:How to debug why my Unity3D game does not increase score?如何调试为什么我的 Unity3D 游戏不增加分数?
【发布时间】:2017-09-08 22:56:30
【问题描述】:

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

我收到了 3 个文本:分数、健康和金钱,以及场景中间的一个立方体,以及分配给它的脚本 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);
    }
}

如果您能帮助我朝着正确的方向前进,我将不胜感激。

【问题讨论】:

    标签: c# unity3d singleton instance destroy


    【解决方案1】:

    我认为你混淆了单一行为 onTriggerEnter() 所做的事情。

    onTriggerEnter() 在另一个 GameObject 进入脚本所附加到的 GameObject 的对撞机时被调用。这里不是检查键盘按下的地方。

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

    您的代码将如下所示:

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

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

    要摆脱名为 target 的 GameObject,您需要访问它。您可以通过以下几种方式做到这一点:

    1) 销毁(GameObject.Find("target"));

    这会直接搜索一个名为“target”的游戏对象并销毁它。这样做的缺点是它要求游戏对象被准确地称为“目标”,如果有多个游戏对象称为“目标”,它只会破坏第一个。

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

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

    【讨论】:

    • 它有效。另外,一旦生命值达到 0,我就可以重置生命值,但很快,我就毁掉了游戏管理器。如何摧毁目标?
    • 我不知道你说的摧毁目标是什么意思。此外,单例所做的只是确保在任何时候只有一个脚本实例处于活动状态。当您运行Destroy(gameObject) 时,您正在销毁存在的唯一脚本实例,因此不再有它的实例。单例确保如果您使用附加的脚本初始化另一个游戏对象,则该脚本实例将是该脚本的唯一实例。
    • 我试图在场景视图中销毁一个名为 target 的立方体,我分配了 DestroyBySpace
    • 哦……这很简单。对象gameObject 指的是您所在的脚本所附加到的游戏对象。由于您在gameManager 脚本中使用了Destroy(gameObject),它会破坏gameManager 脚本所附加到的游戏对象。要销毁名为 target 的游戏对象,您需要销毁该游戏对象。你可以这样做的一种方法是通过Destroy(GameObject.Find("target")。但请记住,这取决于游戏对象的名称是否恰好是“目标”。您可以做的另一件事是在 gameManager 中创建一个公共变量并将其设置为目标,然后将其销毁。
    • 我会试试的。我会努力扩展这个项目,当我开始的时候我会问更多的问题。非常感谢。
    猜你喜欢
    • 2017-04-11
    • 2021-11-24
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 2014-01-23
    • 1970-01-01
    相关资源
    最近更新 更多