demo演示地址:Learn How To Make A 2D Platformer In Unreal Engine 5学习笔记#5生命、检查点、拾取、音效与贴图
5.1How to create a moving platform
创建一个actor蓝图,命名moving platform
添加paper sprite,设置为灰色块
调整形状
add interpToMovemrnt组件,设置behaviour type 为Ping Pong
添加两个 control points
创建两个变量,Location1(vector),Location2(vector),都设置为可编辑模式,并勾选show 3d widget(这样就可以直接在场景中修改位置了)
创建一个变量Duration(float)
前往construction script,设置控制点和时间,蓝图:
5.2How to create a Coin System
拖入coin资源,制作flipbook
创建Coin的actor
添加paperFlipbook,调整大小
添加sphere碰撞盒
在角色蓝图中添加变量NoCoins(integer)
去PlayerHud_WB中添加一个horizontal box,在里面加一个text,一个image
text绑定角色的NoCoins
去coin的蓝图中添加begin overlap事件,让角色的NoCoins变量增加
将金币放在移动平面的子物体中,可以跟随平板移动
之前一直没碰撞是因为金币的y坐标不是0,所以触发不了碰撞事件
5.3How to create a Checkpoint System
创建变量Respawn Location(vector)
创建自定义事件:RespawnPlayer,指向setactorLocation,设置为Respawn Location
创建actor,命名checkPoint,添加一个box collison(解除hide)和一个scene
为box collison添加begin overlap事件
当碰撞时,设置respawn location为这个acor的scene的world location
创建变量maxHealth为最大生命值
在respawn player节点后再重新设置health为maxHealth
set health节点指向remove from parent,将playerhud从view port删除,接着指向create widget节点,选择playerHud_WB,再将return value设置为playerhud变量,最后再指向add to viewport节点
在beginPlay节点后设置respawn location为角色位置(z+10),避免没有碰到检查点就死掉后重生在奇怪位置的bug
拖入checkPoint资源(campFire),给检查点添加动画
测试的时候,给一个按键加个apply damage功能即可
做的时候有个小bug,生命条不显示,是因为忘加add to viewport节点了
5.4How to create a Life System
添加变量lives
每当生命值小于0时,就减少一条命(如果lives>0),如果没命了,就将下面创建的isDead置为true
添加变量isDead
更新死亡动画,如果死亡状态就是do once,设置死亡动画smoke(下面创建),动画播放结束就set sprite visibility不可见,角色的movement也set active(不勾选)
拖入deathSmoke资源,创建flipbook
在playerhud_wb中添加vertical box,将之前的信息都放到里面,再添加一个horizontal box记录命的条数
此时,出现了一个问题,当我往text绑定角色类的lives时,发现在下拉列表中找不到lives这个float变量,然后发现有的float变量能找到,有的float变量找不到,然后上虚幻论坛查了查受到点启发,去create bind,然后通过蓝图来绑定,就可以,其中自动把float给转换成double了,很怪。
5.5How to create a Spike System
拖入spike资源(地刺)
创建actor,命名spikes,添加paper sprite,box collision,去掉paper sprite的collision
添加begin overlap事件,对玩家造成伤害,蓝图:
5.6Setting Up A Background For Are Level
拖入tileset文件夹,其中BG1要单独拖入,不然创建sprite就会变成绿色(因为拖入tileset文件夹就会按normal map导入),全部创建精灵(创之前要记得apply 2dtexture)
拖入BG1,设置坐标,y=-100,修改大小(测试而已)
右键BG1、BG2、BG3(创建精灵前的),sprites action -> create tile set
右键创建好的tile set创建tile map
进入tile map,设置setup中的宽高10*6
重命名这个图层为skybackground
在上面创建一个图层,放置云,clouds
再在上面创建一个图层,grassLayer,save后即可使用tilemap
5.7Tilesets
将资源中的tile set设置成tile set(双击进去,将tile size改为16*16)
点击上方的add box可以给tile set添加碰撞盒,add polygon可以给贴图添加奇形怪状的碰撞盒,add circle可以加原型碰撞盒
点击colliding tiles可以显示加了碰撞的贴图
创建个tilemap,20*20大小的,做个小地形放进去
中间不知道为啥突然crash了,去论坛查了查,有人重新放了下素材就好了,我试了试,也可以了,虽然不知道为啥crash…..
5.8Setting Up Custom Projectiles
进入rangeEnemy蓝图的攻击板块,右键SpawnActor的class节点,生成一个变量EnemyProjectile,设置为可以编辑的,后面是通过在编辑器的修改来改变弹药种类(其实可以加个branch)
复制MushroomProjectile的actor,命名Bomb Projectile
更换精灵图,修改伤害值
5.9Enemy Fixes
当小怪成为尸体后,创建一个金币,spawnActor coin
复制coin创建一个enemycoin,创建一个变量random coin Num,使得碰撞后+random coin Num个金币(记得勾选instance editable和expose on spawn,这样才能在节点显示)
回到小怪蓝图的spawnActor coin节点,class设置为刚建的enemy coin
random coin Num指向random float in range节点,指向random float in range节点需要再取整,加个round节点(如果是int就不用了)
将transform拆分,location为尸体的位置
将capsule component拖入蓝图,指向set collision profile name节点,并左右连接set dead body和spawnactor节点
set collision profile name节点的name改为overlap only pawn
在处理动作板块加个判断死亡,就不再执行动作
将产生金币复制到melee enemy蓝图中
在小怪攻击动画结束后如果死掉,就不再对玩家造成伤害,加个branch
远程攻击的话,是spawn actor之前判断下是否死亡
5.10Creating A Health Pick Up
给心脏贴图创建个精灵(之前竟然一直没建
创建一个actor命名heartPickUp,add paper sprite(去掉碰撞)和box collision
添加begin overlap事件,类似捡手斧,蓝图:
前往playerHud_WB,复制Heart Ref变量为RemovedHearts,拖入蓝图,指向add节点,for loop的array element指向add的select asset,最后左右分别连接remove heart节点和remove节点
前往heart_WB,新建自定义事件节点showheart,跟remove heart反着来就行,显示心脏
前往playerHud_WB,创建自定义事件showHeart,指向for loop,for loop的first index设置为1,last index连向showHeart节点
前往heartPickUp,在set后指向showHeart节点(需要先有playerHud_wb的引用噢,就是获取2dCharacter的playerHud变量)
last index为这个heartPickUp的health,最后再destroy
回到playerHud_WB,拖入removedHearts,指向get(a copy)节点,其中get的index指向为removedHearts的长度-1,这样copy的就是失去的最后一个心(也就是刚失去的)
get后指向 show up(也就是让一颗心visible),然后再add heart ref,remove removedhearts:
由于满血时再吃心,会报错,前往playerHud_WB,在get节点后加个判断is valid节点,因为,removed hearts有可能长度为0,再-1成负数了,显然不可能
5.11Adding Sound Effects
拖入音效资源
前往Axe_pickup蓝图,在destory前,加入Play sound2d节点
前往角色蓝图,生成斧子节点后播放投手斧的声音
前往coin_sound文件夹,右键->sounds->sound cue,命名coinsoundcue
将所有coinsound拖入cue的蓝图中,所有节点指向random
前往coin的蓝图,在destroy前,加入play sound 2d节点,选择coinsoundcue
enemycoin的actor也加入play sound 2d节点,选择coinsoundcue
前往heart pick up蓝图,加入play sound 2d节点选择heartpickup
为近战攻击也创建个soundcue
前往角色蓝图,在攻击后的检测中,如果hit actor is valid,就播放近战攻击声音,在delay前播放swoosh声音
在set is attacking节点前加一个do once
sequence节点加一个pin,then2指向do once的reset
前往enemy的蓝图,在设置小鬼受伤后面(set is damaged节点后)播放hurt动画
5.12Creating Double Jump
- 直接去角色蓝图中,点击component中的2dcharacter(self),在details中搜索jump,修改jump max count即可(so easy)