===== Flere Scener (Levels) =====
{{:images:changing_scene.png|}}
----
* [[https://www.youtube.com/watch?v=CPKAgyp8cno|Singletons i Unity (YouTube)]]
----
En kort guide på baggrund af denne YT video : https://www.youtube.com/watch?v=5TOHaygv1IE
==== SceneManager ====
Opret tre Scene objekter.
Under Project fanen; højre-click under i Assets -> Scenes, og create Scene.
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneLoader : MonoBehaviour
{
public int iSceneToLoad;
public string sSceneToLoad;
public bool loadByInt;
private void OnTriggerEnter2D(Collider2D other) {
if (other.gameObject.name == "Player") {
LoadScene();
}
}
private void LoadScene() {
if (loadByInt == true) {
SceneManager.LoadScene(iSceneToLoad);
}
else {
SceneManager.LoadScene(sSceneToLoad);
}
}
}
SceneLoader skal tilføjes som komponent til det Objekt du ønsker at skal fungere som "gateway" mellem Scener/Levels.
For at kunne skifte mellem scener skal alle scener registeres i Build settings. \\
Edit -> Build settings -> add open scenes.\\
Her vil du se at dine scene(r) vil blive tilføjet listen, og tildelt et index nummer som du kan referere til når du skifter scene.
{{:images:add_open_scenes.png|}}
Test nu at du skifte fre én Scene til en anden.
----
==== DoNotDestroyOnLoad ====
For Undgå at Player bliver "destroyed" ved skift af Scene kaldes //DontDestroyOnLoad//, i Start() i PlayerMovement script.
void Start(){
DontDestroyOnLoad(gameObject);
}
----
==== Start position ====
For at angive en startposition for Player ved Scene skift oprettes et nyt gameObjekt (empty) , som vi kalder 'StartPos'. Opret ligeledes et nyt tag "StartPos", ..og vælg dette for dette gameObject.
Placer StartPos objektet der hvor du vil have din Player til at starte ved Scene skift.
Vi vil nu, ved sceneskift, læse positionen fra **StartPos** objekt og skrive denne position til **Player**, for herved at flytte **Player** til denne position.
Vi kan opfange at der er sket et Scene skift ved at implementere //OnLevelWasLoaded// metoden. Dette kan vi f.eks gøre i I PlayerMovement script som vist nedenstående.
private void OnLevelWasLoaded(int level)
{
FindStartPos();
}
void FindStartPos() {
transform.position = GameObject.FindGameObjectWithTag("StartPos").transform.position;
}
----
==== Fix: Duplicate Players ====
Når der skiftes fra frem og tilbage mellem levels opstår der dubletter af Player.
Et fix for dette er et bruge et singleton pattern. (https://www.youtube.com/watch?v=FJlFbCKgT7Q)
Dette gør vi ved at oprette en statisk variabel 'instance' i PlayerMovement script. :)
Herefter oprettes nedenstående kode i Awake() som er det første der kaldes når et objekt oprettes (instantieres).
public void Awake()
{
if (instance == null)
{
instance = gameObject;
DontDestroyOnLoad(gameObject);
}
else
{ // ved forsøg på at lave nye instanser af Player så fjernes nye Players med det samme.
Destroy(gameObject);
}
}
----
Denne øvelse indeholder nedenstående begreber:
* Flere Scener
* DontDestroyOnLoad (metode)
* Build options og Scener
* Reference til Scene ved int(heltal), samt reference til Scene ved tekst (string)
* Load a Scene (udfra valgte indeksering (int) eller (string)
* Positionering af Player ved Scene skift
* OnLevelWasLoaded