[Unity Demo]从零开始制作空洞骑士第三集之导入插件2D toolkit和使用playmaker制作敌人状态机以及扩展FSM脚本

server/2024/9/22 18:30:16/

当你看到我这段字的时候,说明我正在火车上用手机打字,因为我要回家过中秋了但我没带电脑。但我记忆又贼差,乘着我还记得我前几个小时都干了什么我先把记得的内容都写到这里,等过两天回去了我再把代码贴出来。

首先还是感谢你坚持到第三期,因为前期的准备工作还是挺混乱的 ,你能全部看懂前两期真的是神人了,请注意本期内容并不会比前面的简单!

 

为什么需要使用2D Toolkit?

当你看到这几个字时,你可能都不知道这是一个插件,没关系我一开始也不知道,因为它好像已经不支持新的更新了,基本上销声匿迹了。

要用它的原因是:首先我们的playmaker可以支持这个插件,说白了这个插件就是能用在playmaker上面,它可以放在fsm的action上面,所以贼好用

然后它用起来也简单了,而且它包含了sprite,animation,tilemap和UI方面的,可以完全平替unity的这些功能

导入插件:2d toolkit后,会发现有一些editor和application上的错误debug,这是因为它已经不支持新版的unity了,所以有一些unity自带的代码已经被弃用或者迭代了,如果被弃用了话我们就删除它,迭代的就用新迭代的方法。随便改改反正都是无关紧要的。

等到没有报错以后,我们就可以找到tk2droot文件夹了,把后缀带demo的文件夹都删掉,这些demo除非你还没搞懂可以点进去看看,如果你完全解读了就可以直接删掉了。

 

然后在asset搜索playmaker.package点击让它导入有关tk2d的playmakerfsm脚本,这些就都是可以用到fsm上的action行为

 

还有其他工作需要完成,比如用tk2dsprite代替sprite renderer,用tk2dspriteanimation代替animator,终于可以不用unity傻呗一样的animator了舒服。

asset文件夹空白处右键create,找到最底端的tk2d,点一下tk2dspritecollection,然后命名knight sprite collection,单击后点下open editor,然后就到了我们把小骑士的sprite拖入到左侧,点开右上角的setting照我下面设置(我图呢?我没电脑啊我不到啊)

 

设置完成后点一下apply,然后你就会发现好像生成了一个叫altas的图集还有一个material,然后我们就可以在小骑士身上用到了,删掉小骑士上面的sprite renderer,添加tk2dsprite,然后collection选择刚刚创建的knight。

然后我们就可以创建tk2dspriteanimation了,asset文件夹空白处右键create,找到最底端的tk2d,点一下tk2dspriteanimation,然后命名knight sprite animation,单击后点下open editor,左上角create 选择clip,然后命名为idle,点击下面的加号一个一个把有关idle的tk2dsprite添加到animation中 然后找到合适的targetframe一遍遍play找到合适的,run动画也是同理。完成后点击apply。

回到小骑士中,删掉上面的animator选择创建tk2danimation,现在idle作为初始动画,勾选play automaticlly

 

回到脚本中来,创建新的脚本.heroanimationcontroller.cs删掉原本的heroanimatorcontroller.cs,完成后点开,此后我们再也不需要使用animator了。(别急代码等我回去后贴)

 

完成以后我们打开herocontroller.cs更改错误debug

运行以后发现动画播放没有问题,接下来就可以制作enemy的行为状态机了。

 

这次我们项目的一个敌人就是大家在空洞遇到的第二个敌人蚊子buzzer,导入buzzer的素材,然后老办法给它一个tk2dsprite和tk2danimation

 

然后我们就可以用playmaker来控制这个敌人的行为了。

如果还没有导入playmaker可以现在导入,然后选择install now下载好后你会发现左上角有个playmaker,点开playmaker窗口你就可以看到一个界面,给buzzer一个playmaker名字就叫chaser,这个是控制buzzer追击玩家的。

既然要追击玩家就要我们collider2d了,给buzzer一个子对象alert range new,完成后给它circle collider2d,勾选是触发器,然后我们创建几个layer,player给小骑士,enemy给buzzer,hero detector给alert range new。创建脚本lineofsight detectors给buzzer,目的是检测应该检测的对象。

然后我就到了我们playmaker的扩展脚本了,那么为什么要扩展呢?肯定是原本的playmaker很多功能action无法满足特定需要啊,好在playmaker提供了自定义创建行为脚本的窗口,接下来我会一个个解释要创建的新自定义脚本

 

创建好后,我们就开始创建state和连线transition了

还需要添加必须的fsm event和fsm variable

 

我将一个个展示fsm的state状态

首先是initial状态

 

事件event是切换state状态的必需品,必须保证每一个state都至少有一个事件。

 

初始化结束后就进入idle状态

 

然后是startle状态

 

判断用的alert?状态,是的话直接进入alert状态

 

alert状态

 

还需要chase in sight

 

以及chase out of sight

 

至此一个循环就构成了完整的buzzer状态机

 

测试的时候我们将buzzer设置成远离玩家的位置,游戏刚开始时,buzzer会保持在idle状态,当玩家进入到circlecollider2d的区域内,状态机会经过一系列状态打到chase in sight状态,直到玩家走出circlecollider2d的区域。

 

至此我们迈出了非常重要的一步,其实很多敌人的行为都是类似的,我们可以在这些大同小异的敌人都用状态机来实现它们相似的行为。

 

所以下一期我打算稍微摆一摆,去创建更多的敌人enemy,让我们的场景更具有生机。

 

 

 

 

 

 

 

 

 

 

 

 

 


http://www.ppmy.cn/server/118281.html

相关文章

Spring扩展点系列-BeanFactoryAware

文章目录 简介源码分析示例代码示例一:验证BeanFactoryAware执行顺序示例二:动态获取其他bean示例三:动态bean的状态 简介 spring容器中Bean的生命周期内所有可扩展的点的调用顺序 扩展接口 实现接口ApplicationContextlnitializer initia…

【Python笔记】PyCharm大模型项目环境配置

一、PyCharm创建新项目 二、更新pip版本 ...>python.exe -m pip install --upgrade pip 三、生成所需requirements配置文件 ...>pip freeze > requirements.txt 四、安装所需组件requirements.txt ...>pip install -r requirements.txt

如何进行DAP-seq的数据挖掘,筛选验证位点

从样本准备到寄送公司,每一天都在“祈祷”有个心仪的分析结果,终于在这天随着邮件提示音的响起,收到了分析结果...... 分析前工作 爱基在进行数据分析之前,会有两次质控报告反馈给老师们。第一个,基因组DNA的提取质控…

【JAVA】数据脱敏技术(对称加密算法、非对称加密算法、哈希算法、消息认证码(MAC)算法、密钥交换算法)使用方法

文章目录 数据脱敏的定义和目的数据脱敏的技术分类对称加密算法非对称加密算法哈希算法消息认证码(MAC)算法密钥交换算法 数据脱敏的技术方案实现字符替换哈希算法(例如:SHA-3 算法)消息认证码(MAC)算法(CM…

uniapp 发布苹果IOS详细流程,包括苹果开发者公司账号申请、IOS证书、.p12证书文件等

记录一下uniapp发布苹果IOS的流程。 一、苹果开发者公司账号申请 1、邓白氏编码申请(先申请公司邓白氏编码,这一步需要1-2周,没有这个编码苹果开发者没法申请,已有编码的跳过此步骤): 1)联系苹…

‌内网穿透技术‌总结

内网穿透是一种网络技术,通过它可以使外部网络用户访问内部网络中的设备和服务。一般情况下,内网是无法直接访问的,因为它位于一个封闭的局域网中,无法从外部访问。而通过内网穿透,可以将内部网络中的设备和服务暴露在…

算法两道题

算法一 Write a function: int solution(vector<int>&A); that, given an array A of length N, returns as an integer the minimum number of moves needed to transform a zero-filled array into A. Examples: 1. Given A [2, 1, 3], the function should …

redis:全局ID生成器实现

问题&#xff1a;订单id不能设置为自增长的原因 id的规律性太明显&#xff0c; 受订单的数据量限制:若数据量过大&#xff0c;需要多张表存储&#xff0c;若自增会导致id重复 全局ID生成器&#xff1a;在分布式系统中用来生成全局唯一ID的工具 ID的组成&#xff1a; 符号位…