Unity从其他游戏对象脚本C#设置UI文本

时间:2017-10-07 14:20:31

标签: c# unity3d unityscript

我有3个不同的脚本。

  • GameController
  • 的PlayerController
  • DestroyOnContact

GameController

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

的PlayerController

public static float score = 0;

DestoyOnContact

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;

产生相同的结果。我错过了什么?

层次:

Hierarchy as requested

1 个答案:

答案 0 :(得分:0)

我建议您不要将文本作为静态类,因为您无法通过检查器进行设置。

而是创建一个公共静态实例GameController。

然后在GameController的Awake方法中设置instance = this;

然后你可以通过说GameController.instance.ScoreText.text来调用那个对象,记住你的ScoreText不应该是静态的。

我把它放在Awake方法中的原因是为了确保它在游戏生命周期的早期设置。

随意提问。