Следующая сцена не загружается при запросе - PullRequest
0 голосов
/ 19 мая 2019

Я создал игру, в которой, когда пользователь разбивает все блоки, он попадает в следующую сцену, но этого не происходит, несмотря на добавление всех сцен, которые у меня есть, в настройках сборки.У меня нет ошибок, и сцена написана правильно.Может кто-нибудь помочь мне решить эту проблему, пожалуйста?

Это настройки сборки enter image description here

Сценарий Bricks: (где вызывается сцена)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bricks : MonoBehaviour {

public LevelManager myLevelManager;
public static int brickCount = 0;
public int maxNumberOfHits = 0;
int timesHit;
public AudioClip BlockBreaking;

// Use this for initialization
void Start () {

    timesHit = 0;

    if(this.gameObject.tag == "BrickHit")
    {
        brickCount++;

    }

    if(this.gameObject.tag == "BrickHitTwice")
    {
        brickCount++;
    }
}

void OnCollisionEnter2D()
{
    timesHit++;

    if (timesHit == maxNumberOfHits)
    {
        brickCount--;
        Destroy(this.gameObject); 
    }

    if(brickCount == 0)
    {
        myLevelManager.LoadLevel("Level1.2"); //THIS SCENE IS NOT LOADING
    }

    if(this.gameObject.tag == "BrickHit") //If the gameObject (Block One Point) with the tag "BrickHit" is hit
    {
        Scores.scoreValue += 1;//The user will be rewarded 1 point
        AudioSource.PlayClipAtPoint(BlockBreaking, transform.position);
    }

    if(this.gameObject.tag == "BrickHitTwice") //If the gameObject (Block Two Points) with the tag "BrickHitTwice" is hit
    {
        Scores.scoreValue += 2; //The user will be rewarded 2 points
        AudioSource.PlayClipAtPoint(BlockBreaking, transform.position);
    }   
}

Сценарий LevelManager:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class LevelManager : MonoBehaviour {
    public void LoadLevel(string name)
    {
       print("Level loading requested for" + name);
       SceneManager.LoadScene(name);
    }

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

Основная проблема, с которой вы столкнулись, это отсутствие единственного источника для проверки brickCount, вместо этого каждый отдельный кирпич поддерживает свой счетчик. Я бы порекомендовал перенести логику подсчета кирпичей в отдельный класс. Казалось бы, LevelManager было бы хорошим местом для этого. Итак, в LevelManager добавьте:

private int brickCount = 0;
public void AddBrick()
{
    brickCount++;
}
public void RemoveBrick()
{
    brickCount--;
    // Check if all bricks are destroyed
    if (brickCount == 0)
    {
        LoadLevel("Level1.2");
    }
}

А потом в вашем кирпичном скрипте:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bricks : MonoBehaviour {
    public LevelManager myLevelManager;        
    public int maxNumberOfHits = 0;
    int timesHit;
    public AudioClip BlockBreaking;

    // Use this for initialization
    void Start () {
        timesHit = 0;
        myLevelManager.AddBrick();
        // I'm not sure why you were checking the tag here, since the result was the same  
    }

    void OnCollisionEnter2D()
    {
        timesHit++;

        if (timesHit == maxNumberOfHits)
        {
            myLevelManager.RemoveBrick();
            Destroy(this.gameObject); 
        }
        /* This looks like the player is getting score whether the brick is destroyed or not. Also, it would appear the player won't get scored on the final brick */
        if(this.gameObject.tag == "BrickHit") //If the gameObject (Block One Point) with the tag "BrickHit" is hit
        {
            Scores.scoreValue += 1;//The user will be rewarded 1 point
            AudioSource.PlayClipAtPoint(BlockBreaking, transform.position);
        }

        if(this.gameObject.tag == "BrickHitTwice") //If the gameObject (Block Two Points) with the tag "BrickHitTwice" is hit
        {
            Scores.scoreValue += 2; //The user will be rewarded 2 points
            AudioSource.PlayClipAtPoint(BlockBreaking, transform.position);
        }   
    }
}
0 голосов
/ 19 мая 2019

Я подозреваю, что ваша ошибка может заключаться в том, что вы Destroy() используете gameObject, прежде чем он сможет загрузить следующую сцену; вы получаете условие гонки на том, что финиширует первым; LoadScene или Destroy () - что объясняет, почему это иногда работает . Вы никогда не должны предполагать, что это ошибка в структуре, прежде чем понять вашу проблему.

Попробуйте поставить Destroy () после LoadScene () или с задержкой, чтобы понять, если это ваша проблема.


Кроме того, ваш LevelManager можно сделать статическим и не нужно наследовать от MonoBehaviour, поскольку он не использует функциональность gameObject.

public static class LevelManager {
    public static void LoadLevel(string name)
    {
       print("Level loading requested for" + name);
       SceneManager.LoadScene(name);
    }
}

Используется при выполнении LevelManager.LoadLevel("MyLevel");, но тогда вы можете задаться вопросом, что более эффективно, делать LevelManager.LoadLevel или SceneManager.LoadLevel, поскольку они будут делать то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...