Jump to content
Unity Insider Forum
TheRoxas

Ich verstehe SceneManager.LoadScene einfach nicht Hilfe.

Recommended Posts

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.

1.thumb.PNG.9b1bb6cd0e260735bf04eec3d03cf4b4.PNG

 

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.

Share this post


Link to post
Share on other sites

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"
C7513ml.png


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
}

 

Share this post


Link to post
Share on other sites

Vielen Dank für die umfassende Antwort.
Es funktioniert. :D

Leider hat gibt es das Problem das man im 2ten Level nicht in das 3te kommt sondern das 2te neugeladen wird.

Edited by TheRoxas
Erweiterung

Share this post


Link to post
Share on other sites

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 ...!

Share this post


Link to post
Share on other sites

Leider kommt da dieser Fehler:2.thumb.PNG.29cb2133df5b703afed75564a328da36.PNG

 

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 ?

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...