using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using PureMVC.Patterns;
|
using System;
|
using LitJson;
|
using PureMVC.Patterns.Facade;
|
using Skyunion;
|
using PureMVC.Patterns.Mediator;
|
using PureMVC.Interfaces;
|
using Sproto;
|
using SprotoType;
|
using PureMVC.Patterns.Observer;
|
//命令总入口文件,所有的命令都需要在这里注册
|
namespace Game
|
{
|
public class AppFacade : Facade//外观模式,给外部提供一个统一的接口
|
{
|
public const string STARTUP = "AppFacade.StartUp";//启动命令
|
|
private Dictionary<ViewBinder, IMediator> m_viewMap = new Dictionary<ViewBinder, IMediator>();//视图映射
|
private Dictionary<string, IMediator> m_MediatorMap = new Dictionary<string, IMediator>();//中介者映射
|
private Dictionary<string, Mediator> m_globalMap = new Dictionary<string, Mediator>();//全局中介者映射
|
|
public static AppFacade GetInstance()//获取实例
|
{
|
return GetInstance(() => new AppFacade()) as AppFacade;
|
}
|
|
public static void Destroy()
|
{
|
instance = null;
|
PureMVC.Core.View.Destroy();
|
PureMVC.Core.Model.Destroy();
|
PureMVC.Core.Controller.Destroy();
|
}
|
/// <summary>
|
/// 命令模式:将请求封装为对象,支持参数化,队列化,日志化,撤销
|
/// 工作原理:
|
/// 注册:将通知名称与命令类绑定
|
/// RegisterCommand("LoginAccount", () => new LoginCommand());
|
/// 触发:发送通知时自动创建并执行命令
|
/// AppFacade.GetInstance().SendNotification("LoginAccount", loginData);
|
/// 执行:命令类实现 Execute 方法处理业务逻辑
|
/// 优势:
|
/// 解耦:发送者不需要知道具体执行者
|
/// 可扩展:新增命令只需注册,无需修改现有代码
|
/// 可撤销:可记录命令历史,支持撤销/重做
|
/// 可组合:可组合多个命令形成宏命令
|
/// </summary>
|
protected override void InitializeController()//初始化控制器
|
{
|
base.InitializeController();
|
#region "薛之猫专用"
|
RegisterCommand(STARTUP, ()=>new StartUpCommand());
|
RegisterCommand(CmdConstant.ReloadGame, () => new ReloadGameCMD());
|
RegisterCommand(CmdConstant.ExitGame, () => new ExitGameCMD());
|
|
|
RegisterCommand(CmdConstant.AgreementCheck, () => new AgreementCMD());
|
RegisterCommand(CmdConstant.LoadAppConfig, () => new LoadAppConfigCMD());
|
RegisterCommand(CmdConstant.AutoLogin, () => new LoginCommand());
|
RegisterCommand(CmdConstant.LoginAccount, () => new LoginCommand());
|
RegisterCommand(CmdConstant.SwitchAccount, () => new LoginCommand());
|
RegisterCommand(CmdConstant.BindindAccount, () => new LoginCommand());
|
RegisterCommand(CmdConstant.LoadAccountProfile, () => new LoginCommand());
|
RegisterCommand(CmdConstant.AccountBan, () => new LoginCommand());
|
RegisterCommand(CmdConstant.SwitchAccountFinished, () => new LoginCommand());
|
|
RegisterCommand(CmdConstant.OpenAppRating, () => new AppRatingCMD());
|
|
RegisterCommand(CmdConstant.MaintainCheck, () => new MaintainCMD());
|
RegisterCommand(CmdConstant.MaintainCheckSingleServer, () => new MaintainCMD());
|
RegisterCommand(CmdConstant.PackageUpdateCheck, () => new MaintainCMD());
|
RegisterCommand(CmdConstant.HotfixUpteCheck, () => new MaintainCMD());
|
RegisterCommand(CmdConstant.HotfixDownCompleted, () => new MaintainCMD());
|
|
RegisterCommand(CmdConstant.MoveCameraCmd, () => new CameraCmd());
|
|
#endregion
|
|
|
CoreUtils.uiManager.AddShowUIListener(OnShowUI);
|
CoreUtils.uiManager.AddCloseUIListener(OnCloseUI);
|
|
// 在这里注册所有的 Command
|
//RegisterCommand(CmdConstant.NetWorkError, new NetCommand());
|
|
RegisterCommand(CmdConstant.SwitchMainCityCmd, () => new SwitchMainCityCmd());
|
RegisterCommand(CmdConstant.ResetSceneCmd, () => new ResetSceneCmd());
|
RegisterCommand(Item_ItemInfo.TagName, () => new PlayerCmd());
|
RegisterCommand(Build_BuildingInfo.TagName, () => new PlayerCmd());
|
RegisterCommand(Item_ItemUse.TagName, () => new PlayerCmd());
|
RegisterCommand(CmdConstant.SystemDayTimeChange, () => new PlayerCmd());
|
RegisterCommand(Map_ObjectInfo.TagName, () => new MapObjCmd());
|
RegisterCommand(Map_ObjectDelete.TagName, () => new MapObjCmd());
|
RegisterCommand(Build_GetBuildResources.TagName,()=>new CurrencyCMD());
|
//RegisterCommand(CmdConstant.GuideForceShowResCollect, ()=>new CurrencyCMD());
|
RegisterCommand(Role_Heart.TagName, () => new ServerTimeCommand());
|
RegisterCommand(Hero_HeroInfo.TagName, () => new HeroCmd());
|
RegisterCommand(CmdConstant.GetNewHero, () => new HeroCmd());
|
|
//邮件
|
RegisterCommand(Email_GetEmails.TagName, () => new EmailCMD());
|
RegisterCommand(Email_EmailList.TagName, () => new EmailCMD());
|
RegisterCommand(Email_TakeEnclosure.TagName, () => new EmailCMD());
|
RegisterCommand(Email_CollectEmail.TagName, () => new EmailCMD());
|
RegisterCommand(Email_DeleteEmail.TagName, () => new EmailCMD());
|
RegisterCommand(CmdConstant.SystemHourChange, () => new EmailCMD());
|
|
//加速
|
RegisterCommand(CmdConstant.SpeedUp,()=>new SpeedUpCMD());
|
//奖励展示
|
|
RegisterCommand(CmdConstant.RewardGet, () => new RewardGetCMD());
|
//章节
|
RegisterCommand(CmdConstant.ChapterTimelineShow, ()=>new TaskCMD());
|
RegisterCommand(CmdConstant.ChapterIdChange,()=>new TaskCMD());
|
RegisterCommand(CmdConstant.OnChapterDiaglogEnd, ()=>new TaskCMD());
|
RegisterCommand(CmdConstant.TaskRewardEnd, ()=>new TaskCMD());
|
//工人小屋
|
RegisterCommand (CmdConstant.buildQueueChange, () => new WorkerCMD());
|
|
//开场剧情对话
|
RegisterCommand(CmdConstant.ShowNPCDiaglog,()=>new NPCDialogCMD());
|
//章节对白
|
RegisterCommand(CmdConstant.ShowChapterDiaglog,()=>new NPCDialogCMD());
|
|
//科技研究完成
|
RegisterCommand(Technology_ResearchTechnology.TagName,()=>new ResearchCMD());
|
|
//特效层遮罩
|
RegisterCommand(CmdConstant.ShowMask,()=>new StoryCMD());
|
RegisterCommand(CmdConstant.HideMask, () => new StoryCMD());
|
RegisterCommand(CmdConstant.OnMysteryStoreRefresh, () => new StoryCMD());
|
RegisterCommand(Role_MysteryStore.TagName, () => new StoryCMD());
|
|
//斥候
|
RegisterCommand(Map_Scouts.TagName, () => new ScoutCMD());
|
RegisterCommand(Map_ScoutsBack.TagName, () => new ScoutCMD());
|
|
//玩家属性相关
|
RegisterCommand(CmdConstant.UpdatePlayerCountry, () => new PlayerAttributeCmd());
|
RegisterCommand(CmdConstant.technologyChange, () => new PlayerAttributeCmd());
|
RegisterCommand(CmdConstant.CityBuildinginfoFirst, () => new PlayerAttributeCmd());
|
RegisterCommand(CmdConstant.CityBuildinginfoChange, () => new PlayerAttributeCmd());
|
RegisterCommand(CmdConstant.UpdateHero, () => new PlayerAttributeCmd());
|
RegisterCommand(CmdConstant.VipLevelUP, () => new PlayerAttributeCmd());
|
RegisterCommand(Guild_GuildTechnologies.TagName,() => new PlayerAttributeCmd());
|
RegisterCommand(CmdConstant.AllianceEixtEx, () => new PlayerAttributeCmd());
|
RegisterCommand(CmdConstant.GuildOfficerInfoChange, () => new PlayerAttributeCmd());
|
|
|
//聊天
|
RegisterCommand(Chat_PushMsg.TagName, () => new ChatCMD());
|
RegisterCommand(CmdConstant.ChatClientNetEvent,()=>new ChatCMD());
|
RegisterCommand(CmdConstant.OnCityLoadFinished,()=>new ChatCMD());
|
RegisterCommand(Guild_CreateGuild.TagName, ()=>new ChatCMD());
|
RegisterCommand(Guild_ApplyJoinGuild.TagName, ()=>new ChatCMD());
|
RegisterCommand(CmdConstant.AllianceEixt, ()=>new ChatCMD());
|
RegisterCommand(Chat_Msg2GSQueryPrivateChatLst.TagName, () => new ChatCMD());
|
RegisterCommand(Chat_Msg2GSQueryPrivateChatByRid.TagName, () => new ChatCMD());
|
RegisterCommand(Chat_SendMsg.TagName, () => new ChatCMD());
|
|
//城市buff
|
RegisterCommand(CmdConstant.CityBuffChange,()=>new CityBuffCMD());
|
|
//OpenUI
|
RegisterCommand(CmdConstant.OpenUI,()=>new OpenUICMD());
|
RegisterCommand(CmdConstant.OpenUI2, () => new OpenUICMD());
|
|
RegisterCommand(Activity_Reward.TagName, ()=>new ActivityCMD());
|
RegisterCommand(Activity_RewardBox.TagName, ()=>new ActivityCMD());
|
RegisterCommand(Activity_ScheduleInfo.TagName, ()=>new ActivityCMD());
|
RegisterCommand(Activity_Exchange.TagName, ()=>new ActivityCMD());
|
RegisterCommand(CmdConstant.ItemInfoChange, ()=>new ActivityCMD());
|
RegisterCommand(CmdConstant.SystemDayChange, ()=>new ActivityCMD());
|
RegisterCommand(Activity_Rank.TagName, ()=>new ActivityCMD());
|
RegisterCommand(CmdConstant.ActivityActivePointUpdate, ()=>new ActivityCMD());
|
RegisterCommand(Activity_TurnTable.TagName, ()=>new ActivityCMD());
|
RegisterCommand(Activity_ClickActivity.TagName, ()=>new ActivityCMD());
|
|
//小地图
|
RegisterCommand(Guild_GuildMemberPos.TagName, () => new MinimapCMD());
|
|
//角色模块通知
|
RegisterCommand(Role_RoleNotify.TagName, () => new RoleNotify());
|
//资源运输
|
RegisterCommand(Transport_GetTransport.TagName, () => new AssitResCMD());
|
RegisterCommand(Transport_CreateTransport.TagName, () => new AssitResCMD());
|
RegisterCommand(Transport_TransportSuccess.TagName, () => new AssitResCMD());
|
//战争预警
|
RegisterCommand(Role_EarlyWarningInfo.TagName, () => new WarWarningCMD());
|
//跑马灯
|
RegisterCommand(Chat_MarqueeNotify.TagName,()=>new ScrollMessageCMD());
|
|
//充值
|
RegisterCommand(Recharge_RechargeInfo.TagName, () => new RechargeCMD());
|
RegisterCommand(Map_MoveCity.TagName, () => new MoveCityCMD());
|
RegisterCommand(CmdConstant.EventTracking, () => new EventTrackingCMD());
|
|
//地图书签
|
RegisterCommand(Map_AddMarker.TagName, () => new MapMarkerCMD());
|
RegisterCommand(Map_ModifyMarker.TagName, () => new MapMarkerCMD());
|
RegisterCommand(Map_DeleteMarker.TagName, () => new MapMarkerCMD());
|
RegisterCommand(CmdConstant.PersonMapMarkerInfoChanged, () => new MapMarkerCMD());
|
RegisterCommand(CmdConstant.GuildMapMarkerInfoChanged, () => new MapMarkerCMD());
|
}
|
|
public void StartUp()
|
{
|
SendNotification(STARTUP);//发送启动命令
|
}
|
/// <summary>
|
/// 中介者模式:定义对象间的一对多依赖,让多个对象不需要直接交互,通过中介者协调
|
/// 工作原理:
|
/// 注册:将中介者与视图绑定
|
/// RegisterMediator(new PlayerMediator());
|
/// 触发:发送通知时通知中介者处理
|
/// AppFacade.GetInstance().SendNotification("PlayerInfoChanged", playerData);
|
/// 处理:中介者实现 HandleNotification 方法处理业务逻辑
|
/// 优势:
|
/// 解耦:对象间解耦,互不直接依赖
|
/// 可扩展:新增中介者只需注册,无需修改现有代码
|
/// 可维护:统一管理对象关系,易于维护
|
/// 但是这里的中介者更像视图控制器
|
/// </summary>
|
public override void RegisterMediator(IMediator mediator)////注册视图控制器中介者
|
{
|
ViewBinder vb = null;
|
if (mediator.ViewComponent != null)
|
{
|
vb = ((GameObject) mediator.ViewComponent).GetComponent<ViewBinder>();
|
}
|
|
if (vb != null)
|
{
|
m_viewMap[vb] = mediator;
|
}
|
|
if (!m_MediatorMap.ContainsKey(mediator.MediatorName))
|
{
|
m_MediatorMap[mediator.MediatorName] = mediator;
|
}
|
|
base.RegisterMediator(mediator);
|
}
|
|
public override IMediator RetrieveMediator(string mediatorName)
|
{
|
if (m_MediatorMap.ContainsKey(mediatorName))
|
{
|
return m_MediatorMap[mediatorName];
|
}
|
|
return base.RetrieveMediator(mediatorName);
|
}
|
|
public override IMediator RemoveMediator(string mediatorName)
|
{
|
if (m_MediatorMap.ContainsKey(mediatorName))
|
{
|
m_MediatorMap.Remove(mediatorName);
|
}
|
|
return base.RemoveMediator(mediatorName);
|
}
|
|
public void RemoveView(ViewBinder view)
|
{
|
if (m_viewMap.ContainsKey(view))
|
{
|
IMediator md = m_viewMap[view];
|
AppFacade.GetInstance().RemoveMediator(md.MediatorName);
|
}
|
}
|
|
public void RegisterGlobalMediator(Mediator mediator)
|
{
|
m_globalMap.Add(mediator.MediatorName, mediator);
|
base.RegisterMediator(mediator);
|
}
|
|
public void RemoveGlobalMediator(string mediatorName)
|
{
|
if (m_globalMap.ContainsKey(mediatorName))
|
{
|
Mediator md = m_globalMap[mediatorName];
|
AppFacade.GetInstance().RemoveMediator(md.MediatorName);
|
m_globalMap.Remove(mediatorName);
|
}
|
}
|
/// <summary>
|
/// 观察者模式:定义对象间的一对多依赖,让多个对象不需要直接交互,通过观察者协调
|
/// 工作原理:
|
/// 注册:将观察者与被观察者绑定
|
/// RegisterObserver(new Observer());
|
/// 触发:被观察者状态改变时通知观察者
|
/// AppFacade.GetInstance().SendNotification("PlayerInfoChanged", playerData);
|
/// 处理:观察者实现 HandleNotification 方法处理业务逻辑
|
/// 优势:
|
/// 解耦:对象间解耦,互不直接依赖
|
/// </summary>
|
public override void SendNotification(string notificationName, object body = null, string type = null)
|
{
|
base.SendNotification(notificationName, body, type);
|
SubViewManager.Instance.NotifyObervers(new Notification(notificationName, body, type));
|
}
|
|
public void SendSproto(SprotoTypeBase obj)
|
{
|
var net = AppFacade.GetInstance().RetrieveProxy(NetProxy.ProxyNAME) as NetProxy;
|
net.SendSproto(obj);
|
}
|
|
private void OnShowUI(UIInfo ui)
|
{
|
AppFacade.GetInstance().SendNotification(CmdConstant.OnShowUI, ui);
|
}
|
|
private void OnCloseUI(UIInfo ui)
|
{
|
AppFacade.GetInstance().SendNotification(CmdConstant.OnCloseUI, ui);
|
}
|
}
|
}
|