进入的时候分发消息
window窗体中监听
state===》control===》view
IGameState基类
public interface IGameState
{
GameStateType GetStateType();
void SetStateTo(GameStateType gsType);
void Enter();
GameStateType Update(float fDeltaTime);
void FixedUpdate(float fixedDeltaTime);
void Exit();
}
GameStateManager 状态管理类
public enum GameStateType
{
GS_Continue,//继续操作
GS_Login,
GS_User,//用户界面
GS_Lobby,//大厅
GS_Room,
GS_Hero,
GS_Loading,
GS_Play,
GS_Over,
}
public class GameStateManager : Singleton<GameStateManager>
{
Dictionary<GameStateType, IGameState> gameStates;
IGameState currentState;
public GameStateManager()
{
gameStates = new Dictionary<GameStateType, IGameState>();
IGameState gameState;
gameState = new LoginState();
gameStates.Add(gameState.GetStateType(), gameState);
gameState = new UserState();
gameStates.Add(gameState.GetStateType(), gameState);
gameState = new LobbyState();
gameStates.Add(gameState.GetStateType(), gameState);
gameState = new RoomState();
gameStates.Add(gameState.GetStateType(), gameState);
gameState = new HeroState();
gameStates.Add(gameState.GetStateType(), gameState);
gameState = new LoadingState();
gameStates.Add(gameState.GetStateType(), gameState);
gameState = new PlayState();
gameStates.Add(gameState.GetStateType(), gameState);
gameState = new OverState();
gameStates.Add(gameState.GetStateType(), gameState);
}
public IGameState GetCurState()
{
return currentState;
}
public void ChangeGameStateTo(GameStateType stateType)
{
if (currentState != null && currentState.GetStateType() != GameStateType.GS_Loading && currentState.GetStateType() == stateType)
return;
if (gameStates.ContainsKey(stateType))
{
if (currentState != null)
{
currentState.Exit();
}
currentState = gameStates[stateType];
currentState.Enter();
}
}
public void EnterDefaultState()
{
ChangeGameStateTo(GameStateType.GS_Login);
}
public void FixedUpdate(float fixedDeltaTime)
{
if (currentState != null)
{
currentState.FixedUpdate(fixedDeltaTime);
}
}
public void Update(float fDeltaTime)
{
GameStateType nextStateType = GameStateType.GS_Continue;
if (currentState != null)
{
nextStateType = currentState.Update(fDeltaTime);
}
if (nextStateType > GameStateType.GS_Continue)//是否进行下一步操作为0
{
ChangeGameStateTo(nextStateType);
}
}
public IGameState getState(GameStateType type)
{
if (!gameStates.ContainsKey(type))
{
return null;
}
return gameStates[type];
}
}
登陆状态例子
class LoginState : IGameState
{
GameStateType stateTo;
GameObject mScenesRoot;
// GameObject mUIRoot;
public LoginState()
{
}
public GameStateType GetStateType()
{
return GameStateType.GS_Login;
}
public void SetStateTo(GameStateType gs)
{
stateTo = gs;
}
public void Enter()
{
SetStateTo(GameStateType.GS_Continue);//设置状态
ResourceUnit sceneRootUnit = ResourcesManager.Instance.loadImmediate(GameConstDefine.GameLogin, ResourceType.PREFAB);
mScenesRoot = GameObject.Instantiate(sceneRootUnit.Asset) as GameObject;
LoginCtrl.Instance.Enter();
ResourceUnit audioClipUnit = ResourcesManager.Instance.loadImmediate(AudioDefine.PATH_UIBGSOUND, ResourceType.ASSET);
AudioClip clip = audioClipUnit.Asset as AudioClip;
AudioManager.Instance.PlayBgAudio(clip);
EventCenter.AddListener<CEvent>(EGameEvent.eGameEvent_InputUserData, OnEvent);//用户信息不完整,跳到用户信息界面
EventCenter.AddListener<CEvent>(EGameEvent.eGameEvent_IntoLobby, OnEvent);
EventCenter.AddListener(EGameEvent.eGameEvent_SdkLogOff, SdkLogOff);
}
private void SdkLogOff()
{
GameMethod.LogOutToLogin();
SetStateTo(GameStateType.GS_Login);
}
public void Exit()
{
EventCenter.RemoveListener<CEvent>(EGameEvent.eGameEvent_InputUserData, OnEvent);
EventCenter.RemoveListener<CEvent>(EGameEvent.eGameEvent_IntoLobby, OnEvent);
EventCenter.RemoveListener(EGameEvent.eGameEvent_SdkLogOff, SdkLogOff);
//LoadUiResource.DestroyLoad(mUIRoot);
LoginCtrl.Instance.Exit();//通过广播消息,通过界面关闭
GameObject.DestroyImmediate(mScenesRoot);
}
public void FixedUpdate(float fixedDeltaTime)
{
}
public GameStateType Update(float fDeltaTime)
{
return stateTo;
}
public void OnEvent(CEvent evt)
{
UIPlayMovie.PlayMovie("cg.mp4", Color.black, 2/* FullScreenMovieControlMode.Hidden*/, 3/*FullScreenMovieScalingMode.Fill*/);
switch (evt.GetEventId())
{
case EGameEvent.eGameEvent_InputUserData:
SetStateTo(GameStateType.GS_User);//设置状态
break;
case EGameEvent.eGameEvent_IntoLobby:
GameStateManager.Instance.ChangeGameStateTo(GameStateType.GS_Lobby);
break;
}
}
}
public class LoginCtrl : Singleton<LoginCtrl>
{
public void Enter()
{
EventCenter.Broadcast(EGameEvent.eGameEvent_LoginEnter);
SdkLink();//对应的发布平台
}
public void Exit()
{
EventCenter.Broadcast(EGameEvent.eGameEvent_LoginExit);//隐藏窗口
}
//登陆
public void Login(string account, string pass)
{
//设置用户名和密码
SelectServerData.Instance.SetServerInfo((int)SdkManager.Instance.GetPlatFrom(), account, pass);
//网络先切断,再连接
NetworkManager.Instance.canReconnect = false;
NetworkManager.Instance.Close();
NetworkManager.Instance.Init(GameLogic.Instance.LoginServerAdress,GameLogic.Instance.LoginServerPort, NetworkManager.ServerType.LoginServer);
}
//登陆错误反馈
public void LoginError(int code)
{
MsgInfoManager.Instance.ShowMsg(code);
EventCenter.Broadcast<EErrorCode>(EGameEvent.eGameEvent_LoginError, (EErrorCode)code);
}
//接收GateServer信息
public void RecvGateServerInfo(Stream stream)
{
BSToGC.AskGateAddressRet pMsg = ProtoBuf.Serializer.Deserialize<BSToGC.AskGateAddressRet>(stream);
SelectServerData.Instance.GateServerAdress = pMsg.ip;
SelectServerData.Instance.GateServerPort = pMsg.port;
SelectServerData.Instance.GateServerToken = pMsg.token;
SelectServerData.Instance.SetGateServerUin(pMsg.user_name);
NetworkManager.Instance.canReconnect = false;
NetworkManager.Instance.Close();
NetworkManager.Instance.Init(pMsg.ip, pMsg.port, NetworkManager.ServerType.GateServer);
EventCenter.Broadcast(EGameEvent.eGameEvent_LoginSuccess);
}
//登陆失败
public void LoginFail()
{
NetworkManager.Instance.canReconnect = false;
EventCenter.Broadcast(EGameEvent.eGameEvent_LoginFail);
}
//选择LoginServer
public void SelectLoginServer(int i)
{
string ip = GameLogic.Instance.ipList.ElementAt(i);
GameLogic.Instance.LoginServerAdress = ip;
}
//更新服务器列表
public void UpdateServerAddr(Stream stream)
{
LSToGC.ServerBSAddr pMsg = ProtoBuf.Serializer.Deserialize<LSToGC.ServerBSAddr>(stream);
SelectServerData.Instance.Clean();
for (int i = 0; i < pMsg.serverinfo.Count; i++)
{
string addr = pMsg.serverinfo.ElementAt(i).ServerAddr;
int state = pMsg.serverinfo.ElementAt(i).ServerState;
string name = pMsg.serverinfo.ElementAt(i).ServerName;
int port = pMsg.serverinfo.ElementAt(i).ServerPort;
SelectServerData.Instance.SetServerList(i, name, (SelectServerData.ServerState)state, addr, port);
}
NetworkManager.Instance.Close();
NetworkManager.Instance.canReconnect = false;
SelectServerData.Instance.SetDefaultServer();
EventCenter.Broadcast(EGameEvent.eGameEvent_SdkServerCheckSuccess);
}
//选择服务器
public void SelectServer(int id)
{
SelectServerData.Instance.SetSelectServer(id);
EventCenter.Broadcast(EGameEvent.eGameEvent_SelectServer);
}
//开始游戏
public void GamePlay()
{
int index = SelectServerData.Instance.curSelectIndex;
SelectServerData.ServerInfo info = SelectServerData.Instance.GetServerDicInfo().ElementAt(index).Value;
NetworkManager.Instance.canReconnect = false;
NetworkManager.Instance.Close();
NetworkManager.Instance.Init(info.addr, info.port, NetworkManager.ServerType.BalanceServer);
PlayerPrefs.SetString(SelectServerData.serverKey, info.name);
}
//SD注册成功
public void SdkRegisterSuccess(string name, string passWord)
{
SelectServerData.Instance.SetServerInfo((int)SdkManager.Instance.GetPlatFrom(), name, passWord);
NetworkManager.Instance.canReconnect = false;
NetworkManager.Instance.Close();
NetworkManager.Instance.Init(GameLogic.Instance.LoginServerAdress, GameLogic.Instance.LoginServerPort, NetworkManager.ServerType.LoginServer);
}
//SDK注消
public void SdkLogOff()
{
// NetworkManager.Instance.canReconnect = false;
// NetworkManager.Instance.Close();
EventCenter.Broadcast(EGameEvent.eGameEvent_SdkLogOff);
SdkLink();
}
// 连接SDK
public void SdkLink()
{
Debugger.Log("----sdk link----");
#if UNITY_STANDALONE_WIN || UNITY_EDITOR || SKIP_SDK
#else
if (!SdkConector.islink)
{
SdkConector.islink = true;
SdkConector.isLogOut = false;
SdkConector.Logout(1);
}
#endif
}
}
登陆界面
public class LoginWindow : BaseWindow
{
public LoginWindow()
{
mScenesType = EScenesType.EST_Login;//初始化场景类型
mResName = GameConstDefine.LoadGameLoginUI;//资源的名字
mResident = false;//不是常驻内存
}
////////////////////////////继承接口/////////////////////////
//类对象初始化
public override void Init()
{
EventCenter.AddListener(EGameEvent.eGameEvent_LoginEnter, Show);
EventCenter.AddListener(EGameEvent.eGameEvent_LoginExit, Hide);
}
//类对象释放
public override void Realse()
{
EventCenter.RemoveListener(EGameEvent.eGameEvent_LoginEnter, Show);
EventCenter.RemoveListener(EGameEvent.eGameEvent_LoginExit, Hide);
}
//窗口控件初始化,面板中有哪些button
protected override void InitWidget()
{
mLoginParent = mRoot.FindChild("Server_Choose");
mLoginInput = mRoot.FindChild("Server_Choose/Loginer");
mLoginSubmit = mRoot.FindChild("Server_Choose/Button");
mLoginAccountInput = mRoot.FindChild("Server_Choose/Loginer/AcountInput").GetComponent<UIInput>();
mLoginPassInput = mRoot.FindChild("Server_Choose/Loginer/PassInput").GetComponent<UIInput>();
mPlayParent = mRoot.Find("LoginBG");
mPlaySubmitBtn = mRoot.Find("LoginBG/LoginBtn");//开始游戏按钮
mPlayServerBtn = mRoot.Find("LoginBG/CurrentSelection");
mPlayNameLabel = mRoot.FindChild("LoginBG/CurrentSelection/Label3").GetComponent<UILabel>();
mPlayStateLabel = mRoot.FindChild("LoginBG/CurrentSelection/Label4").GetComponent<UILabel>();
mPlayAnimate = mPlaySubmitBtn.GetComponent<Animator>();
mChangeAccountBtn = mRoot.FindChild("ChangeAccount");
mChangeAccountName = mRoot.FindChild("ChangeAccount/Position/Label1").GetComponent<UILabel>();
mServerParent = mRoot.FindChild("UIGameServer");
mReLoginParent = mRoot.FindChild("LogInAgain");
mReLoginSubmit = mRoot.FindChild("LogInAgain/Status1/Button");
mVersionLable = mRoot.FindChild("Label").GetComponent<UILabel>();
mWaitingParent = mRoot.FindChild("Connecting");
UIEventListener.Get(mPlaySubmitBtn.gameObject).onClick += OnPlaySubmit;
UIEventListener.Get(mPlayServerBtn.gameObject).onClick += OnPlayServer;
UIEventListener.Get(mChangeAccountBtn.gameObject).onClick += OnChangeAccount;
UIEventListener.Get(mReLoginSubmit.gameObject).onClick += OnReLoginSubmit;
UIEventListener.Get(mLoginSubmit.gameObject).onClick += OnLoginSubmit;
mServerList.Clear();
for (int i = 0; i < 4; i++)
{
UIToggle toggle = mLoginParent.FindChild("Server" + (i + 1).ToString()).GetComponent<UIToggle>();
mServerList.Add(toggle);
}
for (int i = 0; i < mServerList.Count; i++)
{
EventDelegate.Add(mServerList.ElementAt(i).onChange, OnSelectIp);
}
DestroyOtherUI();
}
//删除Login外其他控件,例如
public static void DestroyOtherUI()
{
Camera camera = GameMethod.GetUiCamera;
for (int i = 0; i < camera.transform.childCount; i++)
{
if (camera.transform.GetChild(i) != null && camera.transform.GetChild(i).gameObject != null)
{
GameObject obj = camera.transform.GetChild(i).gameObject;
if (obj.name != "UIGameLogin(Clone)")
{
GameObject.DestroyImmediate(obj);
}
}
}
}
//窗口控件释放
protected override void RealseWidget()
{
}
//游戏事件注册
protected override void OnAddListener()
{
EventCenter.AddListener<EErrorCode>(EGameEvent.eGameEvent_LoginError, LoginFail);//登錄反饋
EventCenter.AddListener(EGameEvent.eGameEvent_LoginSuccess, LoginSuceess);
EventCenter.AddListener<string,string>(EGameEvent.eGameEvent_SdkRegisterSuccess, SdkRegisterSuccess);//sdk register success
EventCenter.AddListener(EGameEvent.eGameEvent_SdkServerCheckSuccess, SdkServerCheckSuccess);//sdk register success
EventCenter.AddListener(EGameEvent.eGameEvent_SelectServer, SelectServer);//选择了服务器
EventCenter.AddListener(EGameEvent.eGameEvent_LoginFail, ShowLoginFail);
EventCenter.AddListener(EGameEvent.eGameEvent_SdkLogOff, SdkLogOff);//点击了切换账号按钮
}
//游戏事件注消
protected override void OnRemoveListener()
{
EventCenter.RemoveListener<EErrorCode>(EGameEvent.eGameEvent_LoginError, LoginFail);
EventCenter.RemoveListener<string,string>(EGameEvent.eGameEvent_SdkRegisterSuccess, SdkRegisterSuccess);
EventCenter.RemoveListener(EGameEvent.eGameEvent_SdkServerCheckSuccess, SdkServerCheckSuccess);
EventCenter.RemoveListener(EGameEvent.eGameEvent_SelectServer, SelectServer);
EventCenter.RemoveListener(EGameEvent.eGameEvent_LoginFail, ShowLoginFail);
EventCenter.RemoveListener(EGameEvent.eGameEvent_LoginSuccess, LoginSuceess);
EventCenter.RemoveListener(EGameEvent.eGameEvent_SdkLogOff, SdkLogOff);
}
//显示
public override void OnEnable()
{
mVersionLable.text = SdkConector.GetBundleVersion();
mPlayAnimate.enabled = true;
ShowServer(LOGINUI.None);
#if UNITY_STANDALONE_WIN || UNITY_EDITOR || SKIP_SDK
mLoginInput.gameObject.SetActive(true);
#endif
}
//隐藏
public override void OnDisable()
{
}
////////////////////////////////开始游戏////////////////////////////////////
void OnPlaySubmit(GameObject go)
{
mWaitingParent.gameObject.SetActive(true);
UIEventListener.Get(mPlaySubmitBtn.gameObject).onClick -= OnPlaySubmit;
LoginCtrl.Instance.GamePlay();
}
void OnPlayServer(GameObject go)
{
ShowServer(LOGINUI.SelectServer);
}
void OnChangeAccount(GameObject go)
{
LoginCtrl.Instance.SdkLogOff();
}
void OnReLoginSubmit(GameObject go)
{
mReLoginParent.gameObject.SetActive(false);
LoginCtrl.Instance.SdkLogOff();
}
//点击登录提交
void OnLoginSubmit(GameObject go)
{
#if UNITY_STANDALONE_WIN
if (string.IsNullOrEmpty(mLoginAccountInput.value))//判断账号是否为空
return;
mLoginPassInput.value = "123";
#else
if (string.IsNullOrEmpty(mLoginAccountInput.value) || string.IsNullOrEmpty(mLoginPassInput.value))
return;
#endif
mWaitingParent.gameObject.SetActive(true);
LoginCtrl.Instance.Login(mLoginAccountInput.value, mLoginPassInput.value);//验证登录名和登录密码
}
void OnSelectIp()
{
if (UIToggle.current == null || !UIToggle.current.value)
return;
for (int i = 0; i < mServerList.Count; i++)
{
if (mServerList.ElementAt(i) == UIToggle.current)
{
LoginCtrl.Instance.SelectLoginServer(i);
break;
}
}
}
////////////////////////////////游戏事件响应////////////////////////////////////
//登录失败
void LoginFail(EErrorCode errorCode)
{
mPlayAnimate.enabled = true;
mPlaySubmitBtn.gameObject.SetActive(true);
GameObject.DestroyImmediate(mPlayEffect.gameObject);
}
//登陆失败反馈
void ShowLoginFail()
{
mReLoginParent.gameObject.SetActive(true);
mWaitingParent.gameObject.SetActive(false);
UIEventListener.Get(mPlaySubmitBtn.gameObject).onClick += OnPlaySubmit;
}
//登陆成功
void LoginSuceess()
{
UIEventListener.Get(mPlaySubmitBtn.gameObject).onClick -= OnPlaySubmit;
}
//选择了服务器
void SelectServer()
{
ShowSelectServerInfo();
ShowServer(LOGINUI.Login);
}
//显示服务器信息或者显示登录信息
void ShowServer(LOGINUI state)
{
bool showLogin = false;
bool showServer = false;
bool showSelectServer = false;
switch (state)
{
case LOGINUI.Login:
ShowSelectServerInfo();
showLogin = true;
showServer = false;
showSelectServer = false;
break;
case LOGINUI.SelectServer:
showLogin = false;
showServer = true;
showSelectServer = false;
break;
case LOGINUI.None:
showLogin = false;
showServer = false;
#if UNITY_STANDALONE_WIN || UNITY_EDITOR || SKIP_SDK
showSelectServer = true;
#endif
break;
}
mPlayParent.gameObject.SetActive(showLogin);
mServerParent.gameObject.SetActive(showServer);
mLoginParent.gameObject.SetActive(showSelectServer);
if (showLogin)
{
#if UNITY_STANDALONE_WIN || UNITY_EDITOR|| SKIP_SDK
mChangeAccountName.text = mLoginAccountInput.value;
#else
mChangeAccountName.text = SdkConector.NickName();
#endif
}
mChangeAccountBtn.gameObject.SetActive(showLogin);
}
//显示选中的server信息
void ShowSelectServerInfo()
{
SelectServerData.ServerInfo info = SelectServerData.Instance.curSelectServer;
mPlayNameLabel.text = info.name;
mPlayStateLabel.text = "(" + SelectServerData.Instance.StateString[(int)info.state] + ")";
SelectServerData.Instance.SetLabelColor(mPlayStateLabel, info.state);
}
//SDK注册成功
void SdkRegisterSuccess(string uid, string sessionId)
{
LoginCtrl.Instance.SdkRegisterSuccess(uid, sessionId);
mWaitingParent.gameObject.SetActive(true);
}
//SDK检查成功
void SdkServerCheckSuccess()
{
ShowServer(LOGINUI.Login);
mWaitingParent.gameObject.SetActive(false);
#if UNITY_STANDALONE_WIN || UNITY_EDITOR|| SKIP_SDK
#else
SdkConector.ShowToolBar(0);
#endif
}
//SDK退出,//改变登录状态,同时将账号和密码置空
void SdkLogOff()
{
ShowServer(LOGINUI.None);
mLoginPassInput.value = "";
mLoginAccountInput.value = "";
}
IEnumerator ShakeLabel()
{
mPlayEffect = GameMethod.CreateWindow(GameConstDefine.LoadGameLoginEffectPath, new Vector3(-5, -270, 0), mRoot.transform);
mPlaySubmitBtn.gameObject.SetActive(false);
yield return new WaitForSeconds(1.4f);
}
enum LOGINUI
{
None = -1,
Login,
SelectServer,
}
//开始
Transform mPlayParent;
Transform mPlaySubmitBtn;
Transform mPlayServerBtn;
UILabel mPlayNameLabel;
UILabel mPlayStateLabel;
Animator mPlayAnimate;
GameObject mPlayEffect;
//登录
Transform mLoginParent;
Transform mLoginInput;
Transform mLoginSubmit;
UIInput mLoginPassInput;
UIInput mLoginAccountInput;
//改变帐号
Transform mChangeAccountBtn;
UILabel mChangeAccountName;
//选服
Transform mServerParent;
//重新登录选择
Transform mReLoginParent;
Transform mReLoginSubmit;
//等待中
Transform mWaitingParent;
//版本号
UILabel mVersionLable;
//服务器列表
private List<UIToggle> mServerList = new List<UIToggle>();
}
邮件的model