为什么静态bool永远不会设置为false?

时间:2018-05-28 21:38:21

标签: c# unity3d

在一个场景中附加到游戏对象的前两个脚本:

游戏开始时我想播放启动画面: 在脚本中我将splash标志设置为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;

我用了一个断点。在运行游戏时,它已经达到了这条线,并且飞溅是真的。但是当我点击/按下转义键时它会进入检查行,但即使我在LoadMainMenuOnclick脚本中将其设置为false,启动仍然是正确的。

只有在使用LoadScenes脚本启动游戏时才应播放启动画面。

0 个答案:

没有答案