如何访问另一个场景中存在的gameobject

时间:2018-04-03 18:57:08

标签: unity3d scene-manager

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

创建一个设置静态字符串变量的脚本。此脚本必须位于您的游戏场景中并保留结果。

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. 中的Text对象
  3. 从“游戏场景”中打开“结束场景”,例如使用SceneManager方法。
  4. 确保已加载结束场景,然后在脚本中说明您要更改文字gameObject go = ResultTextScript.Instance.gameObject

答案 1 :(得分:1)

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

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首选项中的字符串或整数。这将帮助您避免创建不必要的类或静态变量。

所以你可以这样做:

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