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);
}
}