创建场景状态接口类 与 场景状态基类
public interface IBaseSceneState {
void EnterScene();
void ExitScene();
}
public class BaseSceneState : IBaseSceneState
{
protected UIFacade mUIFacade;
public BaseSceneState(UIFacade uIFacade)
{
mUIFacade = uIFacade;
}
public virtual void EnterScene()
{
mUIFacade.InitPanel();
}
public virtual void ExitScene()
{
mUIFacade.ClearPanel();
}
}
在Canvas和GameManager上挂载脚本
public class CanvasDontDesOnLoad : MonoBehaviour {
void Start ()
{
DontDestroyOnLoad(this.gameObject);
}
}
游戏总管理类: GameManager --游戏总管理,负责管理所有的管理者
UI管理者类:UIManager - 负责管理UI的管理者
UI中介者类: UIFacade -- UI中介,上层与管理者们做交互,下层与UI面板进行交互(使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互)
场景切换流程:
1. 调用ChangeScene方法 -- 在UIFacade中将当前场景赋值给上一个场景,将传入的场景赋值给当前场景
2. 在显示遮罩的2秒后调用上一个场景的Exit()方法:先清理当前场景字典中 Panel身上的IBasePanel的引用(直接Clear()) ,再清理Panel游戏物体,将其放入工厂后clear()字典
3. 再调用当前场景的Enter()方法 : 将当前场景所需的Panel游戏物体添加进存储Panel游戏物体的字典中,再实例化当前字典中的Panel面板并获取Panel面板上的Panel脚本,调用Panel脚本的Init()初始化方法并将Panel脚本添加进Panel脚本的字典中;
4. 最后用2秒逐渐隐藏遮罩,显示场景
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 游戏总管理,负责管理所有的管理者
/// </summary>
public class GameManager : MonoBehaviour
{
private static GameManager _instance;
public static GameManager instance
{
get
{
return _instance;
}
}
public FactoryManager factoryManager;
public UIManager uIManager;
private void Awake()
{
_instance = this;
factoryManager = new FactoryManager();
uIManager = new UIManager();
//第一次需要手动控制场景的加载
uIManager.mUIFacade.currentSceneState.EnterScene();
}
//获取Sprite资源
public Sprite GetSprite(string resourcesName)
{
return factoryManager.spriteFactory.GetSingleResources(resourcesName);
}
//获取AudioClip资源
public AudioClip GetAudioClip(string resourcesName)
{
return factoryManager.audioClipFactory.GetSingleResources(resourcesName);
}
// 得到游戏物体资源
public GameObject GetGameObjectResources(FactoryType factoryType,string resourcesName)
{
return factoryManager.factoryDict[factoryType].GetItem(resourcesName);
}
//将游戏物体入栈
public void PushGameObjectToFactory(FactoryType factoryType,string itemName,GameObject itemGO)
{
factoryMana