Unity学习简易单人FPS开发——AI实现(部分)
关于Crieria项目AI的实现
步骤一:敌方AI的生成与触发
关于敌方目标的生成采用随机布局与触发点生成——在每一次玩家初始化(读档,开始游戏,死亡)时,规定数量的AI单位自动刷新在固定区域的随机位置上;特定巡逻单位在固定位置刷新并赋予巡逻位点与侦测半径。固定AI主要起环境的作用,巡逻AI在充当环境体的同时兼具触发器开关。这是初始化随机布局的形式
关于触发AI生成的机制,大体分为两种:剧情触发,条件触发。剧情触发因素由Controller控制,在一定触发条件下Controller中的相关bool值改变,bool值作用于其场景内的AI出现点进行AI生成,在剧情走向结束后或初始化后bool值归位AI停止生成。也可以在controller中加入AI种类变化的选项来进行多样化的生成机制;条件触发种类较多,一般用于衔接剧情与游戏时间推展方向使用。多用于地形遭遇战,环境遭遇战,特殊情况遭遇战。触发点为碰撞触发或者是条件触发 :狭窄地形触发器会产生数个AI触发后Destory;区域触发进入触发持续产生AI离开区域后触发结束并Destory;巡逻探测到后条件触发持续产生AI,触发巡逻被消灭后触发结束。
Unity具体实列(Unity炸了之后补)。
步骤二:自动寻路设置与敌对AI交互机制
Unity NavMesh的设定,Unity自带有自动寻路的组件而且功能齐全:(以下为官方文档中对导航系统的描述)
导航系统允许您创建可以导航游戏世界的角色。它让你的角色能够理解他们需要走楼梯才能到达二楼,或跳过一条沟。Unity NavMesh
系统由以下部分组成:
- NavMesh(导航网格的简称)是一种数据结构,它描述了游戏世界的可行走表面,并允许在游戏世界中找到从一个可步行位置到另一个可步行位置的路径。数据结构是从您的关卡几何体自动构建或烘焙的。
- NavMesh Agent 组件
GameObject 帮助您创建在朝着目标前进时避开彼此的角色。代理商使用NavMesh了解游戏世界,他们知道如何避免彼此以及移动障碍。 - Off-Mesh Link组件允许您合并使用可行走表面无法表示的导航快捷方式。例如,跳过沟渠或围栏,或在走过它之前打开门,可以全部描述为离网链接。
- NavMeshAgent组件允许您描述代理在导航世界时应避免的移动障碍。由物理系统控制的枪管或箱子是障碍物的一个很好的例子。虽然障碍物正在移动,但是特工尽力避免它,但是一旦障碍物变得静止,它将在导航网中雕刻一个洞,以便代理人可以改变他们的路径以绕过它,或者如果固定的障碍物阻挡了路径方式,代理可以找到不同的路线。
导航主要由边界,障碍,网络和锚点组成以实现对AI的导航作用。其设置主要考虑场景建模与玩家的预设定路线有关,AI在前往玩家位置时的不同路径与适当的AI掩体,同时考虑其出生点的位置与到玩家的路径。
状态切换与动画的源码:(未优化
public class EnemyControler : MonoBehaviour
{ /// <summary>/// 敌方移动速度/// </summary>public float MoveSpeed = 3.0f;/// <summary>/// 状态变量(int)/// </summary>public int StateNum;/// <summary>/// 开火冷却/// </summary>public int ShootTimes=3;/// <summary>/// 走动距离变量/// </summary>public float WalkRange = 20f;/// <summary>/// 跑动距离变量/// </summary>public float RushRange = 30f;/// <summary>/// 开火距离变量/// </summary>public float ShootRange = 10f;/// <summary>/// 确定Player目标/// </summary>public GameObject Player;/// <summary>/// 储存Player与Enemy的位置信息/// </summary>private Vector3 transPlayer;private Vector3 transEnemy;/// <summary>/// 当前距离/// </summary>public float Range;bool isAlive;//判断Player是否存货public Animator idem;void Start(){StateNum = 1;//初始化StateNum}void FixedUpdate(){//isAlive = Player.GetComponent<PlayerControler>().isplayeralive; //确认Player存活WalkRange = RushRange - ShootRange;transEnemy = transform.position;transPlayer = Player.transform.position;Range = Vector3.Distance(transPlayer, transEnemy); //测距// if (isalive)// {if (Range > ShootRange && Range <= RushRange) //状态切换{StateNum = 3;idem.SetInteger("State", 3);}if (Range > RushRange){StateNum = 4;idem.SetInteger("State", 4);idem.SetBool("isrunning",true);}if (Range <= ShootRange){StateNum = 5;idem.SetInteger("State", 5);}// }// else// {// StateNum = 1;// }}void EnemyWalk(){}void EnemyRun(){}void EnemyCross(){}void EnemyFire(){for(int i = 0; i < ShootTimes - 1; i++){EnemyShoot();}}void Eliminate(){}void EnemyShoot(){}private void OnCollisionEnter(Collision collision){}}
)
Unity学习简易单人FPS开发——AI实现(部分)相关推荐
- [Unity学习笔记:FPS游戏制作(3)]子弹拖尾,碰撞与枪口火焰效果
往期博客[Unity学习笔记:FPS游戏制作(2)] 发射子弹----(2021.6.20学习笔记) 文章目录 一,实现思路 二,粒子效果的实现 (1)子弹拖尾特效的实现 (2)枪口火焰特效的实现 ( ...
- [Unity学习笔记:FPS游戏制作(2)] 发射子弹————(2021.6.20学习笔记)
往期博客 [Unity学习笔记:FPS游戏制作(1)]角色的移动,旋转与推进上升----(2021.6.13学习笔记) 文章目录 一,实现思路 二,实现代码 三,脚本的使用方法 四,最终效果 一,实现 ...
- [Unity学习笔记:FPS游戏制作(1)]角色的移动,旋转与推进上升————(2021.6.13学习笔记)
文章目录 一,什么是FPS游戏 二,功能实现思路与过程 (1)新建角色 (2)实现移动功能的思路 (3)实现旋转功能的思路 (4)实现推进上升功能的思路 (5)具体代码 (5)脚本的使用方法 (6)最 ...
- Unity学习笔记——坦克大战敌人AI
public static bool CanMove = true;[Header("移动速度")]public float moveSpeed = 3f;[Header(&quo ...
- Unity学习笔记:fps游戏玩家射击模块(2)
功能:玩家发射子弹,弹夹有子弹发射 无子弹等待更换弹夹.枪可以单发 连发,播放音效 动画 火花. 主角子弹根据敌人部位减血,子弹击中目标销毁.敌人向玩家头部射击,射速较慢 易于躲藏. 需求分析: 枪 ...
- Unity三维游戏开发C#编程大师班 Masterclass In C# Programing Unity 3D Game Development FPS
本课程采用现代游戏开发(Unity 2021)的最新内容和最新技术 学习任何东西的最好方法是以一种真正有趣的方式去做,这就是这门课程的来源.如果你想了解你看到的这些不可思议的游戏是如何制作的,没有比这 ...
- Unity学习笔记1 简易2D横版RPG游戏制作(一)
这个教程是参考一个YouTube上面的教程做的,原作者的教程做得比较简单,我先参考着做一遍,毕竟我也只是个初学者,还没办法完全自制哈哈.不过我之前也看过一个2D平台游戏的系列教程了,以后会整合起来,做 ...
- Unity 创建2D平台游戏开发学习教程
了解如何使用C#在Unity中创建您的第一款2D平台游戏 你会学到什么 使用Unity创建2D奥运会 使用可脚本化的对象和单一模式 使用良好的编程实践 创造武器和射弹 使用可脚本化的对象和委托模式创建 ...
- 学习一个月web开发的成果,服务器C++,数据库postgresql简易的知识分享平台
学习一个月web开发的成果,服务器C++的select模型,数据库postgresql,前台html,css,js jquery做的简易的知识分享平台,有注册,登录,知识分享(类似博文),知识浏 ...
最新文章
- 吹捧导师师娘的论文作者,被处理了!
- 京东技术主导:全新架构的分布式事务Hmily 2.1.1发布
- 动态规划 RQNOJ 吃西瓜 最大子段和三维版
- OpenCV学习笔记(一):图像显示
- 使用PHP管理SQL
- JAVA经典题--死锁案例
- stateful set 学习笔记
- 【很久之前的一篇老文章】一位程序员工作10年总结的13个忠告
- ASP.Net WebForm温故知新学习笔记:二、ViewState与UpdatePanel探秘
- 60-320-040-使用-去重-HyperLogLog 去重计数
- ie的window.open 未指明的错误_错误还是违法——离开的原因之一
- 深入JVM-性能监控工具
- JavaScript自定义滚动条
- 转--计算几何常用算法概览
- python xml解析库_Python xml解析库xml_models2
- 关于web页面中mata各种标签的解释
- Android全面屏如何做适配
- ie浏览器自动清理缓存简单设置方法
- android studio深色模式,Xamarin 中的深色模式
- 高三计算机教学计划,精选高三教学计划三篇
热门文章
- 跟着团子学SAP DMS—在SAP中通过DMS上传文档基本操作(CV01N/CV02N/CV03N/CV04N)
- uni-app 微信小程序启用组件按需注入
- 全球首次互联网8K直播,阿里工程师如何实现?
- Cutting Bamboos【主席树+二分】
- 集五福华为机试python_支付宝集五福,扫一扫用新年送礼好物华为MatePad Pro画的福试试...
- Python实现:已知化学分子的输入文件坐标(高斯计算输入文件为例),求其中任意三个原子确定的平面的法向量和单位法向量
- 常见java异常英语词汇(一)
- C#中将图片的背景去除
- alios下载_AliOS Studio(阿里编程工具)下载_AliOS Studio(阿里编程工具)官方下载-太平洋下载中心...
- 一定是最便宜的5G套餐,北京用户福利畅享5G体验