如何访问另一个场景中存在的游戏对象

How to access gameobject present in another scene

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

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

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

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

我想到的更好的解决方案:

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

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

这样一加载新场景就会设置文本





Previous/alternative方法:

如果您已经打开了场景,一种选择是将脚本添加到 "You won!" 文本中,该文本包含一个引用自身的静态变量。

就是这样。

public class ResultTextScript : MonoBehaviour
{
    public static ResultTextScript Instance;

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

然后您可以从其他脚本中的任何地方(包括场景之间)调用对该游戏对象的引用。

像这样ResultTextScript.Instance

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

基本上

  1. 将 ResultTextScript 添加到 'End Scene'
  2. 中的文本对象
  3. 从 'Game Scene' 打开 'End Scene',例如使用您已经使用的 SceneManager 方法。
  4. 确保已加载结束场景,然后在脚本中说出您希望更改文本 gameObject go = ResultTextScript.Instance.gameObject

我认为没有办法修改当前未打开的场景的上下文或对象。

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 中,并在结束场景开始时加载存储在 PlayerPrefs 首选项中的字符串或整数。这将帮助您避免创建不必要的 class 或静态变量。

所以在你可以做之前喜欢:

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