Unity3D自学笔记——架构应用(五)Loading场景及持久化场景

Loading场景及持久化场景


Loading场景

每次切换场景时首先异步加载Loading,再通过Loding异步加载指定的场景

目录结构
这里写图片描述

UI组件情况
UI_Loding->UIInfo
UIScene_Loading->UILoading

分析
每次切换场景由Loading进行异步加载场景,并将加载的进度,返回给Slider,显示加载的进度

实现
这里没有用UIScene,因为场景够简单够单纯,用也可以,但是要去UIManager里面增加初始化UIScene显示的代码

public class UILoading : MonoBehaviour {
    private Slider m_Progress;
    AsyncOperation m_Async;

    //为了开启协程,所以使用IEnumerator
    IEnumerator Start()
    {
        m_Progress = UIHelper.FindChild<Slider>(transform, "Slider");
        m_Async = SceneManager.LoadSceneAsync(UIHelper.LoadSceneName);
        yield return m_Async;
    }

    void Update()
    {
        m_Progress.value = m_Async.progress;
    }
}

持久化场景 GameMain

GameMain两个功能
持久化数据管理,不受场景的切换而销毁
管理场景切换

目录结构
这里写图片描述

组件情况
GameMain -> GameMain
PhotonManager ->PhotonManager

分析
持久化即使用DontDersoryOnLoad,该GameObject不因为切换场景而销毁。我们把经常使用的,又不易更改的,又费性能的放在里面。如我们的PhotonManager,每个场景都需要用,每个场景一来就初始化。

场景切换是公用方法,GameMain进行封装

实现

public class GameMain : UISingleton<GameMain> {
    AsyncOperation async;
    private PhotonManager photonManager;

    IEnumerator Start()
    {
        //初始化PhotonManager
        InitPhotonManger();
        //直到它连接上服务器再继续
        while(!PhotonManager.Instance.IsConnected)
            yield return null;
        //初始化数据 
        StartCoroutine(LoadData());
        //持久化
        DontDestroyOnLoad(gameObject);
        //切换场景至Title
        StartCoroutine(LoadScene(SceneName.Title));
    }

    //异步加载Loading界面
    IEnumerator Load()
    {
        async = SceneManager.LoadSceneAsync(SceneName.Loading);
        yield return async;
    }

    //对外开发的切换场景的方法
    public IEnumerator LoadScene(string sceneName)
    {
        UIHelper.LoadSceneName = sceneName;
        yield return StartCoroutine(Load());
    }

    //由UIInfo搬家而来
    void InitPhotonManger()
    {
        Object obj = FindObjectOfType(typeof(PhotonManager));
        if (obj != null)
            photonManager = obj as PhotonManager;
        if (photonManager == null)
        {
            GameObject manger = new GameObject("PhotonManager");
            photonManager = manger.AddComponent<PhotonManager>();
        }
    }

    //初始化数据的方法,目前只有英雄列表
    IEnumerator LoadData()
    {
        GetAllHeroInfo();
        yield return null;
    }

    //UIScene搬家而来
    public void GetAllHeroInfo()
    {
        if (PhotonManager.Instance.IsConnected)
        {
            Dictionary<byte, object> parameter = new Dictionary<byte, object>();
            parameter.Add((byte)OperationCode.GetHeroInfo, null);
            PhotonManager.Instance.Peer.OpCustom((byte)OperationCode.GetHeroInfo, parameter, true);
        }
    }
}

调用方式
这里把Login成功后的处理完善了
1.服务端登录成功后,将AccountEntity返回至客户端,客户端进行缓存
2.切换场景只选择英雄界面

    private void HandleLoginResponse(OperationResponse operationResponse)
    {
        object json;
        switch ((ReturnCode)operationResponse.ReturnCode)
        {
            case ReturnCode.Sucess:
                Debug.Log("登录成功");                
                operationResponse.Parameters.TryGetValue((byte)ReturnCode.Sucess, out json);
                if (json != null)
                {
                    JsonData data = JsonMapper.ToObject(json.ToString());
                    new JsonToEntity<AccountEntity>(PhotonCacheType.Account, data).BuildEntityToCache();

                    //进入创建英雄场景
                    StartCoroutine(GameMain.Instance.LoadScene(SceneName.CharacterSelection));
                }
                break;
            case ReturnCode.Error:
                PopupErrorMessage(operationResponse);
                break;
        }
    }

对消息提示做了封装,都一样

    private void PopupErrorMessage(OperationResponse operationResponse)
    {
        object json;
        operationResponse.Parameters.TryGetValue((byte)ReturnCode.Error, out json);
        if (json != null)
        {
            ValidationResult error = JsonMapper.ToObject<ValidationResult>(json.ToString());
            UIManager.Instance.SetVisible(UIName.UIPopup, true);
            UIPopup popup = UIManager.Instance.GetUI<UIPopup>(UIName.UIPopup);
            popup.Show(error.Message);
        }
    }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值