泛型单列,方便继承
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Singleton<T> : MonoBehaviour where T:Component //泛型写法 where 限制 为 component
{
//作为泛型变量 单列模式
public static T instance { get; private set; }
protected virtual void Awake()//pritected 只能继承的使用 virtual可以重写
{
instance=this as T;//将本身转为 泛型
}
}
建立场景加载类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class SceneLoad : Singleton<SceneLoad>
{
[SerializeField] Image transitionImage;
[SerializeField] float fadeTime = 3.5f;//淡入淡出时间
Color color;
//加载场景
public void LoadScene(string sceneName)
{
SceneManager.LoadScene(sceneName);
}
//加载过场
IEnumerator LoadCoroutine(string sceneName)
{
var loadingOperation= SceneManager.LoadSceneAsync(sceneName); //异步加载 让画面更流畅 会返回值
loadingOperation.allowSceneActivation= false ;//不允许激活
transitionImage.gameObject.SetActive(true);
while(color.a<1f)
{
color.a=Mathf.Clamp01(color.a+Time.fixedUnscaledDeltaTime/fadeTime);//color.a 关于透明度 Mathf.Clamp01限制在0到1之间 fixedUnscaledDeltaTime真实现实时间
transitionImage.color=color;
yield return null;
}
yield return new WaitUntil(() => loadingOperation.progress>=0.9f);//避免机器卡顿所造成问题
LoadScene(sceneName);
loadingOperation.allowSceneActivation= true;//允许激活
while (color.a>0f)
{
color.a=Mathf.Clamp01(color.a-Time.fixedUnscaledDeltaTime/fadeTime);
transitionImage.color=color;
yield return null;
}
transitionImage.gameObject.SetActive(false);
}
//游戏场景
public void LoadGamePlayScene()
{
StopAllCoroutines();//避免多次启动 所造成协程过多
StartCoroutine(LoadCoroutine("gamePlay"));
}
//主菜单场景
public void LoadMainMenuScene()
{
StopAllCoroutines();
StartCoroutine(LoadCoroutine("MainMenu 1"));
}
//分数场景
public void LoadScoreScene()
{
StopAllCoroutines();
StartCoroutine(LoadCoroutine("scoreScenes"));
}
}
主菜单按钮调用
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using UnityEngine;
using UnityEngine.UI;
public class MainMenuUIController : MonoBehaviour
{
[SerializeField] Canvas mainCanva;
[SerializeField] Button startGameButton;
[SerializeField] Button optionGameButton;
[SerializeField] Button exitGameButton;
private void OnEnable()
{
ButtonPress.buttonFunctionTable.Add(startGameButton.gameObject.name, OnStartGameButtonClik);
ButtonPress.buttonFunctionTable.Add(optionGameButton.gameObject.name, OnOptionGameButtonClik);
ButtonPress.buttonFunctionTable.Add(exitGameButton.gameObject.name, OnExitGameButtonClik);
}
private void OnDisable()
{
startGameButton.onClick.RemoveAllListeners();
}
private void Start()
{
Time.timeScale= 1.0f;
GameManager.GameState=GameState.playing;
UIInput.instance.SelecUI(startGameButton);
}
void OnStartGameButtonClik()
{
SceneLoad.instance.LoadGamePlayScene();
}
void OnOptionGameButtonClik()
{
UIInput.instance.SelecUI(optionGameButton);
}
void OnExitGameButtonClik()
{
Application.Quit();
Debug.Log("退出");
}
}
[Unity] 横版卷轴射击游戏 制作教程 Ep.18 场景加载器 | 异步场景加载 | 画面淡入淡出 | 场景切换 | 独立游戏 | 游戏开发_哔哩哔哩_bilibili