2023年11月28日发(作者:)

场景有限状态机(FSM)管理(最详细)

现在⽤FSM进⾏游戏场景管理还是⽐较多,主要是场景的进⼊退出处理任务和逻辑起⽐较清晰简单,当然现在⼀般xlua的hotfix来做热补丁

的场景处理也多起来(以便于后期有副本的场景加载更新)。本篇(公司游戏没加场景动态更新前的)只介绍⽤c#处理的场景管理(后⾯有时

间加⼀篇动态的更新的场景管理):

(5).定义场景管理器SceneStateManger;并且创建登录场景LoaginSatae及相关转出条件;主场景MainState及相关转出条件;战⽃场景

BattleState及相关转出条件。

(6)定义游戏管理器GameManger,并且创建场景管理器SceneStateManger.调⽤场景⼊⼝。

3 具体代码

(1).接⼝Istate:

public interface IState

{

//场景进⼊调⽤⽅法

void OnEnter ();

{

for(int i = 0; i < ; i++)

{

if (pipelines [i].condition != null)

{

if (pipelines [i].condition ())

{

return pipelines [i].target;

}

}

//场景需求的UI和模型对象引⽤(最好动态加载)

LoginPresenter presenter;

//场景进⼊调⽤

public override void OnEnter ()

{

//设置场景条件为退出状态

Exit = true;

presenter = ("Canvas").GetComponent();

//登录场景中的场景控制器介⼊

ize (presenter);

//添加相关监听(是否获取地块信息成功)。(mvc)并且在LoginPanelController中处理相关获取的

EventListener(nfoSuccess, loc

EventListener(nfoFailure, lockInfoFail

EventListener(rInfoSuccess, etherInfoS

Listener (tice);

uccess = false;

}

string LastAcouut = ing("RememberAccount");

if(LastAcouut!= account)

{

();

}

ing("RememberAccount", account);

PlayerData data = ["PlayerData"] as PlayerData;

te = data;

s = ["actions"] as string;

//记录切换职业时间

JobTime = eTime();

//remember account psd

string isOn = (_L_Presenter.r_Psd_).ToString();

RememberPassword(_L_, _L_, isOn, ((int)loginType).ToString());

= oInt(le());

= oInt(le());

//重服务器获取天启数据后触发的回调函数

public void OnGetWetherInfoSuccess(GameEvent type)

{

rInfo info = new rInfo();

int id = (int)["WeatherType"];

= (rType)id;

rDescription = ["WeatherDescription"].ToString();

rInfo = info;

eryDiseaseMessage();

//("请求天⽓数据成功,开始获取疾病信息");

}

public void OnGetWetherInfoFailure(GameEvent evt)

{

string res = ["code"] as string;

orFrame((res));

//("请求天⽓数据失败,Errcode=="+res);

}

#endif

}

}

///

/// 微博登录

///

public void WeiBoLogin()

{

orFrame(35);

}

#endregion

}

(4.2)主场景状态机ManiScenceState:

using UnityEngine;

using tions;

using WeatherSystem;

using c;

MainScenceStateController: 各种监听函数,加载和操作显⽰。

(4.3)BatttleScenceState:

using UnityEngine;

using tions;

using WeatherSystem;

using c;

using Map;

using ;

using System;

public class BattleSceneState : SceneState

{

//场景对象引⽤接⼝

private BattleSceneStatePresnter presenter;

///主场景各种管理器... 主场景UI架构的FSM管理器;天⽓管理;地图管理;⾓⾊管理;技能管理;任务管理;商店管理..等)

public MainSceneState(string name, SceneStateManager manager) : base(name, manager) { }

public override void OnEnter()

private SceneStateManager() { }

private bool forceStop = false;

public SceneStateManager(MonoBehaviour myOwner)//, SceneState defaultScene)

{

owner = myOwner;

//初始化各个场景状态机

InitalizeSceneFSM();

// ownScene = defaultScene;

}

private SceneState current;

private SceneState last;

//场景⼊⼝函数

{

return current;

}

///

/// 每⼀帧都会被调⽤

if (name == || name == "")

{

or("your name is empty @ SceneFSM");

public GameInstance gameInstance;

public SocketManager socketManager;

public EventDispather gameEventDispatcher;

private Queue eventQueue;

public InputDetector inputSystem;

public ErrorInfoManager errorInfoManager;

public AllXmlData allXmlData;

//public PackageTimeLine myTimeLine = new PackageTimeLine(30f);

eventQueue = new Queue();

//创建输⼊对象控制器

inputSystem = new InputDetector();

//创建弹窗管理器

activity = new ActivityManager();

foreach (var item in popActs)

{

ivity(item);

}

void FixedUpdate()

{

if (isNetworkReady)

();

GetGPSInfo();

Invoke("GetGPSInfo", 1.5f);

}

//获取jps信息

public void GetGPSInfo()

{