游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2260

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 4276|回复: 64

[士郎] 【高级AI】用Unity实现一群鸟

[复制链接]  [移动端链接]
排名
3
昨日变化

6577

主题

7095

帖子

2万

积分

Rank: 16

UID
1231
好友
185
蛮牛币
8397
威望
30
注册时间
2013-7-29
在线时间
3375 小时
最后登录
2018-7-23

社区QQ达人活力之星原创精华达人突出贡献奖财富之证游戏蛮牛QQ群会员蛮牛妹VIP

发表于 2018-1-10 15:50:59 | 显示全部楼层 |阅读模式

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

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

x
大多数人都喜欢欣赏漂亮的动物,猫、狗、鸟、鱼、虫等等很多。其中最特别的要数鸟和鱼了,因为它们不仅可以单独欣赏,还可以观赏鸟群飞翔、鱼群集体游动的壮观景象。


1.jpg 2.jpg


游戏世界里,模拟鸟群也是开发者们梦寐以求的效果。我们希望能模拟出一个栩栩如生的鸟群,同时还能让它们按照我们的需要向着目标点移动、或者在某个地方盘旋。这篇文章将演示如何制作一个漂亮的鸟群。

3.jpg


一、理论基础:
  • 鸟群本质是由一只一只的鸟组成的,每个鸟是独立行动的,只能通过视觉、听觉与外界进行有限的交互,然后做出合理的行为。有个专有名词“自主主体(Autonomous Agent)”专门描述这种自主行为的个体。
  • 虽然个体是自发行动的,但是通过遵守某些简单的规则,就可以满足群体的集体目标,比如:不发生碰撞、顺利到达目的地,或是一起在附近周旋觅食。



顺着这种思路,我们就知道了要模拟鸟群,要从每一只具体的鸟入手。让每一只鸟遵循同样的规则来实现群体效果。那么,这种规则的设计就成为了关键问题。首先,集群的模拟分为三个层次:


  • 行为选择 Action Selection: 最高层。是移动还是盘旋还是躲避敌人呢?我们要确定整体目标以及个体目标。整体目标和个体目标可以是不完全一致的,比如整体目标是移动,个体在发现敌人时要优先进行规避。
  • 引导 Steering: 中间层。群体中个体的移动和单独个体的移动当然不一样。群体中的个体要考虑的问题多很多,他总是在判断离周围的人是否太近容易碰到?是否太远脱离了队伍?是否和大家的方向一致?是否要同时躲避敌人的攻击?每个时刻,所有的因素互相影响作用,最终得出一个引导的方向和大小。
  • 行动 Locomotion: 最底层。把引导化为实际行动。在本例中,我们是利用刚体+力这种基本的物理方法来模拟的,引导是一种力,调整行动的速度。



二、搭建Unity工程

1. 新建Unity 3D工程,将Assets Store下载的《Animals Full Pack -- Birds Pack》导入到工程中以便使用。

2. 在鸟的资源的Prefab里面找一种你喜欢的鸟,我选的是海鸥。将它拷贝到Assets目录里准备使用。动画默认是用组件实现的,将它的默认动作调整为fly,还需要添加Rigidbody刚体组件才能使用力Force,参数默认即可:


4.jpg

5.jpg



3. 实现Bird脚本,是本文的主要内容,下面会详解。


三、写代码实现Bird脚本,控制每一只鸟的行为

本文对初学者来说比较有难度。建议从基本行为开始慢慢尝试,我自己写的时候也尝试了很多基本的飞行方式,最终解决了多重问题,最终才得到不错的结果。飞行方式有以下几种:


6.jpg


要实现集群效果,Seek、Flocking这两种行为是最必要的,其它行为可以参考工程代码和其他资料。基本数据和初始化如下:

7.jpg


a. Seek方式

Seek的方式是最基本的,它返回一个力(向量),引导鸟飞向目标:


8.jpg



向量运算自行画图分析,我就不啰嗦了。这个力如何使用呢?只需要在Update的每一桢调用Seek,每一桢算一次Steering引导力即可。


9.jpg

然后让引导力生效即可:

10.jpg


第一步很简单吧?接下来看终点Flocking方式。

b. Flocking


Flocking的原理不像Seek那么直观,必须参考一些资料。总的来说,集群中的鸟:需要考虑三个基本问题,分散、统一方向、聚合:


11.jpg




上图摘自游戏AI的经典书籍《Programming Game AI By Example》。如图,简单来说,只看Separation分散和Cohesion聚合,你会发现其实它俩就像弹簧一样,聚合负责压紧弹簧,分散负责弹开弹簧。当离得太近,弹力就比压力大了,当离得太远,压力又比弹力大。只要合理调整这两个力的大小,就能实现一个大小合适、密度合适的群体。


而Alignment保证大家尽可能朝向一个方向。

Flocking函数全貌如下图,可以看出每一只鸟在决定自己行为之前,要先观察所有周围的鸟,这是通过把周围的鸟加入临时容器实现的。后面的Separation、Alignment、Cohesion要用到这个容器。


12.jpg


分散力,思路是远离所有周围的人:

13.jpg


聚合力,思路是尽量飞向群体的“质心”:

14.jpg


统一方向力,思路是只看别人的速度方向,不看大小。然后向该方向移动:

15.jpg


Seek和Flocking原理完成啦!只要同时应用Flocking和Seek两种力,就能实现基本的集群效果。


16.jpg



四、关键性调整
如果只做上面的步骤,然后简单限制一下速度,你会发现效果是这样的:


1.1.gif



动画太一致不算什么问题,关键是鸟在原地悬停这个不能忍,又不是飞碟……所以还要做一些关键内容:

1、最关键的是,鸟是不会倒车的,鸟和飞机是靠转弯再转弯来实现掉头。所以,我们将引导力的向后的分量完全取消:

17.jpg


2、引导力有时会剧烈变化方向,但鸟指向的角度不要迅速变化,那样会非常假,平滑处理一下:

18.jpg


3、限制最大速度:


19.jpg


4、根据引导力的大小来控制扇动翅膀的速度,非常科学:

20.jpg


以上用到的参数都是猜想+试验得出的,其原理值得大家思考。再看看最终效果:


2.1.gif



五、还未结束

以上修改,已经达到了本文演示的目的,而且效果个人觉得还挺好看的,体现了鸟类集群飞行的美感。如果你的游戏中需要用到鸟群作为装饰,稍微优化一下算法也基本够用了。


但是深究的话,余下的问题还有很多,值得思考:


1、当引导力指向后方,我们直接去掉引导力的向后分量,会导致出现很大的转弯半径,作为演示来说挺炫酷,但是不符合实际,思考飞机转弯的例子,如果能模拟鸟类急转弯,就会更好看了。

21.jpg


2、动画方面,鸟类会综合使用扑翼、滑翔、爬升等动作,应当根据实际调整。我们目前只实现了调整动画速度,很不完美。
相信解决了以上两个问题,鸟群的模拟效果还能再上一层楼,也更符合实际。小问题总是需要花大力气解决,魔鬼总在细节之中~~


GitHub工程地址:
mayao11/GameAIAdvanced

评分

参与人数 6蛮牛币 +6 鲜花 +19 收起 理由
timessoft + 2 很给力!
gxguixin123 + 6 + 4 牛逼!
Ra蹊 + 1
LIU在闲 + 2 很给力!
370688535 + 5 很牛逼的说,之前从未考虑这么深.
public + 5 很给力!

查看全部评分


跟我念“站长妹纸萌萌哒!”我说站长,你说YO!爱你们么么哒~
回复

使用道具 举报

7日久生情
2053/5000
排名
1024
昨日变化

0

主题

212

帖子

2053

积分

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

UID
147766
好友
0
蛮牛币
499
威望
0
注册时间
2016-5-6
在线时间
857 小时
最后登录
2018-7-23
QQ
发表于 2018-1-10 16:26:27 | 显示全部楼层
感谢分享

回复

使用道具 举报

排名
975
昨日变化
1

15

主题

1095

帖子

2957

积分

Rank: 9Rank: 9Rank: 9

UID
68430
好友
12
蛮牛币
10522
威望
0
注册时间
2015-1-14
在线时间
793 小时
最后登录
2018-7-23
发表于 2018-1-10 16:53:58 | 显示全部楼层
楼主,虽然我不知道 你的方法 跟  这本书 《Unity3D人工智能编程精粹》 是否一致~~~~但是,我当时按照书里的方式,也实验了一次鸟群~~
效果是能分散飞看起来蛮好看,,但是如果加AI,那么效果就炸了~~·

1 两拨鸟群对飞~~~A群,B群
2 鸟单体会以 对方阵营某个进入 攻击范围内的鸟,为攻击目标

楼主,你如果有时间,尝试加入这两种情况,进去~~~你再看,鸟群这时就炸了,碟一起,托一坨~~各种乱~~完全没美可言了~~

点评

文章尾部有源码,你可以试试  发表于 2018-1-10 17:09
[发帖际遇]: 绝世love情缘 被钱袋砸中进医院,看病花了 2 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

5熟悉之中
767/1000
排名
6462
昨日变化
2

2

主题

306

帖子

767

积分

Rank: 5Rank: 5

UID
238701
好友
1
蛮牛币
643
威望
0
注册时间
2017-8-21
在线时间
275 小时
最后登录
2018-7-14
发表于 2018-1-10 17:24:59 | 显示全部楼层
{:107:}{:104:}

回复

使用道具 举报

7日久生情
2681/5000
排名
383
昨日变化
1

0

主题

559

帖子

2681

积分

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

UID
88896
好友
0
蛮牛币
10529
威望
0
注册时间
2015-4-2
在线时间
556 小时
最后登录
2018-7-23
发表于 2018-1-11 08:19:50 | 显示全部楼层
好文,谢谢分享

回复

使用道具 举报

5熟悉之中
659/1000
排名
3087
昨日变化

1

主题

59

帖子

659

积分

Rank: 5Rank: 5

UID
224978
好友
0
蛮牛币
2906
威望
0
注册时间
2017-6-3
在线时间
165 小时
最后登录
2018-7-2
发表于 2018-1-11 08:32:58 | 显示全部楼层

回复

使用道具 举报

5熟悉之中
843/1000
排名
2331
昨日变化
10

0

主题

45

帖子

843

积分

Rank: 5Rank: 5

UID
76365
好友
0
蛮牛币
1649
威望
0
注册时间
2015-3-1
在线时间
246 小时
最后登录
2018-7-23
发表于 2018-1-11 08:44:10 | 显示全部楼层
感谢分享

回复

使用道具 举报

5熟悉之中
767/1000
排名
6462
昨日变化
2

2

主题

306

帖子

767

积分

Rank: 5Rank: 5

UID
238701
好友
1
蛮牛币
643
威望
0
注册时间
2017-8-21
在线时间
275 小时
最后登录
2018-7-14
发表于 2018-1-11 09:22:51 | 显示全部楼层
清风有这个Advanced ANT+插件耶?分享一下呗,我学习一下

点评

我去找找,然后私信给你  发表于 2018-1-11 09:44

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1137/1500
排名
3392
昨日变化
1

9

主题

477

帖子

1137

积分

Rank: 6Rank: 6Rank: 6

UID
214924
好友
2
蛮牛币
2475
威望
0
注册时间
2017-3-28
在线时间
249 小时
最后登录
2018-7-23
发表于 2018-1-11 09:28:32 | 显示全部楼层
666666666666666

回复 支持 反对

使用道具 举报

5熟悉之中
655/1000
排名
4389
昨日变化

0

主题

151

帖子

655

积分

Rank: 5Rank: 5

UID
254155
好友
0
蛮牛币
879
威望
0
注册时间
2017-11-13
在线时间
200 小时
最后登录
2018-7-23
发表于 2018-1-11 09:32:51 | 显示全部楼层
佩服佩服

回复

使用道具 举报

7日久生情
2165/5000
排名
3291
昨日变化
1

8

主题

1099

帖子

2165

积分

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

UID
168159
好友
4
蛮牛币
5035
威望
0
注册时间
2016-9-12
在线时间
646 小时
最后登录
2018-7-23
发表于 2018-1-11 09:36:46 | 显示全部楼层

回复

使用道具 举报

5熟悉之中
752/1000
排名
3291
昨日变化
1

0

主题

121

帖子

752

积分

Rank: 5Rank: 5

UID
226471
好友
0
蛮牛币
1073
威望
0
注册时间
2017-6-12
在线时间
225 小时
最后登录
2018-7-19
发表于 2018-1-11 09:40:07 | 显示全部楼层
感谢楼主的分享!!!大赞

回复 支持 反对

使用道具 举报

5熟悉之中
752/1000
排名
3291
昨日变化
1

0

主题

121

帖子

752

积分

Rank: 5Rank: 5

UID
226471
好友
0
蛮牛币
1073
威望
0
注册时间
2017-6-12
在线时间
225 小时
最后登录
2018-7-19
发表于 2018-1-11 09:42:02 | 显示全部楼层
感谢楼主的分享!!!大赞

回复 支持 反对

使用道具 举报

5熟悉之中
930/1000
排名
2946
昨日变化
1

0

主题

237

帖子

930

积分

Rank: 5Rank: 5

UID
83972
好友
2
蛮牛币
231
威望
0
注册时间
2015-3-24
在线时间
245 小时
最后登录
2018-7-20
发表于 2018-1-11 09:46:04 | 显示全部楼层
66666666666666666666666666666666

回复 支持 反对

使用道具 举报

4四处流浪
323/500
排名
5768
昨日变化
1

1

主题

32

帖子

323

积分

Rank: 4

UID
258713
好友
0
蛮牛币
972
威望
0
注册时间
2017-12-9
在线时间
72 小时
最后登录
2018-7-23
发表于 2018-1-11 09:47:19 | 显示全部楼层
对于我等只会k帧的人来说,这简直是神级。学习了。

回复 支持 反对

使用道具 举报

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

本版积分规则

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