Почему static bool никогда не устанавливается в false? - PullRequest
0 голосов
/ 29 мая 2018

Первые два скрипта, прикрепленные к игровым объектам на одной сцене:

Когда я запускаю игру, я хочу играть на заставке: В скрипте я устанавливаю флаг заставки на true:

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

public class LoadScenes : MonoBehaviour
{
    // Use this for initialization
    void Start()
    {
        GameControl.splash = true;
        if (!SceneManager.GetSceneByName("The Space Station").IsValid())
        {
            SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive);
            StartCoroutine(WaitForSceneLoad(SceneManager.GetSceneByName("The Space Station")));
        }
    }

    public IEnumerator WaitForSceneLoad(Scene scene)
    {
        while (!scene.isLoaded)
        {
            yield return null;
        }
        SceneManager.SetActiveScene(SceneManager.GetSceneByBuildIndex(1));
    }
}

Когда я нажимаю / нажимаю клавишу выхода, должно быть загружено главное меню, и это происходит, но я хочу, чтобы оно загружало главное меню, не воспроизводя заставку снова:

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

public class LoadMainMenuOnclick : MonoBehaviour
{
    private Scene scene;

    // Use this for initialization
    void Start ()
    {
        scene = SceneManager.GetActiveScene();
    }

    // Update is called once per frame
    void Update ()
    {
        if (scene.name != "Menu" && GameControl.player.activeSelf)
        {
            if (Input.GetKeyDown(KeyCode.Escape))
            {
                SceneManager.LoadScene(0, LoadSceneMode.Additive);
                StartCoroutine(WaitForSceneLoad(SceneManager.GetSceneByName("Menu")));
            }
        }
    }

    public IEnumerator WaitForSceneLoad(Scene scene)
    {
        while (!scene.isLoaded)
        {
            yield return null;
        }
        GameControl.splash = false;
        SceneManager.SetActiveScene(SceneManager.GetSceneByBuildIndex(1));
        GameControl.player.SetActive(false);
        Cursor.visible = true;
    }
}

Этостатический класс скрипта GameControl, который не привязан ни к одному игровому объекту.Этот класс должен иметь возможность доступа к переменным в двух сценах:

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

public static class GameControl
{
    public static GameObject player;
    public static bool splash;
}

И этот скрипт, который воспроизводит заставки, прикреплен к gameobject во второй сцене сцены главного меню:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine.Assertions.Must;
using UnityEngine.UI;
using UnityEngine.SceneManagement;


public class Splashes : UnityEngine.MonoBehaviour
{
    [Header("Splash Screen")]
    public bool useSplashScreen = true;
    public GameObject splashesContent;
    private List<Graphic> splashes = new List<Graphic>();
    public float splashStayDiration = 3f;
    public float splashCrossFadeTime = 1f;

    void Start()
    {
        if (GameControl.splash == false)
            useSplashScreen = GameControl.splash;
        if (!useSplashScreen || splashesContent.GetComponentsInChildren<Graphic>(true).Length <= 0) return;

        //if we use splash screens and we have splash screens
        #region Get All Splashes
        //if you build on PC Standalone - you can uncomment this
        //foreach (var splash in splashesContent.GetComponentsInChildren<Graphic>(true).Where(splash => splash != splashesContent.GetComponent<Graphic>()))
        //{
        //    splashes.Add(splash);
        //}

        for (var i = 0; i < splashesContent.GetComponentsInChildren<Graphic>(true).Length; i++)
        {
            var splash = splashesContent.GetComponentsInChildren<Graphic>(true)[i];
            if (splash != splashesContent.GetComponent<Graphic>())
            {
                splashes.Add(splash);
            }
        }

        #endregion


        //And starting playing splashes
        StartCoroutine(PlayAllSplashes());

    }

    private IEnumerator PlayAllSplashes()
    {
        //Enabling Splashes root transform
        if (!splashesContent.activeSelf) splashesContent.SetActive(true);

        //main loop for playing
        foreach (var t in splashes)
        {
            t.gameObject.SetActive(true);
            t.canvasRenderer.SetAlpha(0.0f);
            t.CrossFadeAlpha(1, splashCrossFadeTime, false);
            yield return new WaitForSeconds(splashStayDiration + splashCrossFadeTime);
            t.CrossFadeAlpha(0, splashCrossFadeTime, false);
            yield return new WaitForSeconds(splashCrossFadeTime);
            t.gameObject.SetActive(false);
        }

        //Smooth main menu enabling
        splashesContent.GetComponent<Graphic>().CrossFadeAlpha(0, 0.5f, false);
        yield return new WaitForSeconds(0.5f);
        splashesContent.gameObject.SetActive(false);
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            StopCoroutine(PlayAllSplashes());
        }
    }

    public void ExitGame()
    {
        Application.Quit();
    }
}

Я добавил две строки:

if (GameControl.splash == false)
                useSplashScreen = GameControl.splash;

И использовал точку останова.При запуске игры он доходит до этих строк и всплеск это правда.но когда я нажимаю / нажимаю клавишу escape, она попадает на контрольную линию, но заставка остается верной, даже если я установил ее в false в сценарии LoadMainMenuOnclick.

Заставка должна воспроизводиться только при запуске игры сскрипт LoadScenes.

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