我有3个不同的脚本。
public class GameController : MonoBehaviour {
public static Text scoreText;
void Start()
{
StartCoroutine(SpawnWaves());
}
IEnumerator SpawnWaves()
{
yield return new WaitForSeconds(startWait);
while(true)
{
Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x, spawnValues.x), spawnValues.y, spawnValues.z);
Quaternion spawnRotation = Quaternion.identity;
Instantiate(hazardSmall, spawnPosition, spawnRotation);
//SpawnHazard();
yield return new WaitForSeconds(spawnWait);
}
}
public static float score = 0;
void OnTriggerEnter(Collider other)
{
if (other.tag == "PlayerBolt")
{
PlayerController.score++;
Debug.Log(PlayerController.score);
GameController.scoreText.text = "Score: " + PlayerController.score;
Debug.Log(GameController.scoreText.text);
}
Destroy(other.gameObject);
Destroy(gameObject);
当我运行游戏并拍摄使用DestroyOnContact脚本的对象时,PlayerController.score ++可以工作,我已经调试过了。但是试图在GameController中设置scoreText是行不通的。这导致玩家射击和射击对象都不会被破坏。
我得到例外:
NullReferenceException:未将对象引用设置为对象的实例
GameObject gogc = GameObject.Find("GameController");
GameController gc = (GameController)gogc.GetComponent(typeof(GameController));
其次是:
gc.scoreText.text = "Score: " + PlayerController.score;
产生相同的结果。我错过了什么?
层次:
答案 0 :(得分:0)
我建议您不要将文本作为静态类,因为您无法通过检查器进行设置。
而是创建一个公共静态实例GameController。
然后在GameController的Awake方法中设置instance = this;
然后你可以通过说GameController.instance.ScoreText.text来调用那个对象,记住你的ScoreText不应该是静态的。
我把它放在Awake方法中的原因是为了确保它在游戏生命周期的早期设置。
随意提问。