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
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()
{
发布评论