我在从画布中的脚本使用画布中的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 { }
}
}
答案 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