第三人称和第一人称的区别:
第三人称:镜头在人身后
第一人称:镜头就是眼睛,拿着枪瞎突突
新建项目,创建GameFile文件夹,创建蓝图类的三个类:3P_GameInstance, 3P_GameMode, 3P_GameState分别继承蓝图类的对应三个类,创建Character文件夹,里面创建PlayerCharacter文件夹,创建一个蓝图类3P_PlayerController继承PlayerController,创建蓝图类3P_PlayerCharacter继承character,打开epic的工作----->保管库,选择其中2个资源,add project ,我们可以看到这两个分别是角色找掩体和射击的动画。(这里注意的是在GameMode由于版本问题,不能继承GameMode Base,而要继承GameMode)
选择第三个
发现工程文件夹中多了2个文件夹,CoverAnimsetPro(找掩体动画)和RifleAnimsetPro(射击动画文件夹) ,把coverAnimset的UE4_Mannequin(模型)文件夹删除,RifleAnimsetPro的保留,将两个文件夹里面的Animations文件夹合并放到Character里面,把RifleAnimsetPro中UE4_Mannequin也放到character里面
1、制作人物持枪左右前后移动功能
Animation下面全是一系列的图片,选择没有重定向骨骼的那些动作图片(这里没有绑定的都是黑色的图片),右键绑定骨骼,这里应该是让动画绑定到哪个骨骼上
补充下在导入的动画包中文件这样,最左侧的是关卡文件,类型为map,中间的是动画文件,右侧蓝色条的为蓝图类,继承了Character类,最右侧为动画蓝图
在3P_GameController中Edit-->Project Settings--->Input这样设置
将地图和模式选项的默认游戏模式改成3P_GameMode
双击3P_GameMode,在Class-->Default Pawn Class中改这3个
在3P_PlayerController中,将四个设定输入事件导入,右键MoveForward-->Promote to Variable
视频是这样连得
自己实际在做的时候是这样连的
(我们可以看到,视频里是将鼠标的前后和左右的输入放到两个变量里面,通过这两变量输入给一个二维混合动画中来控制人物方向,而自己是将前后左右的输入放到了movement input当中,它可以在PlayerCharacter中的CharacterMoveMent组件来获得,该组件的细节中封装了许多属性,比如行走的速度,跳跃速度等等,此外由于前后左右是在xy平面,绕z轴旋转因此只连z轴的线,个人理解)
在GetPlayPawn--->GetControlRotation-->Break Rotation--->取得绕z旋转也即xy平面的向量,其中Make Rotator返回的return Value就是返回的向量,将它投影到x和y轴即取得了forward vector和right vector
在PlayerCharacter右键创建Animation-->Animation BluePrint选择UE4_Mannequin_Skeleton重命名为3P_PlayerAnimBP,
编辑3P_PlayerAnimBP,在事件图表中这样连线,右击输入set move Forward变量发现没有,这是因为该变量在3P player controller中,我们左边连线controller,另一端的连线再输入就出来了,
视频是这样连得
报错
这是因为self(目标)没有连线,我们连上就好,点击编译,保存
我的理解是在player controller中设置的是鼠标和键盘输入和变量的关系,在animBlueprint中设置的是通过player controller来设置变量的值。
这里特别注意的是从右侧MoveForward引出Move Forward需要在端口右键promote to variable,上图是直接右键输入变量名取得的,那样不对。
实际自己是这样连得
继续,在3P_PlayerAnimBP的动画图标中new stateMachine,双击拖动出走路持枪的BlendSpace ,双击,将两个变量的值赋给它
这里的ClassRifleStrafeMovement是个BlendSpace
在左侧,调整人物移动的速度,右侧发现该BlendSpace混合了持枪站立,持枪前走,持枪后走,持枪左走,持枪右走,持枪左跑,持枪右跑,持枪前跑,持枪后跑等至少9中动画。
最后在最左侧这样设置,让人物的的移动可以在游戏中产生位移
视频是这样的,他用了2个变量来制作2d混合动画,自己做的用了1d的混合动画,输入是speed,将站立和跑步动画混合
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
对于BlendSpace的创建步骤如下:(摘自http://gad.qq.com/article/detail/14455)
一般来说创建的是2D的Blend Space
举例来说,下图第一种按照速度和方向来设置,底部第一排放置walk的动画,当速度到达一定值时就融合到顶排run动画,然后在事件蓝图中根据速度和方向来取值。这里横轴是speed,纵轴是direction方向。
但是我们在项目的过程中发现这种方式不会很理想,我们可能需要角色瞬间达到最大速度,而不需要中间的速度融合,从待机到跑,从待机到走都是瞬间完成的动作。在下图中是我们所采取的另一种方式,跟速度没有关系,只有方向,在range里我的经验是设置-1到1的范围,在事件蓝图中设置变量的绝对值取值得到相应的动画,这么做是可以避免在游戏中取值在0.5和0.1各种情况出现,会导致呈现的动画并不准确。把待机,走,跑都单独做BS再进行运动状态之间的融合切换。也可以变态的把待机,走,跑,蹲各种状态坐在一个BS中,这种方式比较不易于后续的细节表现的添加。
对于里面的动画编辑,按住shift+左键可以切换到当前节点的动画
在左侧的Asset Details中可以设置横轴和纵轴分别是哪两个变量,最小值和最大值多少
如果我们把角色移动按照各种状态来融合,那么整个状态机的可编辑性强很多,比如说在一个射击游戏中,在拿枪的跑动中可能随时都要瞄准射击,只要在BS末端加入一个骨骼控制节点单独控制某根开枪的骨骼即可实现。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
动画设置好后,打开3P_playerCharacter,设置人物的mesh,在Animation中指定为3P_PlayerAnimBluePrint ,再添加一个相机组件。
这样就实现了人物持枪移动效果,我们运行游戏,人物可以持枪跑步了。
注意的细节:因为是第三人称,因此在3P_PlayerCharacter里的3p_PlayerCharacter组件的旋转只勾选绕y轴,对相机camera的父物体和本身的旋转都勾选,(网页上写的x轴为pitch,y轴为yaw,z轴为roll但是实际项目中显示的是x轴为roll,y轴为pitch,z轴为yaw,由于相机是360度都可以看,人物只需要左右转绕z轴yaw因此这样勾选)
第三人称视角的相机要360度旋转,人物只要绕z轴旋转即可。效果如下
接着人物换装,我们导入一个人物模型
在3P_PlayerCharacter中选择mesh,替换为新的人物mesh,发现只能这样,原因是跑步的动画骨骼没有替换
假如两个骨骼相近,那么在3P_PlayerAnimBP重定向骨骼,替换为新导入模型的骨骼,然后在3P_PlayerCharacter中选择mesh里面的Animation指定为新的3P_PlayerAnimBp,把动画全部右键retarget重定向到新骨骼,重写混合动画,然后就可以让另一个人物模型也可以使用旧动画了。效果如图
哈哈,还挺流屁的。
2,为人物的动作添加完整的状态机
然而还不够,添加跳跃功能,在输入加入空格,在playercontroller中设置,这里的Jump函数我个人理解在PlayCharacter里的CharacterMoveMent中的细节里面封装了跳跃的具体属性
在行走持枪基础上添加快跑持枪的动画,步骤如下:
在输入中绑定leftShift按键名为SprintButton。在player Controller中,逻辑是这样的,当人物处在持枪行走状态下(move forward>0)且按下LeftShift,把bool值is Sprinting置为true,否则为false。
在playAnimBP中再加入持枪跑步动画,之前写好了Rifle Walk动画,再加入持枪快跑开始,持枪快跑中,持枪快跑停止,并连线。
对于从Rifle Walk到Sprint Start的条件为is Sprinting,
当然前提要加入bool值is Sprinting
从Sprint Start到Sprinting转换条件为慢走动画的时间播放结束,这里用4秒后就进入慢走动画循环状态
从Sprinting到Rifle Stop的切换条件为,Move Forward<=0,从Rifle Stop到Rifle Walk的切换条件为4秒后就切换
从Sprinting到Rifle Walk的切换条件为is Sprinting 为false
值得注意的是,切换到快跑模式时候bool置为true,在Rifle Stop动画的某一时刻自动将Bool值is Sprinting置为false,
从持枪行走到持枪快跑,和持枪蹲下三个动作,人物速度不一,如何设置?
加入一个变量WalkSpeed,当人物左右前后行走输入时候,乘以0.7就为行走持枪速度,蹲下或加速跑的时候将变量置为其他值即可
效果如图:
接下来添加右键瞄准,在输入加入右键aiming在playerController中
设置好状态机,瞄准又分为站立瞄准和瞄准行走,Crouch是蹲下的状态机。
这样的话,瞄准行走的速度为0.3,行走持枪速度为0.7,蹲下行走速度0.3,加速跑速度1.0,因此在输入shift的时候还要分情况判断,比如,按下加速跑的时候有没有按瞄准键,有没有按蹲下键,这里蹲下时如下判断的,右键瞄准和加速shift也都要写成这样的逻辑。感觉代码冗余度很高,有空再优化下
其次在状态机条件判断的时候,要把每种情况充分考虑,这里只列举出条件判断的方式,每个转换条件都要这样细化来写
这样就把瞄准,持枪行走,持枪快跑和蹲下各种逻辑直接的切换时的速度变化以及动画切换的逻辑就写好了,效果如下: