TheRoxas Geschrieben 27. Juni 2020 Melden Share Geschrieben 27. Juni 2020 Hallo alle miteinander! Ich habe mit Unity runtergeladen und mich an dem ersten Tutorial auf der Website " Roll a Ball" zu schaffen gemacht und die ersten Schritte geschafft aber kriege es einfach nicht hin die Funktion SceneManager.Loadscene zu verstehen. Ich wollte mehrere Level ( Scenes) erstellen und es so machen das wenn man alle 12 gesammelt hat dann in die nächste Scene geladen wird aber checke einfach nicht wie ich das machen soll. Die Erklärungen auf Youtube und der Unity Seite sind für mich warum auch immer auch unverständlich und ich bin echt am Ende mit meinem Latein. using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; using System.Runtime.InteropServices; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; public class PlayerController : MonoBehaviour { public float speed; public Text countText; public Text winText; private Rigidbody rb; private int count; void Start() { rb = GetComponent<Rigidbody>(); count = 0; SetCountText(); winText.text = ""; } void FixedUpdate() { float moveHorizontal = Input.GetAxis("Horizontal"); float moveVertical = Input.GetAxis("Vertical"); Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); rb.AddForce(movement * speed); } void OnTriggerEnter(Collider other) { if (other.gameObject.CompareTag("Pick Up")) { other.gameObject.SetActive(false); count = count + 1; SetCountText(); } } void SetCountText() { countText.text = "Count: " + count.ToString(); if (count >= 12) { winText.text = "You Win!"; } } } Ganz nach der Erklärung habe ich den PlayerController gemacht. Ich hoffe und freue mich auf Hilfe. Bleibt gesund und danke. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 27. Juni 2020 Melden Share Geschrieben 27. Juni 2020 Du musst die Szenen die du laden möchtest in den Build-Settings eintragen. Dabei bekommt jede Szene einen Index, dieser Index muss beim Laden der Szenen angegeben werden. Deine Start-Szene hat den Index 0. Weitere Level dann z.B. den Index 1 , Index 2 usw. File -> "Build Settings" -> "Add Open Scenes" Hier der Code wie du die Level dann laden kannst. Ich habe dies so erweitert, dass du einstellen kannst wie lange Unity noch warten soll bis er das Level läd, damit der Spieler noch seine erreichte Punktzahl sehen kann: private int currentLevel = 0; void SetCountText() { countText.text = "Count: " + count.ToString(); if (count >= 12) { winText.text = "You Win!"; StartCoroutine (LoadNextLevel(++currentLevel, 5f)); // Läd Level mit Index "currentLevel + 1" nach 5 Sekunden } } IEnumerator LoadNextLevel(int level, float timetowait) { yield return new WaitForSeconds(timetowait); // wartet timetowait Sekunden SceneManager.LoadScene(level); // Läd das Level mit dem Index level } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
TheRoxas Geschrieben 27. Juni 2020 Autor Melden Share Geschrieben 27. Juni 2020 Vielen Dank für die umfassende Antwort. Es funktioniert. Leider hat gibt es das Problem das man im 2ten Level nicht in das 3te kommt sondern das 2te neugeladen wird. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
TheRoxas Geschrieben 27. Juni 2020 Autor Melden Share Geschrieben 27. Juni 2020 Dazu kommt wenn man das 3te also letzte Level abschließt kommt man wieder in das 2te. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 27. Juni 2020 Melden Share Geschrieben 27. Juni 2020 Wenn du das noch einbaust, dann wird currentLevel immer auf das aktuell geladene Level gesetzt: private int currentLevel = 0; void Start () { currentLevel = SceneManager.GetActiveScene().buildIndex; } void SetCountText() { countText.text = "Count: " + count.ToString(); if (count >= 12) { winText.text = "You Win!"; StartCoroutine (LoadNextLevel(++currentLevel, 5f)); // Läd Level mit Index "currentLevel + 1" nach 5 Sekunden } } IEnumerator LoadNextLevel(int level, float timetowait) { yield return new WaitForSeconds(timetowait); // wartet timetowait Sekunden SceneManager.LoadScene(level); // Läd das Level mit dem Index level } Damit wird die Reihenfolge der Level nun über den Build-Index bestimmt, siehe Dialog oben wo du die Szenen einstellst, man kann hier auch die Reihenfolge verschieben ...! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
TheRoxas Geschrieben 27. Juni 2020 Autor Melden Share Geschrieben 27. Juni 2020 Leider kommt da dieser Fehler: using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; using System.Runtime.InteropServices; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; public class PlayerController : MonoBehaviour { public float speed; public Text countText; public Text winText; private Rigidbody rb; private int count; void Start() { rb = GetComponent<Rigidbody>(); count = 0; SetCountText(); winText.text = ""; } void FixedUpdate() { float moveHorizontal = Input.GetAxis("Horizontal"); float moveVertical = Input.GetAxis("Vertical"); Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); rb.AddForce(movement * speed); } void OnTriggerEnter(Collider other) { if (other.gameObject.CompareTag("Pick Up")) { other.gameObject.SetActive(false); count = count + 1; SetCountText(); } } private int currentLevel = 0; void Start() { currentLevel = SceneManager.GetActiveScene().buildIndex; } void SetCountText() { countText.text = "Count: " + count.ToString(); if (count >= 12) { winText.text = "You Win!"; StartCoroutine(LoadNextLevel(++currentLevel, 3f)); // Läd Level mit Index "currentLevel + 1" nach 5 Sekunden } } IEnumerator LoadNextLevel(int level, float timetowait) { yield return new WaitForSeconds(timetowait); // wartet timetowait Sekunden SceneManager.LoadScene(level); // Läd das Level mit dem Index level } } Hab ich es falsch eingefügt ? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 27. Juni 2020 Melden Share Geschrieben 27. Juni 2020 Ja, es darf nur eine Start-Methode geben und dann quasi so void Start() { currentLevel = SceneManager.GetActiveScene().buildIndex; rb = GetComponent<Rigidbody>(); count = 0; SetCountText(); winText.text = ""; } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
TheRoxas Geschrieben 27. Juni 2020 Autor Melden Share Geschrieben 27. Juni 2020 Vielen Dank es funktioniert. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.