我在unity3d中创建了一个简单的猜数游戏。
我想在按钮单击时打开一个新场景,并从当前场景中更改加载场景中存在的文本元素的文本。
我已经能够在按钮点击时打开新场景,但如何访问其他场景中的文本元素,以便我可以从当前场景更改其文本。
这是我到目前为止,但它显然抛出NullReferenceException
,因为我无法从当前场景访问另一个场景中的文本元素。
SceneManager.LoadScene("End Scene");
gameResultText.text = "You Won!!"; //<-------this line throws the exception
gameResultText.color = Color.green;
答案 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方法之后使用它。
基本上
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", "");
}
}
}