5

Unity3D人物行为状态机和指令状态机

 3 years ago
source link: http://www.luzexi.com/2014/10/25/Unity3D%E4%BA%BA%E7%89%A9%E8%A1%8C%E4%B8%BA%E7%8A%B6%E6%80%81%E6%9C%BA%E5%92%8C%E6%8C%87%E4%BB%A4%E7%8A%B6%E6%80%81%E6%9C%BA
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Unity3D人物行为状态机和指令状态机

Unity3D人物行为状态机和指令状态机。状态机在各类游戏中都应用的比较平凡,不要以为只有角色扮演类游戏才用到状态机,但凡有物体有动作切换或者重复的指令切换都是状态机用到的地方。其实状态机到处都是,只有你想不到没有有他触及不到的地方,当然我这里主要讲有限状态机。这里省略一万字的状态机基础知识以及我的唠叨。

状态机在游戏项目中的主要运用点:

1.人物动作。一般的RPG人物最为明显,每个人物都有4-5个基本动作,比如 空闲动作,行走,攻击,受伤,施法等。把每个动作看成一个状态,就有了基本的状态,把每个状态用参数串联起来就算是状态机了。

2.AI。这个在游戏AI里表现得最为明显,用状态机写AI是最快并且最有效的方式了。每个AI也都有几个基本状态,比如 追击状态,逃跑状态,疯狂状态,巡逻状态。有了这几个状态,就可以用参数串联起来成为状态机了。

3.人物指令。这个可能很多没有写过状态机的童鞋比较难懂,他跟AI状态有点像,是为了辅助人物动作状态的。当我们把人物动作状态机定义完毕时,发现只有人物动作状态,如何去扩展除了动作以外的东西呢,比如移动,缩放。人物指令状态机就是做这事的,他相当于在动作状态机上套了又一层状态机。比如人物行走指令里,调用了动作行走状态,让人物一直保持行走动作,然后自己只要去处理人物位移就可以了,这样既有了动作也有了位移,整套移动指令就完整了。又比如攻击指令状态,发出指令后,攻击指令状态先调用行走动作状态并移动到目标点,再调用攻击动作状态,再处理攻击受伤逻辑。表现就是,一个人走到目标点攻击了另一个人。中间还可以加很多逻辑,比如判断是否处于封印状态,如果处在封印状态就不能攻击。

状态机极大的简化了对人物行为变化的处理方式,也更加容易进行扩展。Unity3D里有一个动作的状态功能Animator,他的图形界面很清晰得解释了状态机的原理。但我自己并不喜欢使用,因为我认为这个Animator限制了程序员的思维,虽然达到了可视化状态机的目的但扩展性差,所以我一直不推崇使用,不过这只是个人看法。

10039783

运用状态机时需要注意的几个问题:

1.传统网游里人物状态不太多,最多也就10个极限了,但是现在已经不是从前了,特别是单机游戏里,动不动就2,3十个状态,这个时候状态与状态之间切换逻辑就成了一个麻烦事。我们可以增加事件处理句柄来整理状态切换事件,其他方法也有很多种,运用时最好围绕让程序员容易找,容易改来,不要为了发挥设计模式而抛弃了代码清晰度。

2.输入参数。当前游戏项目中,输入参数有很多种。一种输入参数已经满足不了状态机在游戏中得运用了。而且不同的状态对于输入的参数也不同,所以我们可以面向对象方式对状态机输入进行扩做。我们定义一个Input类,里面什么都没有,每个状态或者某几个状态另开出一个类xxInput继承Input,增加里面的参数,再在输入参数时,对参数进行辨别,如果是xxInput时就对相应状态进行判定和处理。

总结:状态机没有固定框架,还得要大家自己亲自试验,最好能借鉴别人的项目或者在自己的项目里试着写入状态机。我能帮大家的也就分析解释下状态机在游戏里的运用情况,最后还得靠自己琢磨出来。

转载请注明出处:http://www.luzexi.com

October 25, 2014 · Unity3D, 游戏架构, 游戏通用模块, 前端技术

感谢您的耐心阅读

Thanks for your reading

版权申明

本文为博主原创文章,未经允许不得转载:

Unity3D人物行为状态机和指令状态机

Copyright attention

Please don't reprint without authorize.

qrcode_for_gzh.jpg

微信公众号,文章同步推送,致力于分享一个资深程序员在北上广深拼搏中对世界的理解

QQ交流群: 777859752 (高级程序书友会)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK