人物FSM

人物有限状态机
之前看这个状态机没看懂,今天又翻出来,看的略懂
FSM在游戏中应用的地方还是挺多的 怪物AI,玩家行为管理
        条件(包含若干事件)       条件(包含若干事件)
状态1<-------------------->状态2<------------------->状态3
状态之间跃迁通过条件,条件包含若干事件
1.初始化条件
// 从读表器中查找编号为i的记录
const PlayerFSMConditionInfo* pInfo = (const PlayerFSMConditionInfo*)kConditionLoader.Find(i);
if (pInfo)
{
    // 新建条件
    FSMCondition* pCondition = new FSMCondition(eFsmEvent_Amount);
    // 为条件添加事件
    for (int j = 0; j < eFsmEvent_Amount; j++)
    {
        // 因为0也代表了一个事件,所以,这里用-1来判定对应字段是否有有效数据
        if (pInfo->nEvtArray[j] != -1)
        {
            // 加入该事件包含的条件
            pCondition->AttachEvent(pInfo->nEvtArray[j]);
        }
    }
    // 将条件存入条件集合中
    m_vecConditions[i] = pCondition;
}
else
{
    m_vecConditions[i] = NULL;
}

// 不同于条件的加载过程,这里需要首先将所有状态构造出来
// 以备稍后对所有状态进行跃迁条件的设置
for (int i = 0; i < eFsmState_Amount; i++)
{
    //创建所有的状态
    m_vecStates[i] = new FSMState(i);
}

3.注册每个状态的目标状态和相应的条件
// 表格中的记录总数由读表器给出
nCount = kStateLoader.GetRecordCount();
for (unsigned int i = 0; i < nCount; i++)
{
    // 取得第i条记录
    const PlayerFSMStateInfo* pInfo = (const PlayerFSMStateInfo*)kStateLoader.Find(i);
    // 使用表格数据,注册状态跃迁信息
    // 即:nSrcStateID状态通过条件nConditionID,可跃迁至nDstStateID
    RegistTransition(pInfo->nSrcStateID, pInfo->nDstStateID, pInfo->nConditionID);
}

4.发送事件,跃迁动作
FSMCondition kCondition(eFsmEvent_Amount);
{
    OutputLog(">>>>>>>> 用户按下鼠标\n");
    kCondition.Reset();
    kCondition.AttachEvent(eFsmEvent_Click);
    m_kFSM.Transition(&kCondition);
    ShowFSMState();
}

void FSM::Transition(FSMCondition* pCondition)
{
    //根据条件将当前状态尝试进行状态跃迁
    FSMState* pState = m_pCurrentState->Transition(pCondition);
    if (pState != m_pCurrentState)
    {
        // 保存之前的状态
        m_pLastState = m_pCurrentState;

        // 设置当前状态为新的状态
        m_pCurrentState = pState;

        // 通知观察者
        Notify();
    }
}

FSMState* FSMState::Transition(FSMCondition* pCondition)
{
    for (unsigned int i = 0; i < m_vecTargetCondition.size(); i++)
    {
        //查找是否是目标条件的子集
        if (m_vecTargetCondition[i]->IsSubSetOfCondition(pCondition))
        {
            //返回对应的目标状态
            return m_vecTargetState[i];
        }
    }
    return this;
}

基本过程这样的
通过配置将条件及其所包含的事件,状态跃迁的条件配置好,程序加载读取配置文件
当动作(事件)发生时,通过该事件构造一个条件,将这个条件和当前状态的目标条件进行匹配,如果匹配上了,就返回对应的目标状态,如果发现状态不同就通知观察者就相应变化,在根据状态决定其行为
时间: 2024-10-16 08:59:58

人物FSM的相关文章

unity3d 第三人称视角的人物移动以及相机控制

何谓第三人称?就像这样: 用wasd控制人物移动,同时保持在相机的中心.用鼠标右键与滚轮控制相机的角度和距离. 先说一下人物的移动: 首先给作为主角的单位加上 Charactor Controller组件,并调整胶囊型的碰撞体刚好包裹住主角(有其是脚底,除非你想看到你的主角能遁地,或飞行) 然后给你的人物加上控制的脚本~ using UnityEngine; using System.Collections; public class move_controll : MonoBehaviour

我在现实生活中遇到了电视剧中的神奇人物

一个人读过书和没读书的有区别,读书多少质量也有区别.对面坐了一个三本的男孩子,心里只有钱,眼里嘴里不是吃就是喝,再不然就是睡,喜欢和一堆女生窝在一起叽叽喳喳炮轰一个他不喜欢的人.用公司的电脑会狠命的砸键盘,还扬言又不是我的电脑.一起团建出游时,会把坚果皮在酒店里扔的到处都是,还说会有服务生来打扫.这些都是从他和其他女生的对话中看到的,遇到这种情况,我只能笑而不语.我不太理解pahf招聘条件明明写的是本科以上,为何会招这样神奇的人进来,更让我惊讶的是周围人的学历普遍都不是很高.这和刚进这家企业,看

人物选择

1 using UnityEngine; 2 using System.Collections; 3 4 public class CharactorCreation : MonoBehaviour { 5 public GameObject[] prefabs; //在Inspector中赋值的数组 6 private GameObject[] gameobjectsPrefabs; //实例化出来的人物 7 private int length; //数组的长度 8 private int

人物上线(激活玩家之后)

人物上线block格子通知(相当重要了) 人物上线需要看到可视范围内玩家,npc,玩家,同时附近玩家也需要看到本玩家上线 对于进入地图 switch (eBlockChange) { case Map::eBlockChange_EnterMap: { m_MapBlockMgr.ProcessVisibleObjs(enterBlockPos, ProcessEnterObj);//此通知主要是玩家,NPC,怪物的通知 if(ObjID_Player == pObject->GetAttrOb

从FSM到正则表达式

本文以一个有限状态自动机(FSM)为例来介绍几种从有限状态自动机转化为正则表达式的方法. 有一个FSM能接受能被3整除的二进制串(如字符串0,其十进制为0(考虑其到初始状态,认为读到0,亦为可接受状态):字符串11,其十进制为3:字符串110,其十进制为6:......这些都可接受).这个有限自动机的图形表示如图1所示: 下面讲叙将图1所表示的FSM转化为正则表达式. 第一种方法,从实质出发: 其实质为:从A状态出发经过若干次(包括0次)转移(途径),最终恰好回到状态A.所谓求正则表达式,即对这

网络仿真中的有限状态机(FSM)

最近在看<OMNET++ User Mannul>,了解到了有限状态机的工作机制.相比早之前看过的<OPNET xxx>教材中讲解FSM不明不白,<OMENT++ User Mannul>讲解的更为清晰简洁,且有偏底层的代码做实例,更易理解. FSM是指完成模块功能的一种手法(例如OMNET++中的模块功能可选择是否由FSM完成),下文的FSM均指模块中的FSM. 构成FSM的主体为状态(State)和状态跳转(State Transition),其中状态分为两种:1)

《后会无期》的人物寓意

今日观摩了韩少的后会无期,确实不错,音乐和画面很美,包袱也能让人捧腹,但刚看完后感觉故事性不强,有些线索撒出去就断了,让我不解. 事后仔细寻思,感觉不该把剧中人物当做是一个故事的主角和配角来看,而应该把每个人物是人性格的一部分.只有这样解释才合理. 最早出现画外音,又最早消失的胡生,他代表着天真,当天真遭到仙人跳的当头棒喝后,人被顿时打醒,面对残酷现实了.天真的消失是从少年到成年的转变标志.所以胡生再也没有露面,剩下江河和马浩汉在人生道路上继续前进. 江河代表的是理想主义,即使遭受社会的戏弄式摆

北地富平人物

一.宁夏开发第一人——蒙恬 秦朝著名大将蒙恬,被誉为“中华第一勇士”,曾经是祖国西北最早的开发者,也是古代开发宁夏的第一人. 蒙恬(?-前210),山东人,出身于一个世代名将之家.蒙恬的祖父蒙骜,是战国时期秦国昭王的著名将领,官职是上卿,曾经带兵进攻韩国.赵国,夺取魏国的城池,为秦国立下了战功.父亲蒙武是秦国的副将军,与大将军王翦一起,消灭了楚国,屡次立下战功. 蒙恬是古代著名的猛将,他在秦国统一六国战争中多次打胜仗,为秦国立功.秦国在攻取六国统一中国的战争时,北方游牧民族乘机以黄河河套地区(今

Unity3D游戏开发从零单排(六) - 人物运动及攻击连击

提要 今天要实现的是一个简单人物控制器.包括用w,a,s,d来控制人物上下左右跑动,鼠标左击发出连招,都是基于老的lagacy的动画.虽然unity3d自带有charactorcontroller,但是并不是很好用,所以人物控制相关的全部自己来实现.先上效果图: 场景搭建 首先下载这个package,里面包含了人物的动作还有地面的模型.将人物和地面都拖进场景中.这里的模型默认的动画模式是lagacy,不用修改.模型有点偏小,改变模型的scale值为10.最好不要改源文件的scale的scale