版权声明:欢迎转载,转载请注明原博客链接:http://blog.csdn.net/u013108312 和本文章的链接。谢谢合作。作者:CircleGood https://blog.csdn.net/u013108312/article/details/78824724
本文固定链接
http://blog.csdn.net/u013108312/article/details/78824724
状态机在游戏中应用还是比较广泛的,在我以前博客中关于游戏框架中有介绍,感兴趣的朋友可以去看看。那个框架是企鹅公司里面的游戏框架,好了废话不多说,直接进入今天的主题,状态机的应用。
using UnityEngine;
using System.Collections;
namespace BlGame.GameState
{
public interface IGameState
{
GameStateType GetStateType();
void SetStateTo(GameStateType gsType);
void Enter();
GameStateType Update(float fDeltaTime);
void FixedUpdate(float fixedDeltaTime);
void Exit();
}
}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
namespace BlGame.GameState
{
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)
{
ChangeGameStateTo(nextStateType);
}
}
public IGameState getState(GameStateType type)
{
if (!gameStates.ContainsKey(type))
{
return null;
}
return gameStates[type];
}
}
}
using UnityEngine;
using System.Collections;
using GameDefine;
using BlGame.GameData;
using BlGame.Resource;
using BlGame.Ctrl;
using BlGame.View;
namespace BlGame.GameState
{
class HeroState : IGameState
{
GameStateType stateTo;
GameObject mScenesRoot;
GameObject mUIRoot;
public HeroState()
{
}
public GameStateType GetStateType()
{
return GameStateType.GS_Hero;
}
public void SetStateTo(GameStateType gs)
{
stateTo = gs;
}
public void Enter()
{
SetStateTo(GameStateType.GS_Continue);
HeroCtrl.Instance.Enter();
ResourceUnit clipUnit = ResourcesManager.Instance.loadImmediate(AudioDefine.PATH_UIBGSOUND, ResourceType.ASSET);
AudioClip clip = clipUnit.Asset as AudioClip;
AudioManager.Instance.PlayBgAudio(clip);
EventCenter.AddListener<CEvent>(EGameEvent.eGameEvent_Loading, OnEvent);
EventCenter.AddListener(EGameEvent.eGameEvent_ConnectServerFail, OnConnectServerFail);
EventCenter.AddListener(EGameEvent.eGameEvent_SdkLogOff, SdkLogOff);
}
public void Exit()
{
EventCenter.RemoveListener<CEvent>(EGameEvent.eGameEvent_Loading, OnEvent);
EventCenter.RemoveListener(EGameEvent.eGameEvent_ConnectServerFail, OnConnectServerFail);
EventCenter.RemoveListener(EGameEvent.eGameEvent_SdkLogOff, SdkLogOff);
HeroCtrl.Instance.Exit();
}
public void OnConnectServerFail()
{
EventCenter.Broadcast<EMessageType>(EGameEvent.eGameEvent_ShowMessage, EMessageType.EMT_Reconnect);
}
public void FixedUpdate(float fixedDeltaTime)
{
}
public GameStateType Update(float fDeltaTime)
{
return stateTo;
}
public void OnEvent(CEvent evt)
{
switch (evt.GetEventId())
{
case EGameEvent.eGameEvent_Loading:
{
GameStateType stateType = (GameStateType)evt.GetParam("NextState");
LoadingState lState = GameStateManager.Instance.getState(GameStateType.GS_Loading) as LoadingState;
lState.SetNextState(stateType);
lState.SetFrontScenes(View.EScenesType.EST_Login);
SetStateTo(GameStateType.GS_Loading);
}
break;
}
}
private void SdkLogOff()
{
GameMethod.LogOutToLogin();
SetStateTo(GameStateType.GS_Login);
}
}
}
using UnityEngine;
using System.Collections;
using GameDefine;
using BlGame.GameData;
using System.Threading;
using BlGame.Resource;
using BlGame.View;
using BlGame.Ctrl;
using BlGame.Model;
namespace BlGame.GameState
{
class LoadingState : IGameState
{
GameStateType stateTo;
GameObject mScenesRoot;
GameObject mUIRoot;
public GameStateType mNextState;
public EScenesType mFrontScenes;
public LoadingState()
{
mNextState = GameStateType.GS_Continue;
}
public GameStateType GetStateType()
{
return GameStateType.GS_Loading;
}
public void SetNextState(GameStateType next)
{
mNextState = next;
}
public void SetFrontScenes(EScenesType front)
{
mFrontScenes = front;
}
public void SetStateTo(GameStateType gs)
{
stateTo = gs;
}
private string GetLoadMapName()
{
MapInfo map = MapLoadConfig.Instance.GetMapInfo(GameUserModel.Instance.GameMapID);
if (map == null)
{
Debug.LogError("GetLoadMapName map find fail !!!");
return "";
}
return map.mLoadScene;
}
private void LoadFinish(GameStateType state)
{
//Timer t = new Timer(this.CallBack, state, 5000, 0);
SetStateTo(state);
}
// public void CallBack(object obj)
// {
// GameStateType state = (GameStateType)obj;
// SetStateTo(state);
// }
public void Enter()
{
if (mNextState == GameStateType.GS_Continue)
return;
SetStateTo(GameStateType.GS_Continue);
//加载UI
mUIRoot = GameMethod.LoadProgress();
LoadScene.Instance.GState = mNextState;
LoadScene.Instance.OnLoadFinish += LoadFinish;
//加载场景之前需要进行清除操作
BlGame.Effect.EffectManager.Instance.DestroyAllEffect();
//清除GameObjectPool数据
GameObjectPool.Instance.Clear();
//加载场景
if (mNextState == BlGame.GameState.GameStateType.GS_Play)
{
LoadScene.Instance.isCloseBySelf = false;
string name = GetLoadMapName();
LoadScene.Instance.LoadAsignedSene("Scenes/"+name);
WindowManager.Instance.ChangeScenseToPlay(mFrontScenes);
}
else
{
//返回Pvp_Login选人界面需要清除预加载信息
ReadPreLoadConfig.Instance.Clear();
LoadScene.Instance.isCloseBySelf = true;
LoadScene.Instance.LoadAsignedSene("Scenes/Pvp_Login");
WindowManager.Instance.ChangeScenseToLogin(mFrontScenes);
}
//AudioClip clip = Resources.Load(AudioDefine.PATH_UIBGSOUND) as AudioClip;
//AudioManager.Instance.PlayBgAudio(clip);
ResourceUnit clipUnit = ResourcesManager.Instance.loadImmediate(AudioDefine.PATH_UIBGSOUND, ResourceType.ASSET);
AudioClip clip = clipUnit.Asset as AudioClip;
AudioManager.Instance.PlayBgAudio(clip);
EventCenter.AddListener(EGameEvent.eGameEvent_ConnectServerFail, OnConnectServerFail);
EventCenter.AddListener<CEvent>(EGameEvent.eGameEvent_IntoRoom, OnEvent);
}
public void Exit()
{
EventCenter.RemoveListener(EGameEvent.eGameEvent_ConnectServerFail, OnConnectServerFail);
EventCenter.RemoveListener<CEvent>(EGameEvent.eGameEvent_IntoRoom, OnEvent);
}
public void FixedUpdate(float fixedDeltaTime)
{
}
public GameStateType Update(float fDeltaTime)
{
return stateTo;
}
public void OnConnectServerFail()
{
EventCenter.Broadcast<EMessageType>(EGameEvent.eGameEvent_ShowMessage, EMessageType.EMT_Reconnect);
}
public void OnEvent(CEvent evt)
{
switch (evt.GetEventId())
{
case EGameEvent.eGameEvent_IntoRoom:
{
LoadingState lState = GameStateManager.Instance.getState(GameStateType.GS_Loading) as LoadingState;
lState.SetNextState(GameStateType.GS_Room);
lState.SetFrontScenes(View.EScenesType.EST_Play);
SetStateTo(GameStateType.GS_Loading);
}
break;
}
}
}
}
using UnityEngine;
using System.Collections;
using GameDefine;
using BlGame.Resource;
using BlGame.Ctrl;
using System;
using BlGame.View;
namespace BlGame.GameState
{
class LobbyState : IGameState
{
GameStateType stateTo;
GameObject mScenesRoot;
GameObject mUIRoot;
public LobbyState()
{
}
public GameStateType GetStateType()
{
return GameStateType.GS_Lobby;
}
public void SetStateTo(GameStateType gs)
{
stateTo = gs;
}
public void Enter()
{
SetStateTo(GameStateType.GS_Continue);
LobbyCtrl.Instance.Enter();
//AudioClip clip = Resources.Load(AudioDefine.PATH_UIBGSOUND) as AudioClip;
//AudioManager.Instance.PlayBgAudio(clip);
ResourceUnit clipUnit = ResourcesManager.Instance.loadImmediate(AudioDefine.PATH_UIBGSOUND, ResourceType.ASSET);
AudioClip clip = clipUnit.Asset as AudioClip;
AudioManager.Instance.PlayBgAudio(clip);
if (!AudioManager.Instance.LoopAudioSource.isPlaying)
{
AudioManager.Instance.LoopAudioSource.Play();
}
EventCenter.AddListener<CEvent>(EGameEvent.eGameEvent_IntoRoom, OnEvent);
EventCenter.AddListener<CEvent>(EGameEvent.eGameEvent_Loading, OnEvent);
EventCenter.AddListener<CEvent>(EGameEvent.eGameEvent_IntoHero, OnEvent);
EventCenter.AddListener(EGameEvent.eGameEvent_SdkLogOff, SdkLogOff);
EventCenter.AddListener<UInt64,string>(EGameEvent.eGameEvent_InviteCreate, InviteAddFriend);
EventCenter.AddListener<string>(EGameEvent.eGameEvent_InviteAddRoom, InviteAddRoom);
EventCenter.AddListener(EGameEvent.eGameEvent_ReconnectToBatttle, ReconnectToBatttle);
}
private void SdkLogOff()
{
GameMethod.LogOutToLogin();
SetStateTo(GameStateType.GS_Login);
}
private void InviteAddRoom(string arg1)
{
InviteRoomCtrl.Instance.Enter();
}
private void InviteAddFriend(UInt64 sGUID ,string temp)
{
if (InviteCtrl.Instance.AddDic(sGUID, temp) && InviteCtrl.Instance.InvatiDic.Count > 1)
{
InviteCtrl.Instance.ChangeInvite(sGUID, temp);
}else
InviteCtrl.Instance.Enter(sGUID,temp);
}
public void Exit()
{
LobbyCtrl.Instance.Exit();
EventCenter.RemoveListener<CEvent>(EGameEvent.eGameEvent_IntoRoom, OnEvent);
EventCenter.RemoveListener<CEvent>(EGameEvent.eGameEvent_Loading, OnEvent);
EventCenter.RemoveListener<CEvent>(EGameEvent.eGameEvent_IntoHero, OnEvent);
EventCenter.RemoveListener(EGameEvent.eGameEvent_SdkLogOff, SdkLogOff);
EventCenter.RemoveListener<UInt64,string>(EGameEvent.eGameEvent_InviteCreate, InviteAddFriend);
EventCenter.RemoveListener<string>(EGameEvent.eGameEvent_InviteAddRoom, InviteAddRoom);
EventCenter.RemoveListener(EGameEvent.eGameEvent_ReconnectToBatttle, ReconnectToBatttle);
}
public void FixedUpdate(float fixedDeltaTime)
{
}
public GameStateType Update(float fDeltaTime)
{
return stateTo;
}
public void OnEvent(CEvent evt)
{
switch (evt.GetEventId())
{
case EGameEvent.eGameEvent_IntoRoom:
SetStateTo(GameStateType.GS_Room);
break;
case EGameEvent.eGameEvent_IntoHero:
GameStateManager.Instance.ChangeGameStateTo(GameStateType.GS_Hero);
break;
case EGameEvent.eGameEvent_Loading:
GameStateType stateType = (GameStateType)evt.GetParam("NextState");
LoadingState lState = GameStateManager.Instance.getState(GameStateType.GS_Loading) as LoadingState;
lState.SetNextState(stateType);
lState.SetFrontScenes(View.EScenesType.EST_Login);
SetStateTo(GameStateType.GS_Loading);
break;
}
}
public void ReconnectToBatttle()
{
EventCenter.Broadcast<EMessageType>(EGameEvent.eGameEvent_ShowMessage, EMessageType.EMT_ReEnter);
}
}
}
using UnityEngine;
using System.Collections;
using GameDefine;
using BlGame.Resource;
using BlGame.Ctrl;
namespace BlGame.GameState
{
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);
//yaz修改
//mScenesRoot = GameObject.Instantiate(Resources.Load(GameConstDefine.GameLogin)) as GameObject;
//mUIRoot = LoadUiResource.LoadRes(GameMethod.GetUiCamera.transform, GameConstDefine.LoadGameLoginUI);
//AudioClip clip = Resources.Load(AudioDefine.PATH_UIBGSOUND) as AudioClip;
ResourceUnit sceneRootUnit = ResourcesManager.Instance.loadImmediate(GameConstDefine.GameLogin, ResourceType.PREFAB);
mScenesRoot = GameObject.Instantiate(sceneRootUnit.Asset) as GameObject;
//mUIRoot = LoadUiResource.LoadRes(GameMethod.GetUiCamera.transform, GameConstDefine.LoadGameLoginUI);
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;
}
}
}
}
using UnityEngine;
using System.Collections;
using GameDefine;
using BlGame.Effect;
using BlGame.Resource;
using BlGame.Ctrl;
using BlGame.View;
using BlGame.GameEntity;
using BlGame.Model;
namespace BlGame.GameState
{
class OverState : IGameState
{
GameStateType stateTo;
GameObject mScenesRoot;
GameObject mUIRoot;
float mTime;
bool mNeedUpdate;
bool mNeedScore;
public OverState()
{
}
public GameStateType GetStateType()
{
return GameStateType.GS_Over;
}
public void SetStateTo(GameStateType gs)
{
stateTo = gs;
}
public void Enter()
{
SetStateTo(GameStateType.GS_Continue);
mTime = 0;
mNeedUpdate = true;
mNeedScore = true;
//AudioClip clip = Resources.Load(AudioDefine.PATH_UIBGSOUND) as AudioClip;
//AudioManager.Instance.PlayBgAudio(clip);
ResourceUnit clipUnit = ResourcesManager.Instance.loadImmediate(AudioDefine.GetMapBgAudio((MAPTYPE)GameUserModel.Instance.GameMapID), ResourceType.ASSET);
AudioClip clip = clipUnit.Asset as AudioClip;
AudioManager.Instance.PlayBgAudio(clip);
AdvancedGuideCtrl.Instance.Exit();
EventCenter.AddListener<CEvent>(EGameEvent.eGameEvent_Loading, OnEvent);
EventCenter.AddListener<CEvent>(EGameEvent.eGameEvent_IntoRoom, OnEvent);
EventCenter.AddListener<CEvent>(EGameEvent.eGameEvent_IntoLobby, OnEvent);
EventCenter.AddListener(EGameEvent.eGameEvent_ConnectServerFail, OnConnectServerFail);
}
public void Exit()
{
EventCenter.RemoveListener<CEvent>(EGameEvent.eGameEvent_Loading, OnEvent);
EventCenter.RemoveListener<CEvent>(EGameEvent.eGameEvent_IntoRoom, OnEvent);
EventCenter.RemoveListener<CEvent>(EGameEvent.eGameEvent_IntoLobby, OnEvent);
EventCenter.RemoveListener(EGameEvent.eGameEvent_ConnectServerFail, OnConnectServerFail);
//GameMethod.DisableAllUI();
GameMethod.RemoveUI("superwan(Clone)");
PlayerManager.Instance.LocalPlayer.CleanWhenGameOver();
JxBlGame.Instance.OpenConnectUI();
GameObjectPool.Instance.Clear();
}
public void FixedUpdate(float fixedDeltaTime)
{
}
public GameStateType Update(float fDeltaTime)
{
if (!mNeedUpdate)
return stateTo;
mTime += fDeltaTime;
if (UIGuideModel.Instance.GuideType == GCToCS.AskCSCreateGuideBattle.guidetype.first)
{
if (mTime > 6)
{
CGLCtrl_GameLogic.Instance.EmsgToss_AskReEnterRoom();
mNeedUpdate = false;
UIGuideCtrl.Instance.GuideBattleType(GCToCS.AskCSCreateGuideBattle.guidetype.other);
}
}
else
{
if (mTime > 18)
{
ScoreCtrl.Instance.Exit();
CGLCtrl_GameLogic.Instance.EmsgToss_AskReEnterRoom();
mNeedUpdate = false;
}
else if (mNeedScore && mTime > 6)
{
ScoreCtrl.Instance.Enter();
mNeedScore = false;
}
}
return stateTo;
}
public void OnEvent(CEvent evt)
{
switch (evt.GetEventId())
{
case EGameEvent.eGameEvent_Loading:
{
GameStateType stateType = (GameStateType)evt.GetParam("NextState");
LoadingState lState = GameStateManager.Instance.getState(GameStateType.GS_Loading) as LoadingState;
lState.SetNextState(stateType);
lState.SetFrontScenes(View.EScenesType.EST_Play);
SetStateTo(GameStateType.GS_Loading);
}
break;
case EGameEvent.eGameEvent_IntoRoom:
{
LoadingState lState = GameStateManager.Instance.getState(GameStateType.GS_Loading) as LoadingState;
lState.SetNextState(GameStateType.GS_Room);
lState.SetFrontScenes(View.EScenesType.EST_Play);
SetStateTo(GameStateType.GS_Loading);
}
break;
case EGameEvent.eGameEvent_IntoLobby:
{
LoadingState lState = GameStateManager.Instance.getState(GameStateType.GS_Loading) as LoadingState;
lState.SetNextState(GameStateType.GS_Lobby);
lState.SetFrontScenes(View.EScenesType.EST_Play);
SetStateTo(GameStateType.GS_Loading);
}
break;
}
}
private void OnConnectServerFail()
{
EventCenter.Broadcast<EMessageType>(EGameEvent.eGameEvent_ShowMessage, EMessageType.EMT_Disconnect);
}
}
}
using UnityEngine;
using System.Collections;
using GameDefine;
using BlGame.GameData;
using BlGame.GameEntity;
using BlGame.GuideDate;
using BlGame.Resource;
using BlGame.Model;
using BlGame.Ctrl;
using BlGame.View;
using System;
using System.Linq;
namespace BlGame.GameState
{
class PlayState : IGameState
{
GameStateType stateTo;
GameObject mScenesRoot;
GameObject mUIRoot;
//地图相机类型
public int mCameraType = 1;
public int ShopID = 0;
public PlayState()
{
}
public GameStateType GetStateType()
{
return GameStateType.GS_Play;
}
public void SetStateTo(GameStateType gs)
{
stateTo = gs;
}
public void Enter()
{
SetStateTo(GameStateType.GS_Continue);
IGuideMidMatchTip.Instance.RegisterListerner();
switch (PlayerManager.Instance.LocalAccount.ObType)
{
case ObPlayerOrPlayer.PlayerType:
GamePlayCtrl.Instance.Enter();
break;
case ObPlayerOrPlayer.PlayerObType:
mUIRoot = LoadUiResource.LoadRes(GameMethod.GetUiCamera.transform, GameConstDefine.LoadGameViewer);
break;
}
JxBlGame.Instance.PlayStart();
CGLCtrl_GameLogic.Instance.AskLoadComplete();
ResourceUnit clipUnit = ResourcesManager.Instance.loadImmediate(AudioDefine.GetMapBgAudio((MAPTYPE)GameUserModel.Instance.GameMapID), ResourceType.ASSET);
AudioClip clip = clipUnit.Asset as AudioClip;
AudioManager.Instance.PlayBgAudio(clip);
//正常流程
EventCenter.AddListener<UInt64>(EGameEvent.eGameEvent_GameOver, OnGameOver);
//新手引导流程
EventCenter.AddListener<CEvent>(EGameEvent.eGameEvent_Loading, OnEvent);
EventCenter.AddListener(EGameEvent.eGameEvent_ConnectServerFail, OnConnectServerFail);
EventCenter.AddListener(EGameEvent.eGameEvent_SdkLogOff, SdkLogOff);
EventCenter.AddListener(EGameEvent.eGameEvent_ReconnectToBatttle, OnReconnectToBatttle);
//获取地图信息
GetMapType();
}
public void GetMapType()
{
if (UIGuideModel.Instance.GuideType == GCToCS.AskCSCreateGuideBattle.guidetype.first)
{
UIGuideCtrl.Instance.Enter();
GamePlayGuideModel.Instance.NowTaskId = 90004;
EventCenter.Broadcast(EGameEvent.eGameEvent_PlayTaskModelFinish);
}
else if (UIGuideModel.Instance.GuideType == GCToCS.AskCSCreateGuideBattle.guidetype.second)
{
AdvancedGuideCtrl.Instance.Enter();
UIGuideCtrl.Instance.GuideBattleType(GCToCS.AskCSCreateGuideBattle.guidetype.other);
}
//获取当前游戏地图数据
string levelName = Application.loadedLevelName;
MapInfo mapInfo = MapLoadConfig.Instance.GetMapInfo(levelName);
if (mapInfo == null)
Debug.LogError("can not find levelName in MapLoadCfg.xml!");
mCameraType = mapInfo.mCameraType;
GamePlayCtrl.Instance.SetShopID(mapInfo.mShopID);
}
public void Exit()
{
EventCenter.RemoveListener<UInt64>(EGameEvent.eGameEvent_GameOver, OnGameOver);
EventCenter.RemoveListener<CEvent>(EGameEvent.eGameEvent_Loading, OnEvent);
EventCenter.RemoveListener(EGameEvent.eGameEvent_ConnectServerFail, OnConnectServerFail);
EventCenter.RemoveListener(EGameEvent.eGameEvent_SdkLogOff, SdkLogOff);
EventCenter.RemoveListener(EGameEvent.eGameEvent_ReconnectToBatttle, OnReconnectToBatttle);
LoadUiResource.DestroyLoad(mUIRoot);
GamePlayCtrl.Instance.Exit();
}
public void FixedUpdate(float fixedDeltaTime)
{
}
public GameStateType Update(float fDeltaTime)
{
return stateTo;
}
private void OnGameOver(UInt64 BaseGuid)
{
PlayFinishVedio(BaseGuid);
GameStateManager.Instance.ChangeGameStateTo(GameStateType.GS_Over);
}
public void OnEvent(CEvent evt)
{
switch (evt.GetEventId())
{
case EGameEvent.eGameEvent_Loading:
{
GameStateType stateType = (GameStateType)evt.GetParam("NextState");
LoadingState lState = GameStateManager.Instance.getState(GameStateType.GS_Loading) as LoadingState;
lState.SetNextState(stateType);
lState.SetFrontScenes(View.EScenesType.EST_Play);
SetStateTo(GameStateType.GS_Loading);
}
break;
}
}
private void OnConnectServerFail()
{
EventCenter.Broadcast<EMessageType>(EGameEvent.eGameEvent_ShowMessage, EMessageType.EMT_Reconnect);
}
private void SdkLogOff()
{
GameMethod.LogOutToLogin();
LoadingState lState = GameStateManager.Instance.getState(GameStateType.GS_Loading) as LoadingState;
lState.SetNextState(GameStateType.GS_Login);
lState.SetFrontScenes(View.EScenesType.EST_Play);
SetStateTo(GameStateType.GS_Loading);
}
private void OnReconnectToBatttle()
{
CGLCtrl_GameLogic.Instance.EmsgToss_AskEnterBattle(GameUserModel.Instance.GameBattleID);
}
//播放特效
void PlayFinishVedio(UInt64 ObjID)
{
BlGame.AudioManager.Instance.StopHeroAudio();
GameTimeData.Instance.EndCountTime();
ProgressBarInterface.hideProgressBar();
//UIPlay.OpenUIPlay(false);
//if (UIDeathInterface.Instance != null)
//{
// GameObject.DestroyImmediate(UIDeathInterface.Instance.gameObject);
//}
DeathCtrl.Instance.Exit();
Iselfplayer player = PlayerManager.Instance.LocalPlayer;
if (player != null)
{
player.RemoveRuinWarning();
}
GameMethod.CreateWindow(GameConstDefine.GameOverBoxPath, Vector3.zero, GameMethod.GetUiCamera.transform);
if (Camera.main != null && Camera.main.gameObject != null)
{
Camera.main.gameObject.AddComponent<BaseDaBomb>();
}
GameMethod.GetMainCamera.target = null;
GameMethod.GetMainCamera.enabled = false;
//ToReview wincamp没用上
UInt64 sGUID;
sGUID = ObjID;
Ientity entity = EntityManager.Instance.GetEntity(sGUID);
for (int i = EntityManager.AllEntitys.Count - 1; i >= 0; i--)
{
var item = EntityManager.AllEntitys.ElementAt(i);
if (item.Value.RealEntity != null)
{
item.Value.RealEntity.PlayerFreeAnimation();
item.Value.RealEntity.SyncEntity = null;
item.Value.RealEntity.enabled = false;
}
if (item.Value.entityType == EntityType.Player || item.Value.entityType == EntityType.Building)
continue;
EntityManager.AllEntitys.Remove(item.Key);
}
if (entity != null)
{
BaseDaBomb.Instance.SetBaseBomb(true, entity, GameUserModel.Instance.GameMapID); //ToReview int->uint
}
AltarData.Instance.DelAllAltar();
BattleingData.Instance.ClearAllGoods();
BattleingData.Instance.ClearAllBattleData();
}
}
}
using UnityEngine;
using System.Collections;
using GameDefine;
using BlGame.GameData;
using BlGame.Resource;
using BlGame.Ctrl;
using System;
using BlGame.View;
namespace BlGame.GameState
{
class RoomState : IGameState
{
GameStateType stateTo;
GameObject mScenesRoot;
GameObject mUIRoot;
public RoomState()
{
}
public GameStateType GetStateType()
{
return GameStateType.GS_Room;
}
public void SetStateTo(GameStateType gs)
{
stateTo = gs;
}
public void Enter()
{
SetStateTo(GameStateType.GS_Continue);
RoomCtrl.Instance.Enter();
//AudioClip clip = Resources.Load(AudioDefine.PATH_UIBGSOUND) as AudioClip;
//AudioManager.Instance.PlayBgAudio(clip);
ResourceUnit clipUnit = ResourcesManager.Instance.loadImmediate(AudioDefine.PATH_UIBGSOUND, ResourceType.ASSET);
AudioClip clip = clipUnit.Asset as AudioClip;
AudioManager.Instance.PlayBgAudio(clip);
EventCenter.AddListener<CEvent>(EGameEvent.eGameEvent_RoomBack, OnEvent);
EventCenter.AddListener<CEvent>(EGameEvent.eGameEvent_IntoHero, OnEvent);
EventCenter.AddListener<UInt64,string>(EGameEvent.eGameEvent_InviteCreate, InviteAddFriend);
EventCenter.AddListener(EGameEvent.eGameEvent_SdkLogOff, SdkLogOff);
EventCenter.AddListener(EGameEvent.eGameEvent_ConnectServerFail, OnConnectServerFail);
}
private void InviteAddFriend(UInt64 sGUID,string temp)
{
if (InviteCtrl.Instance.AddDic(sGUID, temp) && InviteCtrl.Instance.InvatiDic.Count > 1)
{
InviteCtrl.Instance.ChangeInvite(sGUID, temp);
}
else
InviteCtrl.Instance.Enter(sGUID, temp);
}
public void Exit()
{
EventCenter.RemoveListener<CEvent>(EGameEvent.eGameEvent_RoomBack, OnEvent);
EventCenter.RemoveListener<CEvent>(EGameEvent.eGameEvent_IntoHero, OnEvent);
EventCenter.RemoveListener<UInt64, string>(EGameEvent.eGameEvent_InviteCreate, InviteAddFriend);
EventCenter.RemoveListener(EGameEvent.eGameEvent_SdkLogOff, SdkLogOff);
EventCenter.RemoveListener(EGameEvent.eGameEvent_ConnectServerFail, OnConnectServerFail);
RoomCtrl.Instance.Exit();
}
public void FixedUpdate(float fixedDeltaTime)
{
}
public GameStateType Update(float fDeltaTime)
{
return stateTo;
}
public void OnEvent(CEvent evt)
{
switch (evt.GetEventId())
{
case EGameEvent.eGameEvent_RoomBack:
SetStateTo(GameStateType.GS_Lobby);
break;
case EGameEvent.eGameEvent_IntoHero:
SetStateTo(GameStateType.GS_Hero);
break;
}
}
private void SdkLogOff()
{
GameMethod.LogOutToLogin();
SetStateTo(GameStateType.GS_Login);
}
private void OnConnectServerFail()
{
EventCenter.Broadcast<EMessageType>(EGameEvent.eGameEvent_ShowMessage, EMessageType.EMT_Disconnect);
}
}
}
using UnityEngine;
using System.Collections;
using GameDefine;
using BlGame.Resource;
using BlGame.Ctrl;
namespace BlGame.GameState
{
class UserState : IGameState
{
GameStateType stateTo;
GameObject mScenesRoot;
public UserState()
{
}
public GameStateType GetStateType()
{
return GameStateType.GS_User;
}
public void SetStateTo(GameStateType gs)
{
stateTo = gs;
}
public void Enter()
{
SetStateTo(GameStateType.GS_Continue);
EventCenter.Broadcast(EGameEvent.eGameEvent_UserEnter);
//AudioClip clip = Resources.Load(AudioDefine.PATH_UIBGSOUND) as AudioClip;
//AudioManager.Instance.PlayBgAudio(clip);
ResourceUnit clipUnit = ResourcesManager.Instance.loadImmediate(AudioDefine.PATH_UIBGSOUND, ResourceType.ASSET);
AudioClip clip = clipUnit.Asset as AudioClip;
AudioManager.Instance.PlayBgAudio(clip);
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_IntoLobby, OnEvent);
EventCenter.RemoveListener(EGameEvent.eGameEvent_SdkLogOff, SdkLogOff);
EventCenter.Broadcast(EGameEvent.eGameEvent_UserExit);
}
public void FixedUpdate(float fixedDeltaTime)
{
}
public GameStateType Update(float fDeltaTime)
{
return stateTo;
}
public void OnEvent(CEvent evt)
{
switch (evt.GetEventId())
{
case EGameEvent.eGameEvent_IntoLobby:
GameStateManager.Instance.ChangeGameStateTo(GameStateType.GS_Lobby);
break;
}
}
}
}
本文固定链接
http://blog.csdn.net/u013108312/article/details/78824724