Hi, In my game, I need to have a trigger zone that makes a player switch scene but then the player comes back into the first scene and needs to be in the exact same spot. How can I do this?
I would recommend saving the coordinates of the players position to the player preferences and then referring back to the coordinates when the player re-enters the scene.
It would look something like this:
var player : GameObject;
function PlayerIsSwitchingScene (){
PlayerPrefs.SetFloat("X", player.transform.position.x);
PlayerPrefs.SetFloat("Y", player.transform.position.y);
PlayerPrefs.SetFloat("Z", player.transform.position.z);
// Player Switches Scene
}
function PlayerIsComingBack (){
// Player comes back
player.transform.position.x = PlayerPrefs.GetFloat("X");
player.transform.position.y = PlayerPrefs.GetFloat("Y");
player.transform.position.z = PlayerPrefs.GetFloat("Z");
}
If you call DontDestroyOnLoad() and pass in the trigger as a GameObject, the trigger will persist across scenes and not be destroyed when loading levels.
Be warned though, this will make it not be destroyed when loading any level/scene. For example, if you re-load the first level, you will have to then delete / find and re-use the same GameObject.
I have the same problem - within the same scene if I hit “load” the player will appear at the saved location, but when he enters a trigger that takes him to the next scene…and I hit “load” - it will take me back to the correct scene but the player is in his original starting position. Like I am restarting the entire level. I see in the Inspector window that the var playerPosition switches to none. Like the player position gets lost in scene changes. Any help here? below is the script - which I got online - and all works well.I had to comment out the stuff about Blur and mouseLook to get it to work but I don’t think that is the problem. I mean the script DOES save the level and DOES save the player position but that position disappears in scene changes
class ComponentsClass {
//var BlurEffect : Blur;
//var Look : MouseLook;
}
var Components : ComponentsClass = new ComponentsClass ( ) ;
var Restart: String;
var playerPosition : Transform;
var mainMenuSceneName : String;
var Skin : GUISkin;
var LoadPosition : String = "false"; //set to "true" is you want to load position or "false" to load only level
private var LoadLevel : boolean = true;
//private var Look1 : MouseLook;
var pauseMenuFont : Font;
private var PlayerX : float;
private var PlayerY : float;
private var PlayerZ : float;
private var pauseEnabled = false;
function Start(){
PlayerPrefs.SetString("LoadPosition",LoadPosition); //set loadPosition true or false
pauseEnabled = false;
Time.timeScale = 1;
AudioListener.volume = 1;
Screen.showCursor = false;
LoadPlayer();
}
function SavePlayer(){
if(PlayerPrefs.GetString("LoadPosition") == "true"){ //save current position
PlayerPrefs.SetFloat("PlayerX",PlayerX);
PlayerPrefs.SetFloat("PlayerY",PlayerY);
PlayerPrefs.SetFloat("PlayerZ",PlayerZ);
PlayerX =(playerPosition.transform.position.x);
PlayerY =(playerPosition.transform.position.y);
PlayerZ =(playerPosition.transform.position.z);
PlayerPrefs.SetString("LoadPosition", "true"); //allow the load position
//Debug.Log("Saved to " + " X: " + PlayerPrefs.GetFloat("PlayerX") + " Y: " + PlayerPrefs.GetFloat("PlayerY") + " Z: " + PlayerPrefs.GetFloat("PlayerZ"));
}
PlayerPrefs.SetString("LevelName", Application.loadedLevelName); //save current level
}
function loadLevel(){ //load saved position
if(PlayerPrefs.GetString("LevelName") == Application.loadedLevelName){ //check if you have Loaded Level
LoadLevel = false;
}
if(LoadLevel == true){
Application.LoadLevel(PlayerPrefs.GetString("LevelName")); //load saved level
}
}
function LoadPlayer(){ //load player position on saved level
if(LoadLevel == false && PlayerPrefs.GetString("LoadPosition") == "true"){
playerPosition.transform.position.x = (PlayerPrefs.GetFloat("PlayerX"));
playerPosition.transform.position.y = (PlayerPrefs.GetFloat("PlayerY"));
playerPosition.transform.position.z = (PlayerPrefs.GetFloat("PlayerZ"));
//Debug.Log("LOAD POS");
}
}
function Update(){
PlayerX =(playerPosition.transform.position.x); PlayerY =(playerPosition.transform.position.y); PlayerZ =(playerPosition.transform.position.z); //set current player position
LoadPosition = PlayerPrefs.GetString("LoadPosition"); //check if loadPosition is true or false
//check if pause button (escape key) is pressed
if(Input.GetKeyDown("escape")){
//Look1 = gameObject.GetComponent (MouseLook); //set MouseLook script
//check if game is already paused
if(pauseEnabled == true){
//unpause the game
pauseEnabled = false;
Time.timeScale = 1;
AudioListener.volume = 1;
Screen.showCursor = false;
// Components.BlurEffect.enabled = false;
//Components.Look.enabled = true;
//Look1.enabled = true;
}
//else if game isn't paused, then pause it
else if(pauseEnabled == false){
pauseEnabled = true;
AudioListener.volume = 0;
Time.timeScale = 0;
Screen.showCursor = true;
//Components.BlurEffect.enabled = true;
//Components.Look.enabled = false;
//Look1.enabled = false;
}
}
}
private var showGraphicsDropDown = false;
function OnGUI(){
GUI.skin = Skin;
if(pauseEnabled == true){
//Make a background box
GUI.Box(Rect(Screen.width /2 - 100,Screen.height /2 - 180,250,280), "Pause Menu");
if(GUI.Button(Rect(Screen.width /2 - 100,Screen.height /2 - 50,250,50), "Restart Level")){
Application.LoadLevel(Restart);
}
//Make Main Menu button
if(GUI.Button(Rect(Screen.width /2 - 100,Screen.height /2 - 0,250,50), "Main Menu")){
Application.LoadLevel(mainMenuSceneName);
}
//Make Save Game button
if(GUI.Button(Rect(Screen.width /2 - 100,Screen.height /2 - 100,250,50), "Save Game")){
SavePlayer();
}
if(GUI.Button(Rect(Screen.width /2 - 100,Screen.height /2 - 150,250,50), "Load Game")){
loadLevel();
LoadPlayer();
}
//Make Change Graphics Quality button
if(GUI.Button(Rect(Screen.width /2 - 100,Screen.height /2 +50,250,50), "Change Graphics Quality")){
if(showGraphicsDropDown == false){
showGraphicsDropDown = true;
}
else{
showGraphicsDropDown = false;
}
}
//Create the Graphics settings buttons, these won't show automatically, they will be called when
//the user clicks on the "Change Graphics Quality" Button, and then dissapear when they click
//on it again....
if(showGraphicsDropDown == true){
if(GUI.Button(Rect(Screen.width /2 + 150,Screen.height /2 ,250,50), "Fastest")){
QualitySettings.currentLevel = QualityLevel.Fastest;
}
if(GUI.Button(Rect(Screen.width /2 + 150,Screen.height /2 + 50,250,50), "Fast")){
QualitySettings.currentLevel = QualityLevel.Fast;
}
if(GUI.Button(Rect(Screen.width /2 + 150,Screen.height /2 + 100,250,50), "Simple")){
QualitySettings.currentLevel = QualityLevel.Simple;
}
if(GUI.Button(Rect(Screen.width /2 + 150,Screen.height /2 + 150,250,50), "Good")){
QualitySettings.currentLevel = QualityLevel.Good;
}
if(GUI.Button(Rect(Screen.width /2 + 150,Screen.height /2 + 200,250,50), "Beautiful")){
QualitySettings.currentLevel = QualityLevel.Beautiful;
}
if(GUI.Button(Rect(Screen.width /2 + 150,Screen.height /2 + 250,250,50), "Fantastic")){
QualitySettings.currentLevel = QualityLevel.Fantastic;
}
if(Input.GetKeyDown("escape")){
showGraphicsDropDown = false;
}
}
//Make quit game button
if (GUI.Button (Rect (Screen.width /2 - 100,Screen.height /2 + 100,250,50), "Quit Game")){
Application.Quit();
}
}
}