此专栏为B站视频 av28779788 的三部分 Unity脚本部分《英雄无敌》项目的敌人模块和敌人生成器模块的思路梳理。至于为什么要写成专栏,一是为了自己留存,二是为了知识分享,如果有疑问,欢迎来提问;如果发现错误,请您务必指正,谢谢。

一、策划需求分析

敌人模块:敌人模块策划

将策划内容细分可分为:敌人的行为:前进,转向下一个目标点,沿路线寻路到终点

敌人的状态:血量,受伤减血,死亡

敌人需要用到的动画:跑步,攻击,闲置,死亡

根据需求确定编写四个类:通过敌人AI去控制上面三个类

提前设定好的敌人移动路线结构

EnemyMotor类:敌人马达,提供移动、旋转、寻路功能

移动功能:

通过改变物体Transform的z轴位置实现,需要变量 移动速度(moveSpeed)

因为是在Update里调用所以要通过moveSpeed*Time.deltaTime来保证不同渲染帧间隔下移动的距离相同。

转向目标点功能:

Transform类的LookAt(Vector3 targetPoint)方法可以实现,targetPoint为目标点的三维坐标,所以该方法需要传入目标点的三维坐标。

寻路功能:

技巧:为了方便测试寻路方法能否实现,可以先写入Transform[ ]类型的公开字段,再在unity里直接将WayPoint拖进脚本

寻路功能需要返回一个bool类型的返回值,来表示是否可以继续寻路(false:否,true:是);当路线不为空或到达终点时为返回false,否则调用LookRotation(targetPoint)和MovementForward()方法,并进行判断当前物体和目标点的距离是否接近,如果接近,将目标点定为下一个目标点,最后返回true

到这里EnemyMotor的功能基本实现,在Update()里调用PathFinding方法测试

测试效果如图

EnemyStatusInfo类:敌人状态信息类,定义敌人信息,提供受伤死亡功能

敌人当前血量:

定义字段:

敌人最大血量:

定义字段:

受伤功能:

通过每次调用减少敌人当前血量的方法实现,需要传入float类型变量amount表示应减少的血量,为了防止敌人当前血量变为负数,判断HP是否大于amount,如果大于,正常减少,否则HP = 0,并调用死亡的方法(因为死亡方法还没写,先以注释形式写出)

死亡功能:

摧毁敌人物体,可以用Object类里的Destroy方法实现,因为死亡前还要播放动画,所以摧毁模型需要一定的时间延迟,定义float类型字段deathDelay来表示死亡延迟时间

该方法写完后去掉Damage方法里的注释符

在OnGUI()方法内设置按钮调用Damage(amount)方法测试

Game面板现象

Component现象

为防止后期更换动画导致脚本大面积改动,将动画分成两个类实现:EnemyAnimation类:敌人状态信息类,定义敌人信息,提供受伤死亡功能

AnimationAction类(工具类):动画行为类,提供有关动画的行为

先编写AnimationAction类:因为此类为工具类,所以不需要继承MonoBehaviour

定义字段:

播放动画功能:通过Animation类的CrossFade(animName)实现,所以该方法需要传入应播放的动画的名字

判断动画是否正在播放功能:通过Animation类的IsPlaying(animName)方法实现,正在播放返回true,否则false

构造函数:为了获取附加在敌人身上的动画组件引用,所以构造函数需要传入Animation类的变量赋值给字段anim

再编写EnemyAnimation类:

定义字段(需要用到的动画):

定义字段:

为防止物体最初就要播放动画但action未初始化造成的异常,所以Awake()方法内对action初始化;因为Animation组件实在Model上而不是在Soldier1上,所以要通过GetComponentInChildren()方法获取Model上的组件

因为未写EnemyAI类所以无法检验动画播放

EnemyAI类:判断敌人状态,执行相应行为

定义枚举(列出敌人所有的状态):

定义字段:

定义字段(因为EnemyAI要用到EnemyMotor和EnemyAnimation的方法):

在Start()内对motor和anim进行定义

判断状态功能:因为要一直判断状态,所以在Update内写switch判断(因为对应方法还没编写,所以加上注释)

攻击方法Attack():播放攻击动画,攻击后播放闲置动画,重复执行,所以需要定义攻击计时器字段atkTimer和攻击间隔时间字段atkInterval,为了让攻击动画播放全,所以播放闲置动画前要判断攻击动画是否播放完

寻路方法PathFinding():执行EnemyMotor的寻路方法,如果返回值为true则播放跑步动画,否则将当前敌人状态变为Attack

死亡方法Death():为了防止反复播放死亡动画,设置bool类型字段live标记敌人是否存活,并在判断状态前加上判断

因为敌人死亡方法的执行是在EnemyStatusInfo类执行的,所以要对该类的Death方法进行修改,要改变EnemyAI的当前敌人状态

而EnemyAI类内的Death方法执行:将live状态变为false,并播放死亡动画

将EnemyAnimation填上对应的动画名字

测试结果(开枪的火光没有设置,请忽略):

到这里敌人模块基本完成,在编写敌人生成器时,还会进行部分修改,敌人生成器部分会在《Unity学习笔记一:敌人模块和敌人生成器模块脚本编写思路梳理(2)》中列出(绝对不是因为这次写累了,不想写了( ̄▽ ̄)")

unity自动生成敌人_Unity学习笔记一:敌人模块和敌人生成器模块脚本编写思路梳理(1)...相关推荐

  1. Unity API常用方法和类学习笔记2

    Unity API常用方法和类学习笔记2 ------Mathf & Input & Vector & Random 类Mathf 一.静态变量 print(Mathf.Deg ...

  2. Unity开发基础——使用字符串学习笔记

    蓝鸥Unity开发基础使用字符串学习笔记 本节内容:使用字符串:字符串拼接.转义字符 一.字符串拼接:字符串可以使用+或+=进行字符串拼接!! using System; namespace Less ...

  3. Unity API常用方法和类学习笔记1

    Unity API常用方法和类学习笔记1 ------主要构架(Unity-Engine.GameObject.Component) 事件 一.事件执行顺序 二.测试代码 using System.C ...

  4. Unity的VRTK捡拾物体学习笔记

    Unity的VRTK捡拾物体学习笔记 1.VRTK捡拾物体设置: 2.VRTK可交互对象设置: 3.触摸设置: 4.触摸设置2:

  5. Auto_ML自动机器学习之TPOT——学习笔记(1)

    Auto_ML自动机器学习之TPOT--学习笔记(1) 前言 TPOT简介 入门练习 练习 前言 没有python的基础,也不是程序员,而自动机器学习也号称要让我们这些小白会用,遂学之. TPOT简介 ...

  6. Auto_ML自动机器学习之TPOT——学习笔记(2)

    Auto_ML自动机器学习之TPOT--学习笔记(2) 数据预处理 mat文件格式转化为csv 批量读取文件路径 整合--批量mat转csv多文件合并 数据预处理 mat文件格式转化为csv 环境 W ...

  7. 智能网联汽车自动驾驶仿真技术学习笔记(一)

    智能网联汽车自动驾驶仿真技术学习笔记(一) 绪论 一.自动驾驶汽车分级 二.先进驾驶辅助系统 三.环境感知传感器 四.自动驾驶仿真系统的构成 五.自动驾驶功能测试 绪论 一.自动驾驶汽车分级 以下是由 ...

  8. 从零写一个具有IOC-AOP-MVC功能的框架---学习笔记---11. MVC功能之http请求处理器的编写---简易框架最后一公里!

    从零写一个具有IOC-AOP-MVC功能的框架-学习笔记 专栏往期文章链接: IOC功能相关章节: 从零写一个具有IOC-AOP-MVC功能的框架-学习笔记-01.项目初始化 从零写一个具有IOC-A ...

  9. 自动驾驶——图像识别的学习笔记

    1 前言 在此次的自动驾驶任务中,我们需要完成图像识别的任务: 2 模型选择-- 3 模型修改--修改最后一层FC层 具体的写作方式可以参考博文--<Pytorch学习笔记(I)--预训练模型( ...

  10. 一个非常棒的Unity入门教程(附上学习笔记)

    非常适合入门的unity教程,知识点全面,声音清晰,基本没有废话,时间控制得当,UP主Michael还在更很多其他的unity相关教程 视频教程地址:https://www.bilibili.com/ ...

最新文章

  1. 1-runtime的Method,IMP,Property,ivar
  2. Merry Christmas Happy New Year!!
  3. 反欺诈技术揭秘-设备指纹VS关系网络模型 此博文包含图片 (2017-05-12 10:23:52)转载▼ 标签: 设备指纹 关系网络 反欺诈 神经网络模型 分类: 风控 文章来源:网络(经整合梳理
  4. 【十九】require和include的区别
  5. sys/queue.h分析(图片复制不过来,查看原文)
  6. JAVA入门级教学之(方法-7)
  7. C语言如何处理不定长度参数,C语言中不定参数的实现
  8. git命令出现fatal: unable to access SSL certificate problem: self signed certificate
  9. python安装pillow图形处理库
  10. 17. 促销,市场营销和内容页
  11. 酷狗php 技术题目,广州酷狗php面试题(赋答案)
  12. Axure| .rp的文件怎么转化为.rplib
  13. ubantu20刷新DNS缓存的命令
  14. 基于FPGA的YCbCr颜色空间中颜色参数的变化
  15. HBase-2.0 MOB解决海量图片存储方案
  16. PPP和PPPOE详解
  17. Unity制作别踩白块儿
  18. “指尖上的中华”非遗国技互动展亮相上海徐家汇站
  19. 服务器ip导致微信域名红,微信/QQ域名检测-最新腾讯域名检测官方接口
  20. 博主独资创办-卓明网,即将上线,敬请期待!

热门文章

  1. 如何写出吸引人的广告文案(一)
  2. 连接HDMI出现没声音
  3. java山地车 故障,山地车经常会出现的十个小故障,你都遇到了几个
  4. 什么是web services?它有什么作用,以及它如何实现?
  5. 用matlab编写SIR模型对SARS期间疫情数据进行模拟
  6. 【Paper】法律科技方面论文汇总
  7. 生命的火花盛开与如幻如梦
  8. 第3章【思考与练习4】数据清洗,从studentsInfo.xlsx 文件的“Group1”表单中读取数据。数据填充,使用习题1的数据,使用列的平均值填充“体重”和“成绩”列的NaN数据。
  9. React 16 源码解析笔记 02 - JSX 转换为 ReactElement 的过程
  10. PLC可编程控制器实训设备