我正在使用C#在Unity3D中为移动设备制作游戏,并且无法弄清楚如何检查当前场景之前加载了哪个场景。我需要检查这个以改变玩家游戏对象的生成点。首先,我向我的按钮添加了一个简单的脚本(loadnextscene和loadprevscene)
public class SwitchScene : MonoBehaviour {
public int sceneNumber;
public void LoadScene(int sceneNumber) {
Application.LoadLevel(sceneNumber);
}
}
第二个脚本处理来自用户的触摸输入并更改播放器对象的移动。
所以,例如:如果玩家点击第二级中的“加载前一场景”按钮再次切换到第一级,我想在屏幕的右半部分设置玩家对象的生成点第一次比赛开始的时候不在左侧。
我尝试使用Singleton和PlayerPrefs,但它没有用完。
答案 0 :(得分:2)
您需要在LoadScene之前将场景编号保存到某个变量,然后在加载场景后检查它。
唯一的问题是,在加载新场景后,此变量将被销毁。因此,为了防止它,您可以使用DontDestroyOnLoad
。这是你做的:
首先,创建一个新的空游戏对象,并将以下脚本附加到它:
using UnityEngine;
using System.Collections;
public class Indestructable : MonoBehaviour {
public static Indestructable instance = null;
// For sake of example, assume -1 indicates first scene
public int prevScene = -1;
void Awake() {
// If we don't have an instance set - set it now
if(!instance )
instance = this;
// Otherwise, its a double, we dont need it - destroy
else {
Destroy(this.gameObject) ;
return;
}
DontDestroyOnLoad(this.gameObject) ;
}
}
现在,在加载之前,将场景编号保存在Indestructable对象中:
public class SwitchScene : MonoBehaviour {
public int sceneNumber;
public void LoadScene(int sceneNumber) {
Indestructable.instance.prevScene = Application.loadedLevel;
Application.LoadLevel(sceneNumber);
}
}
最后,在你的场景中开始()检查Indestructable.instance.prevScene
并相应地做你的魔法。
更多信息: http://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html
*我没有编译代码,所以可能会有一些错误,但这是一般的想法。
答案 1 :(得分:1)
为什么PlayerPrefs方法不起作用? 我认为这是解决问题的最简单方法。
public class FirstLevel : MonoBehaviour {
public void Start() {
PlayerPrefs.SetString("SceneNumber", SceneManager.GetActiveScene().name);
}
}
然后在第二个场景中,只需读取保存的PlayerPrefs
public class SecondLevel : MonoBehaviour {
string PrevScene;
public void Start() {
PrevScene = PlayerPrefs.GetString("SceneNumber");
// if there will be a third scene, etc.
PlayerPrefs.SetString("SceneNumber", SceneManager.GetActiveScene().name);
}
public void GoToPrevScene() {
SceneManager.LoadScene(PrevScene);
}
}
答案 2 :(得分:0)
您可以使用SwitchScene
类中的单个静态成员变量来解决此问题。不需要单例模式或DontDestroyOnLoad。
public class SwitchScene : MonoBehaviour
{
public int sceneNumber;
private static int previousScene;
private int oldPreviousScene;
void Start()
{
oldPreviousScene = previousScene;
previousScene = sceneNumber;
}
public void HandleLoadPrevButtonClick()
{
SceneManager.LoadScene(oldPreviousScene);
}
}