开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:577

当前位置:游戏蛮牛 技术专区 教程分享

查看: 416|回复: 3

[自学总结] AI之有限状态机

[复制链接]  [移动端链接]
5熟悉之中
579/1000
排名
3401
昨日变化
1

1

主题

80

帖子

579

积分

Rank: 5Rank: 5

UID
48485
好友
0
蛮牛币
610
威望
0
注册时间
2014-10-11
在线时间
220 小时
最后登录
2017-2-21
QQ
发表于 2016-12-6 17:21:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
----什么是有限状态机-----------------------------------

  有限状态机拥有有限数量的状态,并且每一个状态可以切换到0个或多个状态,输入决定了下一个状态的迁移。
  有限状态机分为两种:确定性非确定性,并且非确定性的有限状态机可以转换为确定性有限状态机。



----对于有限状态机的考虑-----------------------------
  例如被攻击后转向敌人,释放技能后切换到休息状态,如果敌人过于强大会逃跑,这些问题首先直观的使用if else语句,可以这样但是通常非常难以写出来,而且的修改会很麻烦,这时候可用使用“有限状态机”来解决。

----模块设计-------------------------------------------
[size=1.333]State:
[size=0.933]是有限状态机的基类,它是一个抽象类,其中包含了一些通用的成员和方法。作为一个基类,是可以被子类继承的,所以方法是virtual的,以便于实现多态。使用时可以
[size=13.995px]继承自State,可以override基类的OnEnter / OnTick / OnExit 等方法实现个性化的一些操作。
[size=13.995px]

public abstract class State
{
    protected State(Character character)
    {
        Character = character;
    }

    public Character Character { get; private set; }

    public virtual void OnEnter()
    {
    }

    public virtual State OnTick()
    {
        return this;
    }

    public virtual void OnExit()
    {

    }
}

public class Idle : State
{
    public Idle(Character character)
        : base(character)
    {
    }

    public override State OnTick()
    {
        Character.Play(Character.Idle);
        return this;
    }
}  [size=13.995px]

[size=13.995px]

[size=13.995px]

----具体实现-------------------------------------------[size=13.995px]

public abstract class Character : MonoBehaviour
{
    private State state;
    //表示当前状态
    public State State
    {
        get
        {
            return state;
        }
        protected set
        {
            if (state == null)
                state = new Idle(this);
            if (state != value)
            {
                var old_state = state;
                state = value;
                //通知状态切换
                OnStateChanged(state, old_state);
                //调用上一个状态的退出方法
                old_state.OnExit();
                //进入当前当前状态
                state.OnEnter();
            }
        }
    }

    protected virtual void OnStateChanged(State new_state, State old_state)
    {
    }

    void Update()
    {
        if (State != null)
            //在每一帧调用当前状态的OnTick方法,根据其返回值切换状态
            State = State.OnTick();
    }
}  





回复

使用道具 举报

7日久生情
1504/5000
排名
921
昨日变化

5

主题

395

帖子

1504

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
16903
好友
2
蛮牛币
3239
威望
0
注册时间
2014-3-8
在线时间
312 小时
最后登录
2017-2-20
QQ
发表于 2016-12-7 21:27:10 | 显示全部楼层
正需要   谢谢楼主分享

回复 支持 反对

使用道具 举报

头像被屏蔽
排名
10133
昨日变化
148

0

主题

204

帖子

309

积分

UID
156480
好友
0
蛮牛币
414
威望
0
注册时间
2016-7-12
在线时间
51 小时
最后登录
2017-2-21
发表于 2016-12-29 13:31:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
[发帖际遇]: 一个袋子砸在了 东方小巴黎 头上,东方小巴黎 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

0

主题

23

帖子

28

积分

Rank: 1

UID
150093
好友
0
蛮牛币
45
威望
0
注册时间
2016-5-28
在线时间
6 小时
最后登录
2017-2-10
发表于 2017-2-7 10:03:07 | 显示全部楼层
能不能便宜点能不能便宜点能不能便宜点能不能便宜点

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表