google-code-export / colonist

Automatically exported from code.google.com/p/colonist
0 stars 1 forks source link

AI 框架改动 #14

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
由于现在加入AntLion的AI,原AI的部分行为需要改动(如AIApplyDama
ge)

1. AISoldier和AIAntLion继承AIBase
(目前AIBase的主要工作是:
(a)寻找目标(FindTarget)
(b)判断能否看到目标(CanSeeTarget)
(c)受到伤害后Halt(目前该行为只能由其子类进行,不知道大�
��有没有好的建议)
(d)寻路至(原)目标位置(后续版本加入)

2. 
武器及其它攻击方式,统一继承一个基类。同时,加入一个Sc
heduler负责切换或者选择最佳攻击方式(小兵当然不用这么复�
��,主要是为了后面的BOSS)。

目前我正在进行第一部分改动,以后我会后续的改动都发这��
�帖子上

Original issue reported on code.google.com by lightnin...@gmail.com on 16 Dec 2012 at 4:33

GoogleCodeExporter commented 9 years ago
AI Base 已经提交到SVN上 

 Scripts/AISystem/Common/AI.cs

请在那上面做修改, 
 -- (c)受到伤害后Halt(目前该行为只能由其子类进行,不知道大家有没有好的建议)
这应该只由子类进行,不应该放在基类做.不同AI行为不同,不是
每个AI都会在受伤后HALT.

 -- 2. 武器及其它攻击方式,统一继承一个基类。同时,加入一个Scheduler负责切换或者选择最佳攻击方式(小兵当然不用这么复杂,主要是为了后面的BOSS)。
武器类为什么要Scheduler呢? 
是不是应该放在对应的AI中?武器脚本的功能是,
1. 制造设计效果,
2. 判断命中
3. 发送ApplyDamage message
至于选择攻击方式和切换武器什么的,那是武器使用者脚本的�
��任,也就是AI.

Original comment by yinyuanq...@gmail.com on 16 Dec 2012 at 2:05

GoogleCodeExporter commented 9 years ago
--2.Scheduler的工作,就是编排攻击方式,同样是AI的一部分
武器脚本的功能依然没有什么变化,只是加入一个类似Helper的�
��西

但是因为每种武器(攻击方式)都应该有自己的AttackInterval(如狙
击枪和机关枪)
对于虫子(可能是Boss),除了爪击,可能还有吐网以限制玩家移动
由于吐网和爪击有各自的cooldown,所以需要一个Scheduler来决定��
�一个进攻行为是什么

(或者叫choreographer也不错哈,这词是从安卓的api上看到的)

Original comment by lightnin...@gmail.com on 16 Dec 2012 at 3:35

GoogleCodeExporter commented 9 years ago
AI的改动方向应该是按照AntPion.cs 里面的方向,也就是 
DispatchCommand -> Execute Command
目前的程序结构是一启动AI就自动运行某个Coroutine 
,这只能做为初级的AI框架.

足够弹性的框架是:

1. 在Inspector里先约束每个CommandType对应的Coroutine名字
2. DispatchCommand -> 执行Coroutine 
3. 当需要改变AI行为模式的时候,调用EndCurrentCommand 
,再调用DispatchCommand(New Command)

CommandType:
SearchAndKill = 0 //自由模式,自动查找玩家,并攻击
Patrol = 1 
//巡逻模式,在一个固定的路线上巡逻,如果看见玩家则攻击
Hold = 2 //守护在一个固定地点

Original comment by yinyuanq...@gmail.com on 17 Dec 2012 at 4:18

GoogleCodeExporter commented 9 years ago
大家可以先看看图
再往下看
这个架构基本完成,AISoldier被重写,行为和原来的一样

之前版本里面(包括目前重写的),只要进入AI的CriticalRadius距离�
��面就一定会执行
但是考虑一下这样的情况,玩家低血量+隐形来到AI旁边,突然出
现.
AI就会触发EscapeCommand(这个Command会另其他所有行为停止)
但实际上,更好的应对方案是和玩家火拼,玩家一定会比AI先死

现在,触发器是计时触发式的(每X秒触发一次)
即使EscapeCommand和AttackCommand具有相同触发时间,也一定是陆续��
�发并判断前置条件然后Dispatch

怎么让两者进入决策单元,并选择最佳方案呢?

(目前我想到的是,统一触发时间(目前人的最快反应时间是0.1s,
可以用这个数-.-),直接由决策单元触发)

Original comment by lightnin...@gmail.com on 20 Dec 2012 at 2:14

Attachments:

GoogleCodeExporter commented 9 years ago
即使EscapeCommand和AttackCommand具有相同触发时间,也一定是陆续��
�发并判断前置条件然后Dispatch

怎么让两者进入决策单元,并选择最佳方案呢?

 -这里,  ESCAPE COMMAND 的前置条件有没有包括: 
   1. 当前敌人的血量(不一定是玩家,可能是虫族NPC),如果敌人快死了,血量低于N%, 就不满足ESCAPE条件 
   2. ESCAPE的空间(如果已经是在角落, 就不满足ESCAPE条件)
此外,一些关卡不需要AI能ESCAPE,所以ESCAPE COMMAND 
的前置条件应该设为一个BOOL, 可以被控制,而不是一定会ESCAPE

Original comment by yinyuanq...@gmail.com on 21 Dec 2012 at 3:55

GoogleCodeExporter commented 9 years ago
前置条件肯定就是个bool, 
我这里用一个函数来判断是否符合前置条件。
(这样也方便触发器执行)

Original comment by lightnin...@gmail.com on 21 Dec 2012 at 4:08

GoogleCodeExporter commented 9 years ago
Hey Jeffery,

Review过 TestAI.7z的代码,有几个Comment:

1. Command的结构
一个Command既代表了数据,也代表了行为.我不赞成这样的结构.�
��个结构的特点是灵活,但是复杂.一个AI GameObject 
上面需要附加各种Command组件. 
而且Command之间,如何协调,一些公用的函数,如何共享? 
还是要靠AI类,既然这样,行为就应该放在AI类之中.Command既然称
之为Command,就应该只是各种Command数据的封装,行为的实现,应该
放在AI中.

2. AI
整体流程OK,但是细节还是过于复杂,不够简洁. 
一些重要的ROUTINE,缺少注释.
TryExecuteAllParallel, Analyse,CommandExecuteWrapper 
这些重要的函数都必须要有足够的注释. 一些属于C# 
语言特色的功能,在Unity里已有替代品, 
例如事件委托,尽量用SendMessage,或者Invoke. 
记住一点,将来代码需要提交给Apple/unity/Google 
play的人review,对方可能完全不熟悉C#, 所以, 
尽可能避免使用C#独有特色的功能, 
此外,注释要够,而且要用英文.

我会在TestAI.7z基础上做新AI框架的改动.

Original comment by yinyuanq...@gmail.com on 23 Dec 2012 at 7:35

GoogleCodeExporter commented 9 years ago
1.一开始,我也觉得command不应作为component,但是一个执行comma
nd必须先知道具体细节
假如分离出来,command还是要独自持有一些数据,即使是写coro
utine 
(返回ienumerator的)函数,实际也是把数据复制过去罢了(编��
�器生成)。

command之间没有任何联系(这是我的原意),能够独立执行(a
ttack里面那个装填弹药可以无视。。。测试等待指令用的),
唯一依赖的是AI基类,因为需要直接控制AI行为

其实我也不爱把它作为component,你们有没有其他好办法

2.中文注释(似乎只有一个地方),还有几个重要函数,没有
加上注释的原因是:这样的框架/架构,我自己也不太满意

事情委托那个会改

Original comment by lightnin...@gmail.com on 23 Dec 2012 at 10:26

GoogleCodeExporter commented 9 years ago
AI框架的一个学习对象:

魔兽争霸III 地图编辑器:

1. 单位定义界面: 
见示例人族火枪手定义界面.(Inspector)
首先通过这个界面定义一个单位的各种数据: 
攻击力,攻击方式,攻击范围,攻击动画..这就是数据.

2.AI编辑器定义:
当满足某个条件的时候,执行某个动作(Command). 
AI的本质也就是是满足某个条件,就执行某个动作.

Original comment by yinyuanq...@gmail.com on 24 Dec 2012 at 4:50

Attachments:

GoogleCodeExporter commented 9 years ago
这么看来,AI 
同一时间只能有一条指令在执行,而且要设置优先级,解决��
�指令同时触发的情况

Original comment by lightnin...@gmail.com on 24 Dec 2012 at 10:16

GoogleCodeExporter commented 9 years ago
https://docs.google.com/folder/d/0B84Qni9RlEfdVjhaU3U3eHVxbmc/edit

所有新AI框架的东东,都在这里了,包括:

1. AI Framework_v.1.0.docx 文档
2. Colonization.apk 用新AI框架搞得一个测试Demo
3. AITest_NewAIFrameWork_Demo.unitypackage 最新的资源文件.

SVN已经更新. 

Jeffery有时间的话把新的内容下载下来看看吧,我想你先了解这
个框架的工作方式,然后用这个框架做个DEMO,在这个过程里我��
�一起来做BUGFIX和拓展.

Original comment by yinyuanq...@gmail.com on 4 Jan 2013 at 8:38

GoogleCodeExporter commented 9 years ago
mark status done, all issue related to new AI framework should be thrown to 
issue 19

Original comment by yinyuanq...@gmail.com on 4 Jan 2013 at 8:42