unity游戏开发(二): 场景的切换

创建场景状态接口类 与 场景状态基类

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
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值