在一个场景中附加到游戏对象的前两个脚本:
游戏开始时我想播放启动画面: 在脚本中我将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脚本启动游戏时才应播放启动画面。