using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using vnxbqy.UI;
namespace vnxbqy.UI
{
public abstract class Model
{
public Model()
{
}
public abstract void Init(); //整个游戏生命周期只有一次
public abstract void UnInit();//整个游戏生命周期最多有一次
}
///
/// 玩家数据初始化(0102)之前调用
///
public interface IBeforePlayerDataInitialize
{
void OnBeforePlayerDataInitialize();
}
///
/// 玩家数据初始化(0102)之后调用
///
public interface IAfterPlayerDataInitialize
{
void OnAfterPlayerDataInitialize();
}
///
/// 玩家登录流程全部ok调用
///
public interface IPlayerLoginOk
{
void OnPlayerLoginOk();
}
public interface IMapInitOk
{
void OnMapInitOk();
}
public interface ISwitchAccount
{
void OnSwitchAccount();
}
public class ModelCenter : Singleton
{
bool inited = false;
Dictionary models = new Dictionary();
Dictionary nameToModels = new Dictionary();
public ModelCenter()
{
DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
DTC0102_tagCDBPlayer.switchAccountEvent += OnAccountSwitch;
DTC0102_tagCDBPlayer.afterPlayerDataInitializeEvent += OnAfterPlayerDataInitialize;
DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
DTC0403_tagPlayerLoginLoadOK.mapInitOkEvent += OnMapInitOk;
}
public void Init()
{
if (inited)
{
return;
}
if (VersionConfig.Get().debugVersion)
{
RegisterModel();
}
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
//RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
//RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
//RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
RegisterModel();
inited = true;
}
public T GetModel() where T : Model, new()
{
T model = null;
var token = typeof(T).MetadataToken;
if (models.ContainsKey(token))
{
model = models[token] as T;
}
else
{
model = RegisterModel();
}
return model;
}
public Model GetModel(Type type)
{
Model model = null;
var token = type.MetadataToken;
if (models.ContainsKey(token))
{
model = models[token];
}
else
{
model = RegisterModel(type);
}
return model;
}
public Model GetModel(string name)
{
if (nameToModels.ContainsKey(name))
{
return nameToModels[name];
}
return null;
}
Model RegisterModel(Type type)
{
Model model = null;
var token = type.MetadataToken;
var name = type.Name;
if (!models.ContainsKey(token))
{
model = (Model)System.Activator.CreateInstance(type);
models[token] = model;
nameToModels[name] = model;
model.Init();
}
return model;
}
T RegisterModel() where T : Model, new()
{
T model = null;
var token = typeof(T).MetadataToken;
var name = typeof(T).Name;
if (!models.ContainsKey(token))
{
model = new T();
models[token] = model;
nameToModels[name] = model;
model.Init();
}
return model;
}
// 此处加try的原因是 遇不报错的情况
void OnBeforePlayerDataInitialize()
{
#if UNITY_EDITOR
try
{
#endif
foreach (var model in models.Values)
{
var beforePlayerDataInitialize = model as IBeforePlayerDataInitialize;
if (beforePlayerDataInitialize != null)
{
beforePlayerDataInitialize.OnBeforePlayerDataInitialize();
}
}
#if UNITY_EDITOR
}
catch (Exception e)
{
Debug.LogError(e);
}
#endif
}
void OnAfterPlayerDataInitialize()
{
#if UNITY_EDITOR
try
{
#endif
foreach (var model in models.Values)
{
var afterPlayerDataInitialize = model as IAfterPlayerDataInitialize;
if (afterPlayerDataInitialize != null)
{
afterPlayerDataInitialize.OnAfterPlayerDataInitialize();
}
}
#if UNITY_EDITOR
}
catch (Exception e)
{
Debug.LogError(e);
}
#endif
}
void OnPlayerLoginOk()
{
#if UNITY_EDITOR
try
{
#endif
foreach (var model in models.Values)
{
var playerLoginOk = model as IPlayerLoginOk;
if (playerLoginOk != null)
{
playerLoginOk.OnPlayerLoginOk();
}
}
#if UNITY_EDITOR
}
catch (Exception e)
{
Debug.LogError(e);
}
#endif
}
void OnMapInitOk()
{
#if UNITY_EDITOR
try
{
#endif
foreach (var model in models.Values)
{
var mapInitOk = model as IMapInitOk;
if (mapInitOk != null)
{
mapInitOk.OnMapInitOk();
}
}
#if UNITY_EDITOR
}
catch (Exception e)
{
Debug.LogError(e);
}
#endif
}
void OnAccountSwitch()
{
#if UNITY_EDITOR
try
{
#endif
foreach (var model in models.Values)
{
var switchAccount = model as ISwitchAccount;
if (switchAccount != null)
{
switchAccount.OnSwitchAccount();
}
}
#if UNITY_EDITOR
}
catch (Exception e)
{
Debug.LogError(e);
}
#endif
}
}
}