如何访问另一个场景中存在的游戏对象
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 方法后使用它。
基本上
- 将 ResultTextScript 添加到 'End Scene'
中的文本对象
- 从 'Game Scene' 打开 'End Scene',例如使用您已经使用的 SceneManager 方法。
- 确保已加载结束场景,然后在脚本中说出您希望更改文本
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", "");
}
}
}
我正在 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 方法后使用它。
基本上
- 将 ResultTextScript 添加到 'End Scene' 中的文本对象
- 从 'Game Scene' 打开 'End Scene',例如使用您已经使用的 SceneManager 方法。
- 确保已加载结束场景,然后在脚本中说出您希望更改文本
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", "");
}
}
}