1

我正在 unity3d 中创建一个简单的数字猜谜游戏。

我想在按钮单击时打开一个新场景,并从当前场景更改加载场景中存在的文本元素的文本。

我已经能够在按钮单击时打开新场景,但是如何访问其他场景中的文本元素,以便我可以从当前场景更改其文本。这是我到目前为止所拥有的,但它显然会抛出NullReferenceException,因为我无法从当前场景访问另一个场景中的文本元素。

SceneManager.LoadScene("End Scene");
gameResultText.text = "You Won!!";        //<-------this line throws the exception
gameResultText.color = Color.green;
4

2 回答 2

0

我不相信有一种方法可以修改当前未打开的场景的上下文或对象。

public class GameResults {
   public static string finalText = "";
}

在加载场景的函数中,在调用加载场景之前,您可以像这样访问该文本:

GameResults.finalText = "You Win!"; 或者 GameResults.finalText = "You Lose!";

加载你的场景,并在你的文本对象上给它一个这样的脚本:

using UnityEngine;
using UnityEngine.UI;
public class ResultTextScript : MonoBehaviour
{
    public Text textResults;
    void Start() {
        textResults = getComponent<Text>();
        if(textResults != null) {
            textResults.text = GameResults.finalText;
        }
    }
}

您还可以使用其他东西,即在结束场景开始时将游戏结果存储PlayerPrefs并加载您存储在首选项中的字符串或 int 。PlayerPrefs这将帮助您避免创建不必要的类或静态变量。

所以就像之前你可以做的那样:

PlayerPrefs.SetString("GameResults", "You Win!"); 或者 PlayerPrefs.SetString("GameResults", "You Lose!");

加载你的场景,并在你的文本对象上给它一个这样的脚本:

using UnityEngine;
using UnityEngine.UI;
public class ResultTextScript : MonoBehaviour
{
    public Text textResults;
    void Start() {
        textResults = getComponent<Text>();
        if(textResults != null) {
            textResults.text = PlayerPrefs.GetString("GameResults", "");
        }
    }
}
于 2018-04-03T19:19:05.337 回答
0

我想出了更好的解决方案:

制作一个设置静态字符串变量的脚本。此脚本必须在您的游戏场景中,并将保存结果。

public class ResultTextScript : MonoBehaviour
{
    public static string ResultText;

    void EndGame(){
    if (won){ //if won game
            ResultText = "You won!"
       }
       else //if lost game
       {
            ResultText = "You lost, try again another time!"
       }
       //Change scene with SceneManager.LoadScene("");
    }

}

将此脚本放在最终场景中的结果文本上。该脚本将检索结果并显示它。

Using UnityEngine.UI;

public class EndGameDisplayResult{

   Text text; 
   OnEnable(){
   Text.text = ResultTextScript.ResultText
   }
}

这样,它会在新场景加载后立即设置文本。





以前/替代方法:

如果您已经打开了场景,一种选择是在“您赢了!”中添加一个脚本。包含一个引用自身的静态变量的文本。

所以像这样。

public class ResultTextScript : MonoBehaviour
{
    public static ResultTextScript Instance;

    void Awake(){
        if (Instance == null)
            Instance = this;
    }
}

然后,您可以从其他脚本中的任何位置(包括场景之间)调用对该 GameObject 的引用。

像这样ResultTextScript.Instance

请注意,虽然您不能在 Awake 方法中调用引用,因为这是初始化变量的地方,但您可以在调用 Awake 方法后使用它。

基本上

  1. 将 ResultTextScript 添加到“结束场景”中的文本对象
  2. 从“游戏场景”中打开“结束场景”,例如使用您已经做的 SceneManager 方法。
  3. 确保已加载结束场景,然后在脚本中说您希望更改文本gameObject go = ResultTextScript.Instance.gameObject
于 2018-04-03T19:01:52.060 回答