How to keep position of a Game Object when switching scene?

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?

3 Answers

3

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

Ok that works great, I had been looking for a way to do this for so long. Thanks a ton!

It could be just that the tag "Player" is capitalized and it is not finding the gameobject because of that. Also obviously make sure that your player object has the player tag on it. If this doesn't work you could also use: [GameObject.Find][1] [1]: http://docs.unity3d.com/Documentation/ScriptReference/GameObject.Find.html This will just find the gameobject based on its name.

How to know when player is switching scene and when player is coming back ?

does it work on 2022 version?

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();
		}
	}
}