0944340o60oyem60nyv6vu.png   这里展示的是一个很简单的普通怪物AI,当然还可以弄更复杂的BOSS级怪物的AI。
  AI Debugger

  目的是在AI Editor中实时的反应出AI执行情况,模仿Unreal的Blueprint Debugger的效果。这个功能还未完成,做了一个开头,也初步印证我的想法是可行的。

  最早期的设想比较黑科技,类似与MonoDevelop和Mono Unity Debugger的实现,可以直接读取出Unity中的AI代码运行数据从而在AI Editor中反应。不过看起来难度和工作量都颇大。

  于是真正开始实现的是另外一个方案:

  制作了一个AISpy的Unity插件,使用C++。这个AI Spy插件因为被Unity所运行,于是Ta可以被动的被Untiy C#的AI代码告知当前的AI执行情况,比如说当前行为树执行路径,AI运行情况等等。然后AI Spy开辟一个进程间的内存共享区,将当前的AI数据放入这个共享区,然后AI Editor来读取这个进程的内存共享区数据即可得到当前的AI执行数据,从而在AI Editor中反应出当前的AI情况。

  因为Unity使用了C#脚本,于是这里涉及到C++和C#的互相调用和数据传输的问题,于是这方面的知识也需要知道。

  大概的执行流程图如下:

094433zagugwdngwhz7pn7.png
  性能

  AI的性能被重点的关注,因为毕竟是一个大型消耗性能的地方。在这里也做了很多的优化,甚至是非常小粒度的优化来试图提升性能。

  首先是Action,Condition和其他一些行为节点映射到具体的真正的行为函数的实现,在早期的时候使用了C#的反射,一大好处就是简便轻松,添加新行为函数之后直接在AI json脚本里面直接写即可,但是却带来了可观的性能开销。于是后来是通过手工的字符串到函数映射来做的,虽然说代码看起来很不好看,但是性能却提高了不少。

  另外一些关于性能优化的大概总结如下:

  1.如果在编译期就能确定循环数目的,请直接手工展开语句,而不是使用循环。

  2.正则表达式非常耗性能。

  3.开方运算尽量少。

  4.Unity的transform。position等等操作相关耗性能也是可观的,尽量减少。

  5.减少性能密集型的时期,将工作量尽可能的分散开来。

  6.虚函数尽可能的减少调用。

  7.三目运算符要比if更快。

  8.避免反射。

PS:大概就是这些,欢迎探讨~

锐亚教育

锐亚教育,游戏开发论坛|游戏制作人|游戏策划|游戏开发|独立游戏|游戏产业|游戏研发|游戏运营| unity|unity3d|unity3d官网|unity3d 教程|金融帝国3|8k8k8k|mcafee8.5i|游戏蛮牛|蛮牛 unity|蛮牛