Первые два скрипта, прикрепленные к игровым объектам на одной сцене:
Когда я запускаю игру, я хочу играть на заставке: В скрипте я устанавливаю флаг заставки на 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.