使用脚本在画布中更改TextMeshPro UI文本时出现问题

时间:2019-11-21 18:55:02

标签: c# unity3d

我在从画布中的脚本使用画布中的TextMeshPro更改评分值时遇到问题。我收到NullPointerException错误,因为我感觉我没有正确引用得分文本文件,但是我不确定如何正确处理。 错误

  

NullReferenceException:对象引用未设置为对象的实例   Score.PlayerOneScored()(位于Assets / Scripts / Score.cs:20)

代码

public class Score : MonoBehaviour
{
static int scoreValue1 = 0;
static int scoreValue2 = 0;
private TMP_Text score1;
private TMP_Text score2;

public void PlayerOneScored() {
    Debug.Log("Player One Scored");
    scoreValue1++;

    TMP_Text score1 = GetComponent<TextMeshProUGUI>();
    Debug.Log("P1 Score: " + scoreValue1);
    score1.text = "Score: " + scoreValue1;
    }

public void PlayerTwoScored()
{
    Debug.Log("Player Two Scored");
    scoreValue2++;

    TMP_Text score2 = GetComponent<TMP_Text>();
    Debug.Log("P2 Score: " + scoreValue2);
    score2.text = "Score: " + scoreValue2;
    }
}

第20行是

score1.text = "Score: " + scoreValue1;

层次结构的图片: ScoreCanvas

更新现在就可以使用!这是我最后的课

   using System.Collections;
   using System.Collections.Generic;
   using UnityEngine;
   using UnityEngine.UI;
   using TMPro;

   public class Score : MonoBehaviour
   {
   static int scoreValue1 = 0;
   static int scoreValue2 = 0;
   public TextMeshProUGUI score1;
   public TextMeshProUGUI score2;


void Awake()
{
    score1.text = "Score: " + scoreValue1;
    score2.text = "Score: " + scoreValue2;
}


public void PlayerOneScored() {

    if (scoreValue1 < 10) {
        scoreValue1++;
        Debug.Log("Player One Scored");
        Debug.Log("P1 Score: " + scoreValue1);

        score1.text = "Score: " + scoreValue1;
    }
    else { }
}

public void PlayerTwoScored()
{
    if (scoreValue2 < 10)
    {
        scoreValue2++;
        Debug.Log("Player Two Scored");
        Debug.Log("P2 Score: " + scoreValue2);

        score2.text = "Score: " + scoreValue2;
    }
    else { }
}
}

1 个答案:

答案 0 :(得分:0)

在评论中,您说您的脚本已附加到Canvas GameObject。

但是您正在使用

GetComponent<TextMeshProUGui>();

请注意,GetComponent

  

如果附着了游戏对象,则返回Type类型的组件,否则返回 null

它仅返回与相同 GameObject连接的组件。在您的描述中,情况并非如此。您要获取的组件位于Canvas游戏对象上!


现在如果,只有一个,您可以使用另一种变量,例如GetComponentInChildren ... 但是< / strong>:因为在您的情况下,您有两个不同的人,并且希望能够在它们之间有所区别,所以您不能使用它。.它将始终返回相同的引用。


有多种可能的解决方案,但是我要做的是:完全删除两条GetComponent行,而是通过Unity Inspector设置引用!可以通过在字段public上使用private或在// Now both these fields will appear in the Inspector // so you can simply drag&drop the according GameObjects into the slots [SerializeField] private TextMeshProUGUI score1; public TextMeshProUGUI score2; 上使用[SerializeField]来完成:

score1 = transform.GetChild(0).GetComponemt<TextMeshProUGUI>();

...

score2 = transform.GetChild(1). GetComponent<TextMeshProUGUI>();

另一种选择是在运行时获取相应的子对象(这更容易出错)

CD