Unity Rain Ai 插件基本使用(二)
前言
在前面的教程中我们已经基本实现了路径导航和障碍物规避。
但是这样我们并没有让我们的角色学会思考,他只是机械的去完成一些步骤,这并不能体现Rain插件的智能。
一个角色他应该有多个不同的状态,待机,巡逻,发现,追逐,攻击等等。并且能够思考,自己反应自己的行为。
状态之间的转换需要信号,就像我们现实世界中,信号来源是视觉和听觉。
那我们可不可以为AI角色也添加视觉和听觉呢?
答案:当然是可以的,为了让我们的角色更加智能,就让我们来实现这个功能吧。
场景准备
我布置的场景如下
绿色胶囊体:玩家
红色小球:敌人
敌人会沿着我布置的场景中的路径做pingpong运动(巡逻)
注意:我们为所有的墙(障碍物)设置层级:wall,在导航网格的属性中设置要计算碰撞的层级。(因为在场景中如果有花草或其他我们不希望进行碰撞的物体,我们就不应该计算导航)
行为树切换
在我们开始之前,我们要知道如何在rain中进行行为树切换,我们打开敌人的Ai,
选择灯泡这个选项,这里叫做内存,在rain中你需要保存的变量在这里声明。
我们添加一个string 类型的变量model并赋值为patrol
创建一个基本的行为树MyAi_01
创建一个总的行为树MyAi
将默认SEQ(顺序)节点改为PAR(parallel)并行节点。
并使用Constraint节点,进行判断
为当前行为树绑定MyAi_01行为树
在大脑思考模式中指定行为树
运行我们发现在给行为树中我们已经通过constraint节点判断,将MyAi_01行为树绑定到了当前行为树。
这样我们可以为角色制定多套Ai,在一定条件下进行选择和转换。
为敌人添加视觉
在我们的敌人上打开rain,在眼睛图标下添加 监视器(注意此时我们添加视觉监视器)
添加后我们发现我们的敌人多了绿色的2个环
这个环的范围就是我们敌人的视觉范围
此时我们可以在检视面板调节视觉的范围参数
Range :半径
Horizontal Angle:水平角
Vertical Angle:垂直角
我们调节参数模拟出敌人的视觉范围。(此时我规定z轴为敌人的正面)
现在我们来给玩家添加信号(在rain中,叫做实体Entity)
选择player如图添加
添加视觉信号,添加后可以在面板上看到
为MyAi_01行为树添加上根据路径巡逻,运行如图,已经能够切换行为树并根据model执行。
追逐行为的实现
创建一个导航目标,并挂载到玩家的物体上。
创建一个行为树MyAi_02 用作追逐行为树,并设置目标。
在MyAi总行为树上添加该子行为树,并如上设置。model为pursuit
现在我们就可以在2个状态间转换了。如图所示:
增加攻击状态(使用自定义脚本)
创建攻击行为树MyAi_03
创建一个Custom Action 节点,并创建一个自定义脚本Test
打开Test我们看到,它继承于RAINAction,并实现了超类的几个方法。
using RAIN.Action;
using RAIN.Core; [RAINAction]
public class Test : RAINAction
{
//在该节点开始执行时调用
public override void Start(RAIN.Core.AI ai)
{
//添加一个Debug信息
Debug.Log("Attack!!");
base.Start(ai); }
//返回此操作成功还是失败
public override ActionResult Execute(RAIN.Core.AI ai)
{
return ActionResult.SUCCESS;
}
//在该节点停止时调用
public override void Stop(RAIN.Core.AI ai)
{
base.Stop(ai);
}
}
运行并切换model到attack,发现控制台输出。
我们的自定义节点已经被执行。
这一节我们主要介绍了,如何切换行为树,如何定义变量如何自定义节点,
如何巡逻,追逐,攻击。
内容比较多了,故将视觉和听觉监听放在下一节再介绍。
希望此文能够帮助到您,可以关注我已获得我发布最新的文章的通知。
Unity Rain Ai 插件基本使用(二)的更多相关文章
- Unity Rain Ai 插件基本使用(一)
1.下载安装Rain 插件 原先可以在unity的Asset Stroe 下载到,但是现在Rain 的开发公司因为人工智能的发展,公司得到投资,所以下架了rain插件. 所以我给出网盘链接 链接:ht ...
- Unity时钟定时器插件——Vision Timer源码分析之二
Unity时钟定时器插件——Vision Timer源码分析之二 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面的已经介绍了vp_T ...
- Unity的NGUI插件篇——入场效果
Unity的NGUI插件篇--入场效果 入场效果 入场效果须要借助于NGUI提供的TweenPosition类来完毕.为了说明此类的用法.本节将使会解说两个演示样例.本文选自 大学霸 <NGU ...
- Unity时钟定时器插件
Unity时钟定时器插件 http://dsqiu.iteye.com/blog/2020603https://github.com/joserocha3/KillerCircles/blob/67a ...
- 记录一个Unity播放器插件的开发
背景 公司最近在做VR直播平台,VR开发我们用到了Unity,而在Unity中播放视频就需要一款视频插件,我们调研了几个视频插件,记录两个,如下: Unity视频插件调研 网上搜了搜,最流行的有以下两 ...
- Curved UI - VR Ready Solution To Bend Warp Your Canvas 1.7,1.8,2.2,2.3 四种版本压缩包(Unity UGUI曲面插件),可以兼容VRTK
Curved UI - VR Ready Solution To Bend Warp Your Canvas 1.7,1.8,2.2,2.3 四种版本压缩包(Unity UGUI曲面插件) 可以兼容V ...
- Android插件化(二):使用DexClassLoader动态载入assets中的apk
Android插件化(二):使用DexClassLoader动态载入assets中的apk 简单介绍 上一篇博客讲到.我们能够使用MultiDex.java载入离线的apk文件.须要注意的是,apk中 ...
- 从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板
标题:从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11155 ...
- 微信小程序——表单验证插件WxValidate的二次封装(二)
在上一篇博客<微信小程序——仿jqueryValidate表单验证插件WxValidate的二次封装>中,我将WxValidate做了再次封装,简化了初始规则数据的构造,但是当有错误时页面 ...
随机推荐
- Docker安装rabbitmq
前面的文章中我们的docker已经安装好了,我的最终目的是用docker来安装rabbitmq,所以本文我记录一下我用docker安装rabbitmq的过程: 1.下载镜像(下载management的 ...
- [Reinforcement Learning] Value Function Approximation
为什么需要值函数近似? 之前我们提到过各种计算值函数的方法,比如对于 MDP 已知的问题可以使用 Bellman 期望方程求得值函数:对于 MDP 未知的情况,可以通过 MC 以及 TD 方法来获得值 ...
- Centos6.5使用yum安装mysql——快速上手必备(转载)
第1步.yum安装mysql[root@stonex ~]# yum -y install mysql-server安装结果:Installed: mysql-server.x86_64 0: ...
- php curl请求
multipart/form-data 方式 post的curl库,模拟post提交的时候,默认的方式 multipart/form-data ,这个算是post提交的几个基础的实现方式. $post ...
- IDEA - Debug - not supported in -source 1.5
- Mathematica 2
如今的数值分析,如果没有高等代数的基础,都不好意思打招呼说自己是 "有数学基础". 高等代数,解决问题的一大神器. 1,初等变换 2,特征值 | A-λE | = | λE - A ...
- mysql常用
查询表占用大小 select sum(DATA_LENGTH)+sum(INDEX_LENGTH) from information_schema.tables where table_schema= ...
- pycharm安装package时报错
在pycharm pip 包时,提示报错:module 'pip' has no attribute 'main' 原因:由于我的是pip 18.1 版本里没有main() 解决方法: 如不降级 pi ...
- SpringJUnit4ClassRunner (单元测试)
1.在Maven的pom.xml中加入 <dependency> <groupId>junit</groupId> <artifactId>junit& ...
- JAVA 数组作为方法返回值—返回地址
package Code411;/*一个方法可以有0,1,多个 参数,但只能有0和1个返回值希望一个方法产生多个结果数据进行返回 数组作为方法的参数,传递进去的是数组的地址值. */public cl ...