demo视频地址:Learn How To Make A 2D Platformer In Unreal Engine 5学习记录#1
1.1Introduction
创建blank项目,platformer 2dproject(蓝图模式,默认选项,取消掉初学者内容包)
更改自己喜欢的layout(这里就跟教程选择一样的ue4layout了),点击上方window->load layout
1.2Setting up input player input
创建文件夹2DPlatfomerBlueprints
创建蓝图,搜索paperCharacter,创建并命名2dCharacter
设置输入:点击上方Edit->project settings->Engine->input
添加Action Mapping:Jump:Space Bar和Up
添加Axis Mapping:Moveright:Right(Scale 1)和Left(Scale -1)
在初始目录新建文件夹Sprites,再里面新建PlayerCharacterSprites
将HeroSprites中资源拖入文件夹
精灵模糊解决:选中精灵图片->右键->Sprite Actions->Apply Paper2D Texture Settings
为图片创建sprite:选中精灵图片->右键->Sprite Actions->create sprites
为精灵创建flipbook,选中精灵序列,右键->create flipbook
双击点开flipbook可以在右侧更改播放速度
以同样的方式创建run、jump、full的flipbook
1.3Setting up the player character pt1
双击之前创建的蓝图
选择sprite并使用idle作为源sprite
锁住scale并调整参数至5,调整精灵位置
点击上方event graph
右键创建节点,搜索jump,添加之前创建的action event:Jump
点击Pressed连接Jump,点击released连接Stop Jumping
右键创建节点,添加之前创建的Moveright,点击箭头(exec执行)创建新节点Add movement input,并将Moveright的Axis Value连接至Scale Value,将Add movement input中world Direction设置x=1
在左侧components下点击add添加springArm并点击视图中上侧的旋转按钮,将方向旋转-90°
在springArm添加camera并将投影模式设置为Orthographic(正交投影),Ortho Width设置为1000
在sprites文件夹中创建新文件夹Objects,在里面创建GraySquare文件夹,在里面拖进资源graySquare,并用该图片创建sprite
将之前创建的2dCharacter拖到场景中,在details处搜索pawn,将auto possess pawn设置为player0(游戏开始相机便会锁定角色)
删掉地形(不能直接删父landscape,删不掉,得删完其下的所有,才能删),并将graySquare拖入
更改人物和灰色地块的y为0,并将灰色地块拉长
1.4Setting up the player character pt2
进入2dCharacter中的ViewPort,设置springArm的rotation type为world
在左侧components搜索Character movement并拖到蓝图中,指向get velocity节点,右键split struct pin
将event tick指向print string节点,并将刚才创建的getvelocity节点的x速度与print string的 in string连接便可以打印速度(试试就行了,可以删掉print string节点了)
将get velocity的x指向compare float节点,将event kit指向compare float的exec(执行)
创建get controler节点,return value指向is valid节点(带问号的)的input object
compare float节点的>指向isValid的exec
get controller节点的return value还要指向set control rotation节点target,isValid节点的isValid再指向set control rotation节点
set control rotation节点的new roatation指向make rotator
复制一份get controler节点、is valid节点、set control rotation节点、make rotator节点
将compare float的<指向复制的isValid的exec,并将复制的make rotator的z改为180
以上是为了当x速度大于0时,人物朝右,小于0时,人物朝左
我看接下来意思要搞一个状态机来判断朝左朝右
InputAxis Moveright节点指向branch,InputAxis Moveright节点的axis value指向greater节点并设置为0,greater节点指向branch的condition
在my blueprint的variables中添加boolean:ismoveingright?并将这个变量拖入蓝图,使用set ismoveingright?节点
将branch的true指向set ismoveingright?节点,并将ismoveingright?勾选
最后将set ismoveingright?节点指向add movement input节点
branch的false节点指向一个新的branch节点(其实这里有点没搞懂)
InputAxis Moveright节点的axis value指向less节点设置为0,less节点再指向刚才新建的branch的condition,新branch的true指向一个新建的set ismoveingright?节点
set ismoveingright?节点指向add movement input节点
新branch的false也指向add movement input节点(感觉这一条线会在松开小键盘右键时触发)
前往更改朝向的蓝图区域,将compare float的==指向一个branch,branch的condition分支设置为Get ismovingright,如果true,就执行上方(朝右看)的is Valid,false就执行下方的is Valid
点击左上角compile编译后,设置ismovingright的默认为true
以上是为了当没有移动时,仅仅靠按左右键就能更改人物的朝向(比如现在跳跃时,之前按左右是不能改变朝向的,因为x方向的速度一直没有变的,但加了这部分蓝图后,只要按键就会改变)
1.5Giving The Player Character Animations
选中下面这部分蓝图,按下C键,分组为处理输入事件
新建节点custom event,命名Updateanimation
event kit指向一个新建的Updateanimation节点
创建get velocity节点,指向vector length节点再指向greater节点
将左侧component的sprite拖进蓝图,并指向新的节点set flipbook
greater指向新建select节点(三个分支),select节点和set flipbook的new flipbook连接
select节点true设置为run,false设置为idle
greater节点连接select节点
updateanimation节点连接set flipbook节点
右键select节点的true,点击promote variable生成run的状态,同理生成idle状态
点击左侧 my bluegraph中的variables,为run和idle创建种类文件夹(category)Animation
updateanimation节点指向一个branch
将左侧components中的character movement拖到蓝图中,并指向is falling 节点,is falling 节点指向branch的conditon
branch的false连接set flipbook,true
复制select和set flipbook节点(用于创建降落时的动画)
创建get velocity节点,并split struct pin,如果z坐标less(新节点)0,连接select节点
设置select节点true为fall动画(z的速度<0说明在下落),false为jump动画
最后将branch的true连接set filpbook
同上,为jump和fall创建variable(Jumping、Falling)(我不知道为啥这里首字母要大写,之前的run和idle不大写)
1.6Changing The Player Characters Speed
点击左侧component中的character movement 在右侧details搜索speed可以看到速度
将character movement拖入蓝图,指向新建的set max walk speed节点
将event beginplay节点(本来就有)连接set max walk speed节点
为max walk speed新建variable:Playerspeed
编译后,点击playerspeed,然后就可以设置速度啦
1.7Adding Sprinting
先利用graysquare创建个台阶
edit -> project settings -> input添加action mappings:sprint,按键为left shift
进入蓝图的处理输入板块
新建sprint节点
拖进来character movement节点指向set max walk speed节点,为其创建variable:SprintingSpeed(我很费解为啥这里的s又大写了,感觉这老师就是随便写的哈哈哈,没太严格的规范)
sprint节点的pressed连接set max walk speed节点
设置SprintingSpeed的数值
复制冲刺的节点,改成冲刺完的节点,需要把SprintingSpeed换成之前创建的Playerspeed
1.8Creating Dash Ability
打开蓝图,修改camera的width至2000
编辑下地图
创建dash的fipbook
添加Action Mapping:Dash,按键为Z
前往蓝图中的输入事件板块,创建Dash节点,指向新建的launch character节点(要split struct pin 嗷)
创建get ismovingright节点,指向select节点,select节点的return value 连接launch character节点的launch velocity x
select节点的false和true都 设置为2500
勾选launch character节点的XYOverride(试了下,勾没勾没啥区别啊)
由于跳跃时冲刺会冲很远,所以要修改下摩擦力,在蓝图的component中找到character movement,在details中找到jumping/falling,修改falling lateral friction 为2.0
在蓝图的变量中,复制jumping,改为Dash, 将details中的默认值改为dashflipbook(需要先编译一下)
创建一个Boolean变量: isdashing?
将isdashing拖入蓝图(set),使launch character节点指向isdashing?节点,并勾选(true)
将Dash变量拖入蓝图,指向GetTotal Duration,获取动画时间
isdashing?节点指向retriggerable delay节点,并将GetTotal Duration的return value连接retriggerable delay节点的duration
最后retriggerable delay节点再指向set isdashing?节点(这次就不勾了false)
前往处理动画板块
在Update animation节点后添加branch节点,拖入isdashing节点并连接该branch节点,false连接之前的branch
拖入sprite,指向set flipbook节点
将之前创建的dash变量(其实就是dash的flipbook)拖入,连接set flipbook节点的new flipbook
修改下dash的距离:3300,并修改falling lateral friction 为2.5
1.9Creating Wall Slide Mechanic
制作wallSlide的flipbook
进入蓝图,创建custom event节点,命名WallSlidemechanic(不是很懂为什么最后一个单词首字母不大写了)
向上找event tick节点,在Updateanimation节点后指向WallSlidemechanic节点
回到WallSlidemechanic节点处,拖入character movement节点,指向is falling节点
is falling节点指向一个branch的condition
WallSlidemechanic节点执行branch
branch true指向line trace channel 节点
新建节点:get actor location,其return value 指向line trace by channel 节点的start
新建节点:get actor forward vector,其return value 指向multiply(就是乘个数呗)(split),x设置为50
get actor location节点添加add节点,连接multiply节点和add节点,最后将add节点连接至line trace by channel 节点的end
line trace by channel 节点的out hit指向break hit result节点
break hit result节点的Blocking hit指向 set Wallslide?节点(新建的变量),ine trace by channel 节点也要执行set Wallslide?节点
在最开始的branch节点的false指向 set Wallslide?节点(不勾选意味着不是falling状态就不能是wallslide状态)
回到处理动画板块,在判断是否在空中的branch的true后新建branch,用于判断 is Wallslide状态,false就跟以前一样
拖进sprite并指向set flipbook
添加wallslide动画(flipbook)变量
向上找到event tick后面的 wall Slide Mechanic节点,指向一个branch,根据wallslide状态判断,如果false跟以前一样
1.10Creating Wall Jump
前往处理输入事件,在Jump的pressed后添加branch,condition就是Wallslide?,false就跟以前一样,true指向launch character(velocity拆分)
新建get actor forward节点(split(拆分) return value) ,x指向mutiply 节点,mutiply 节点设置为-1500(反向跳跃),再指向launch character的节点中的x
为了跳跃时向上一点,将launch character的节点中的z设置为650
勾选上launch character的节点的XYZ override,这样计算的就是绝对数值而不是相对数值
角色在空中时很难控制,所以在蓝图的components中找到character movement,details中搜索air,将air control设置为1
修改角色的碰撞胶囊在蓝图的components中找到capsule component,拖入动画处理板块中,指向set capsule radius节点,radius设置为1
当is falling的branch是true时,连接set capsule radius节点(记得set capsule radius节点要连上之后的branch节点)
复制capsule component节点和set capsule radius节点,当不再空中时,胶囊半径恢复
将滑墙系统中mutiply节点的x从50改为5(这个距离就是碰撞检测的距离)