提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
一、创建项目
该项目建议使用UE5.5以上版本,这里我使用的是UE5.7版本。
首先打开UE5.7,然后点击新建项目。然后按下面的设置创建一个空白游戏项目。


然后将该项目的素材文件夹整体拖拽到项目目录下的Content目录下。

然后在UE5的内容浏览器中的Content目录下创建一个Code文件夹用来存储代码相关内容,然后在Code目录下创建一个Player文件夹,用来存储所有和角色相关的内容。

在开始学习之前我们先修改一下UE5的DDC,也就是"派生数据缓存"。我们在UE5中首次使用模型、贴图、材质这些东西时,都会加载很长时间,这是因为UE5在将模型等进行编译着色器,材质、贴图等进行压缩。然后UE5会把编译好的着色器,压缩好的贴图等之类的东西都放到DDC路径下面,这样以后我们再使用UE5打开这些已经使用过的模型、材质和贴图时,UE5就会直接去DDC路径下把编译好的数据直接拿出来,这样再次打开这些资源时就会加载的很快了。随着我们打开的工程和资源越来越多,DDC路径下的数据也会越来越多,UE5默认的DDC路径在C盘中,所以我们需要修改DDC路径在其它的盘,以防止C盘爆满。
全局本地DDC路径一定要设置为一个固态硬盘,如果是机械硬盘的话,那么读取速度有些慢,然后使用UE5时就会很卡。
全局共享DDC路径一般是在公司工作多人协同开发使用的,因为公司中很多人同时做一个项目,所以有些资源的编译数据就可以都存储到一台局域网的A主机上,然后其它主机就可以设置共享DDC路径为这个A主机中的DDC路径,然后其它主机打开这些资源时,就可以使用A主机已经编译好的数据了。

二、角色创建
然后我们在Player目录下创建一个System文件夹,然后在Player目录下再创建一个角色类型的蓝图,命名为BP_FPSPlayer,这个蓝图作为角色蓝图。

然后我们在System目录下创建一个Input目录,该目录里面存储游戏输入相关的内容。然后在System目录下再创建一个游戏模式基础蓝图,命名为BP_FPSGameMode,作为游戏模式蓝图。然后打开BP_FPSGameMode蓝图,将默认pawn类设置为前面创建的BP_FPSPlayer蓝图,然后保存后点击编辑。


此时运行项目,我们发现视角还是一个自由移动的摄像机,这是因为我们没有设置项目的游戏模式,我们在项目设置的地图和模式中设置默认游戏模式为BP_FPSGameMode,这样就会将项目中所有关卡的游戏模式都设置为BP_FPSGameMode。

除了在项目设置中设置游戏模式,我们还可以在关卡中设置游戏模式重载,这里设置的游戏模式是跟随这个关卡的,即只设置了这个关卡的游戏模式。下面我们将这个关卡的游戏模式重载设置为BP_FPSGameMode。然后我们再运行项目,此时就不是一个自由摄像机的视角了。

然后我们在Input目录下创建四个输入操作,分别控制角色旋转、移动、跑步和瞄准,然后再创建一个输入映射情境,这个就相当于一个总配置的地方。

我们打开IA_Look和IA_Move,将它们的值类型设置为Axis2D。然后打开IA_Run和IA_Aim,设置它的值类型为布尔,因为跑步状态按下Shift就表示跑步状态,松开就表示不跑状态,瞄准也同理,所以这两个输入使用布尔值。




然后我们打开IMC_FPSInput,然后点击Default Key Mappings下的Mappings后的加号,然后添加三个操作映射,分别设置为IA_Move、IA_Look、IA_Run。然后给IA_Move添加四个键盘输入,分别设置为WSAD,我们可以点击小键盘图标,然后再按对应的按键进行设置。然后给IA_Look添加一个鼠标XY2D轴输入。然后给IA_Run添加一个左Shift键盘输入。然后给IA_Aim添加一个鼠标右键输入。

然后我们点击S按键,添加一个否定修改器,因为W是控制沿着X轴向前,S就需要控制沿着X轴向后,所以添加一个否定,这里否定就是相反的意思。
然后我们点击A按键,先添加一个拌合输入轴值,这个修改器的意思是修改该按键控制的轴向,因为WS控制X轴,所以我们需要修改AD按键控制Y轴,所以先添加一个拌合输入轴值修改器。然后因为坐标系中左侧为负值,所以我们需要再给A按键添加一个否定修改器。
然后我们点击D按键,给D按键同样添加一个拌合输入轴值修改器,表示D按键也控制Y轴。因为在坐标系中向右为正值,所以D按键不需要添加否定修改器了。

我们双击打开BP_FPSPlayer蓝图,然后按照下面的内容添加并连接节点来激活输入。下面的逻辑中,Get Controller(获取控制器)节点可以设置一个目标,即可以设置玩家A控制器、玩家B控制器等。Cast To PlayerController(类型转换为PlayerController)节点相当于又上了一个保险,因为控制器可能是AI控制器,这个节点就确保了只有是玩家控制器时才会绑定输入系统。然后再添加一个Enhanced Input Local Player Subsystem(增强输入本地玩家子系统)节点,然后再创建一个Enhanced Input Local Player Subsystem节点的成员函数节点Add Mapping Context(添加映射上下文)节点,然后将Add Mapping Context节点的Mapping Context设置为我们前面创建的输入映射情境IMC_FPSInput。所以说下面这个写法是动态的,无论是网络联机游戏还是本地双人游戏它都能运行,每个角色都能正确的找到属于自己的输入系统。

这是之前写的激活输入的节点逻辑,这个逻辑只适合单机游戏中单人模式下。因为可以看到Get Player Controller(获取玩家控制器)节点的下标为0,这是因为默认情况下本主机上的这个玩家就是默认下标为0,所以这个控制器就只能表示第一个玩家的控制器了。如果我们开发的是双人游戏,类似于双人成行那种,那么这个写法就错误了,因为它只获取到了第一个玩家的控制器并且进行激活,那么就导致了一个玩家能控制两个角色了,而第二个玩家控制不了角色。所以我们的项目中使用前面的第一种方法来激活输入。

然后我们来制作角色移动逻辑,我们添加一个增强输入活动IA_Move节点,然后添加一个Get Control Rotation(获取控制旋转)节点,然后添加一个Get Forward Vector(获取向前向量)节点,需要注意是数学下的Get Farward Vector节点,因为我们按W按键时需要让角色沿着当前航向向前,所以需要获取向前向量。然后添加一个Add Movement Input(移动输入)节点,将向前向量节点返回值连到World Direction视角方向中,然后将IA_Move节点的Action Value的X值连接到移动输入节点的Scale Value中,这个就表示移动的速度。这样的话当按W按键时,Action Value的X值为1,然后通过移动输入节点让角色沿着当前控制器向前向量移动。当按S按键时,Action Value的X值为-1,此时角色就向后移动了。
然后同理我们再添加一个Get Right Vector(获取向右向量)节点,然后赋值给移动输入节点的World Direction视角方向中,然后将IA_Move节点的Action Value的Y值给Scale Value。这样当按压D按键时,IA_Move节点的Action Value的Y值为1,此时角色向右移动。当按键A按键时,IA_Move节点的Action Value的Y值为-1,此时角色向左移动。
可以注意到下面我们在获取向前向量时,只用了控制旋转的Z轴向量,这是因为X-Y坐标系绕Z轴旋转角度就是角色的航向值,而我们让角色向前后左右移动时,只需要航向值就够了,这样才能保证角色始终贴着地面平移。如果再加上俯仰值和滚转值的话,那么角色移动就不对了,即当角色俯仰角度为低头或抬头时,此时按W按键角色就不会向前移动了。



然后我们来制作旋转控制器。先添加一个IA_Look节点,然后添加一个Add Controller Yaw Input(控制器Yaw输入)节点,然后将IA_Look节点的Action Value的X值连接到控制器Yaw输入节点的Val上。然后添加一个控制器Pitch输入节点,将IA_Look节点的Action Value的Y值连接到控制器Pitch输入节点的Val上。这样鼠标上下移动时控制角色俯仰视角,鼠标左右移动时控制角色航向视角。

然后我们运行时发现鼠标向上移动,角色视角向下;鼠标向下移动时,角色视角向上。此时我们可以让IA_Look节点的Action Value的Y值乘-1,这样俯仰视角控制就正确了。

除了上面的办法之外,我们还可以在IMC_FPSInput中进行修改。我们给IA_Look的鼠标XY2D轴输入加一个否定修改器,然后只选中Y轴生效,这样就相当于将IA_Look节点中Action Value的Y值取反了。



4.完善角色细节
在BP_FPSPlayer蓝图中,点击组件选项中的添加按钮,先创建一个骨骼网格体Arm,然后在骨骼网格体下面创建一个摄像机,然后再在Arm下创建一个骨骼网格体Gun。Arm就是角色的手臂,摄像机就是我们操控角色的视角,Gun就是角色要拿的武器。然后我们将Arm骨骼网格体资产设置为SK_Base_Skin,即手臂模型。

现在的摄像机虽然是在Arm下,会跟着角色一起移动,但是当角色移动时身体是有抖动的,所以我们也需要让摄像机和Arm骨骼网格体的插槽关联上,这样摄像机就会跟着Arm骨骼网格体产生摇晃的感觉了。我们选中摄像机,然后在右侧细节面板中将它的父项套接字改为Head,如果感觉摄像机太大的话,可以进行调整。还有就是如果发现摄像机的视角不对的话,就调整摄像机的旋转角度。

然后我们选中Gun,设置它的骨骼网格体资产为SK_MCX_VIRTUS,即枪模型。然后设置它的动画模式为使用动画资产,然后设置动画为Weapon_MCX_VIRTUS_Idle。

然后选中Arm,将Arm的动画模式也修改为使用动画资产,动画设置为Player_MCX_VIRTUS_Idle。此时可以看到手臂模型和枪模型就可以对上了。

此时我们运行项目,发现上下移动鼠标时,角色视角不会抬头或低头了。这是因为我们没有让Arm下的摄像机跟着控制器旋转。所以我们需要在Event tick后面设置Arm在世界坐标系的旋转跟随控制器的旋转。

然后我们再设置Arm的位置高一些,让Arm的位置达到人眼正常的高度。然后设置Arm的缩放,让它的比例和真人类似。

我们在运行项目时发现右下角枪模型好像有些没显示出来,好像穿模了,这个我们需要在设置中修改近剪切平面值。近剪切平面决定了摄像机它能看到的最近距离,任何距离摄像机小于这个数值的物体都会被直接切掉,这可以防止角色在靠近墙体等模型时视线被遮挡。这里我们将近剪切平面的值设置为1,这样就能看到枪模型显示正常了。



此时我们看到Gun这个模型只是一个枪的主体,没有枪管或者枪托等,下面我们来添加这些组件。我们在Gun下面添加三个静态网格体Barrel、Stock、Magazine。然后选中Barrel,设置它的静态网格体为DMR_X_Barrel,设置它的父项套接字为Barrel,此时可以看到枪管就和枪主体完全贴合了,如果没有的话,那么就让Barrel的位置、旋转都归0,缩放都归1。然后选中Stock,设置它的静态网格体为MCX_Stock,设置它的父项套接字为Stock。然后选中Magazine,设置它的静态网格体为300-BACKOUT_30,设置它的父项套接字为Mag1。



5.制作角色能力系统
下面来制作角色的能力系统,即角色的跑、跳等能力。
我们先将IA_Move节点的Action Value的XY值提升为变量保存起来,以便后续用到。然后我们在IA_Move节点的Completed引脚后面设置MoveX和MoveY变量值为0,即当松开键盘时就让MoveX和MoveY的值为0。因为Triggered是只有当键盘按下时才执行的。

然后添加IA_Run节点和IA_Aim节点,然后再添加两个布尔类型变量Want To Run和Want To Aim。然后设置当按下奔跑按键时Want To Run变量为true,松开奔跑按键时Want To Run变量为false。然后设置当按下瞄准键时Want To Aim变量为true,当松开瞄准键时Want To Aim变量为false。

我们在System目录下创建一个Enum文件夹,然后在蓝图选项中创建一个枚举E_PlayerState,表示当前角色的状态。然后双击打开E_PlayerState,然后点击左上角的添加枚举器来添加四个枚举值,然后设置四个枚举值分别为,Idle为站立状态,Walk为走路状态,Run为跑步状态,Aim为瞄准状态。


然后我们创建一个UpdatePlayerState函数,在该函数中更新角色状态的变化。我们创建一个E_Player_State枚举类型的变量E_PlayerState来记录当前角色的状态。我们这里设置Aim瞄准的状态优先级最高,所以先判断当按键瞄准按键后,Want To Aim为true,然后就设置当前角色状态为瞄准状态。

然后我们在判断角色奔跑之前,需要先判断当前角色是否按下了前进按键,因为只有先按下前进按键,再按下奔跑按键时,角色才会奔跑。所以我们使用前面的MoveX大于0来判定当前角色是否在前进,然后再判断是否按下了奔跑按键,如果按下了奔跑按键,那么Want To Run变量为true,然后设置角色状态为奔跑状态;如果没按下奔跑状态,那么现在就是走路状态,设置角色状态为走路状态。

然后当MoveX值不大于0时,即角色没有向前进时,我们需要通过角色移动节点判断角色当前是否在移动,即是否按了A、S、D按键,如果是的话就设置角色状态为走路状态,如果没按就设置角色状态为站立状态。角色移动节点的速度这个节点其实是翻译错了,实际含义应该是角色当前向量,即只要角色是移动的,那么这个向量就一定有值。所以我们通过判断这个向量长度来得到角色当前是否在移动,如果没有移动就设置状态为站立,如果移动了就设置状态为走路。

然后我们在Event Trick事件后面调用UpdatePlayerState函数,即每帧都更新角色状态,然后我们打印一下E_PlayerState变量的值,来测试一下角色状态改变是否正确。

然后我们运行项目,测试一下角色状态改变是否正确。

然后我们再创建一个UpdateMoveSpeed函数来修改角色移动速度。我们通过E_PlayerState变量创建一个Select(选择)节点,然后就可以设置每个状态下的值。然后再添加一个角色移动节点,根据角色移动节点创建一个设置最大速度子节点,然后将Select节点的返回值连接到设置最大速度节点的引脚上,这样就会根据E_PlayerState变量的不同状态来设置不同的角色移动速度了。

然后将UpdateMoveSpeed函数也连接到Event Trick事件后,然后打印出来角色移动速度。

6.制作动画系统(上)
下面我们来制作动画系统。
我们先在Player目录下创建Animation文件夹,该文件夹中保存动画资源,然后在Animation文件夹下面创建Player文件夹,该文件夹下面保存角色动画,然后在Animation文件夹下面创建Weapon文件夹,该文件夹下面保存武器动画。

然后我们在Player文件夹中创建一个动画蓝图,在创建动画蓝图时需要选择一个骨骼,我们选中手臂骨骼。然后我们再创建一个混合空间,在创建混合空间时也选择手臂骨骼。


然后我们打开BS_FPSPlayer混合空间,然后设置水平坐标和垂直坐标的一些属性。

然后我们在资产浏览器中搜索Walk行走动画,然后Walk表示向前走动画,我们拖到上位置;Back为向后走动画,我们拖到下位置;Left为向左走动画,我们拖到左位置;Right为向右走动画,我们拖到右位置。然后搜索idel动画,即在中间位置设置一个站立不动的动画Player_MCX_VIRTUS_idle。
然后我们长按Ctrl按键,然后鼠标在下面的面板中拖动就可以查看上面的动画变化,即手臂模型向前走、向后走、向左走、向右走的动画。
我们前面设置的水平坐标和垂直坐标的一些属性和下面的面板就对应上了。例如水平坐标此时就是横着的坐标,即Right。最小轴值设置为-1,最大轴值设置为1,然后网格划分设置为2,就说明Right的值不是-1就是1了。与网格对齐就是我们添加的动画圆点吸附坐标轴上的网格,此时网格划分为2,所以动画圆点要么吸附在最左边,要么吸附在最右边。平滑时间就是从一个动画到另一个动画过渡的时间。
此时如果设置Right的值为-1,就表示向左走动画;设置Right值为1,就表示向右走动画。Forward相关操作同理。


然后我们打开ABP_FPSPlayer动画蓝图,我们先在动画蓝图的事件图表中获取到BP_FPSPlayer蓝图对象,这样才能在角色动画蓝图中获取角色蓝图中的一些变量、函数、组件等。然后我们将角色蓝图中的MoveX、MoveY、E_PlayerState等变量都在角色动画蓝图中也存储一份,以便后续制作动画时使用。

然后我们在角色动画蓝图中的动画图表中创建一个状态机Basic,然后将它连接到输出姿势。

然后双击进入状态机,在入口后面添加一个状态命名为Move。

然后双击进入Move状态,在这里我们就需要使用到前面创建的混合空间。在状态窗口的右下角可以看到资产浏览器,橙色的就是混合空间,绿色的是动画资产。我们拖拽混合空间BS_FPSPlayer到状态窗口中,这样就添加了一个BS_FPSPlayer节点。在BS_FPSPlayer混合空间中,Forward的值为1时就是向前动画,为-1时就是向后动画。Right的值为1时就是向右动画,为-1时就是向左动画。所以我们在状态窗口中将MoveX变量的值赋值给混合空间节点的Forward值,将MoveY变量的值赋值给混合空间节点的Right值。
这样的话当按压键盘W按键时,MoveX的值就为1,然后就会设置混合空间BS_FPSPlayer节点的Forward值为1了,然后该节点输出的动画就是向前走动画了,然后输出动画姿势就是向前走动画了。按压S、A、D按键同理,这样就通过WSAD按键也能控制角色动画的切换了。

然后我们在角色蓝图中选中Arm对象,然后设置它的动画模式为使用动画蓝图,将动画类设置为ABP_FPSPlayer。此时再运行项目,就可以看到按压WSAD按键时,人物前后左右移动时,动画也跟着切换了。

下面我们来制作枪的动画系统。
和角色动画同理。我们先在Weapon文件夹下面创建一个动画蓝图,这一次选择枪的骨骼。然后再创建一个混合空间,也选择枪的骨骼。


然后双击打开混合空间BS_VIRTUS,然后设置水平坐标和垂直坐标的属性。这里需要注意武器的混合空间中,水平坐标和垂直坐标的属性设置要和角色的混合空间中一致,这样枪模型和角色手臂模型才不会穿模。

然后设置武器的前后左右动画和站立动画。


然后双击打开武器的动画蓝图,在武器动画蓝图的事件图表中获取到BP_FPSPlayer蓝图对象,这样才能在武器动画蓝图中获取角色蓝图中的一些变量、函数、组件等。我们可以直接将ABP_FPSPlayer动画蓝图中的节点复制到ABP_VIRTUS动画蓝图中,然后创建对应的变量。

然后在动画图表中创建一个状态机连接到输出姿势上。

然后双击打开状态机,在入口后面添加一个状态Move。

然后双击进入Move状态,然后添加一个BP_VIRTUS混合空间节点,然后将MoveX和MoveY变量的值赋值给混合空间节点的Forward和Right输入值。

然后在角色蓝图中选中Gun,设置它的动画模式为使用动画蓝图,然后设置动画类为ABP_VIRTUS。

此时运行项目,可以看到角色前后左右移动时,武器动画也跟着角色动画了。

7.制作动画系统(中)
下面我们来制作奔跑动画。
我们打开ABP_FPSPlayer角色动画蓝图,然后在Basic状态机中再添加一个Run状态,然后从Move状态到Run状态连一个箭头,从Run状态到Move状态也连一个箭头。这表示当按下奔跑按键时,可以从Move状态到Run状态;当松开奔跑按键时,可以从Run状态到Move状态。

然后我们点击Move状态到Run状态中间的箭头,然后设置从Move状态到Run状态的条件。我们通过E_PlayerState变量的值判断,当E_PlayerState的值为枚举值Run时,此时就需要从Move状态过渡到Run状态。


然后我们点击Run状态到Move状态中间的箭头,然后设置从Run状态到Move状态的条件。我们还是通过E_PlayerState变量的值判断,当E_PlayerState的值不为枚举值Run时,此时就需要从Run状态过渡到Move状态。

然后我们双击Run状态,然后添加一个Sprint奔跑动画节点,即当状态为Run就播放奔跑动画。我们需要检查一下奔跑动画节点是否为循环动画,如果不是的话要设置为循环动画。

同理我们需要在枪动画蓝图ABP_VIRTUS中进行同样的操作。即添加一个Run状态,然后设置Move状态到Run状态的过渡条件,然后设置Run状态到Move状态的过渡条件,然后设置Run状态的奔跑动画。




此时运行项目,当按住Shift让角色奔跑时,可以看到角色和枪都播放奔跑动画了。

当运行项目时,我们感觉到奔跑动画和走路动画之间的过渡有些不顺畅。我们可以在角色动画蓝图和枪动画蓝图中的状态机窗口,选中从Move到Run的过渡条件和Run到Move的过渡条件,然后在右边设置时长为0.3s,其中模式就是过渡曲线,我们可以根据自己的需求来调整曲线或者时长等。
需要注意的是如果调整的话,需要将角色动画蓝图和枪动画蓝图中都进行调整,不然角色手臂和枪就不同步了。


8.制作动画系统(下)
下面我们来制作瞄准动画。
我们先在角色动画蓝图ABP_FPSPlayer的状态机窗口添加一个Aim状态,然后设置从Move状态到Aim状态的过渡,Aim状态到Move状态的过渡。

然后我们在Aim状态窗口中添加两个动画,分别为角色站立时的瞄准动画和角色走路时的瞄准动画。然后再添加一个按布尔混合姿势节点,这个节点有一个Active Value值,当Active Value为真时,这个节点就输出真姿势引脚连接的动画;当Active Value为假时,这个节点就输出假姿势引脚连接的动画。真混合时间和假混合时间就是切换动画时的过渡时间。



然后我们在ABP_FPSPlayer蓝图的事件图表中添加一个获取角色移动节点,然后将角色移动提升为变量Character Movement,然后连接上执行引脚。


然后我们在Aim状态窗口中通过角色移动变量的移动向量的值来判断当前角色是否移动,如果移动向量的值大于0说明角色此时在移动,那么Active Value值为true,然后让按布尔混合姿势节点的真姿势引脚连接走路瞄准动画,假姿势引脚连接站立瞄准动画。然后选中两个瞄准动画,将它们的循环动画属性都勾选上。


然后我们来设置从Move状态到Aim状态的过渡条件。当E_PlayerState的值为Aim时,就将状态从Move过渡到Aim。

然后再设置从Aim状态到Move状态的过渡条件。当E_PlayerState的值不为Aim时,就将状态从Aim过渡到Move。

然后同理我们在ABP_VIRTUS动画蓝图中制作枪的瞄准动画。我们给枪动画蓝图也添加一个Aim状态。

然后在ABP_VIRTUS动画蓝图的事件图表中获取到角色移动组件,并且提升为变量。

然后同理在枪的Aim状态中添加一个按布尔混合姿势节点,然后通过角色移动向量的值来判断角色是否移动,以此来切换枪的走路瞄准动画和站立瞄准动画。


然后同理设置Move状态到Aim状态的过渡条件,和Aim状态到Move状态的过度条件。


然后我们运行项目,此时点击鼠标右键就可以播放瞄准动画了,松开鼠标右键就播放移动动画。但是我们发现移动动画和瞄准动画之间的过渡有些卡顿,即可以看到在移动动画和瞄准动画过渡时,手部模型和枪模式有时候穿模了,有时候都两个模型都分开了,这是因为移动动画和瞄准动画之间的过渡是UE5自动给我们生成的,然后这两个动画之间可能就没有在同一位置的时候,所以当从这个动画切换到另一个动画时,会突然将手部模型和枪模型移动到下一个动画开始位置,这样就产生了卡顿。我们可以选中Move状态和Aim状态之间的过渡条件,然后设置过渡时长和模式曲线等来改变两个动画之间的过渡,但是修改完后还是感觉有些卡顿。此时我们就可以在这两个状态过渡之间使用自己制作的过渡动画。过渡动画就可以将移动动画和瞄准动画的切换位置连接起来,这样动画之间过渡时,因为有位置重叠的地方,所以动画切换时看起来就丝滑多了。

我们先将之前的Move状态和Aim状态之间的过渡连线删除。然后我们添加一个ToAim状态,这个表示从Move状态到Aim状态的过渡状态。然后再添加一个ToIdel状态,这个表示从Aim状态到Move状态的过渡状态。然后我们还需要防止玩家一直连按鼠标右键瞄准的情况,即从ToAim状态到ToIdle状态之间也连接一个过渡条件,这样当玩家按下瞄准按键然后又松开后,就执行Aim状态到Move状态的过渡动画,而不是执行瞄准动画了。ToIdle状态到ToAim状态的过渡条件也同理。

然后我们双击进入到ToAim状态中设置从Move状态到Aim状态的过渡动画。这里就不能将过渡动画设置为循环动画了。


同理设置从Aim状态到Move状态的过渡动画。


然后我们设置Move状态到ToAim状态的过渡条件,即什么时候开始播放瞄准过渡动画。当鼠标右键按下时就应该播放瞄准过渡动画了,所以当E_PlayerState值为Aim时进行状态过渡。

然后我们设置从ToAim状态到Aim状态的过渡条件。当瞄准过渡动画快要播放完时,就开始播放瞄准动画。这里我们添加一个获取相关剩余动画时间(ToAim)节点,然后判断当瞄准过渡动画剩余时间小于0.4s时,就开始播放瞄准动画。


然后设置从Aim状态到ToIdle状态的过渡条件。当玩家松开鼠标右键时,此时需要播放瞄准取消动画,即当E_PlayerState变量的值不为Aim时,就开始播放瞄准取消动画。

然后我们设置ToIdle状态到Move状态之间的过渡条件。当瞄准取消动画剩余时间小于0.4s时,就开始播放移动动画。

这里我们先不做ToAim状态和ToIdle状态之间的过渡条件,以便我们能观察到这个错误的现象。我们先将这两个状态之间的过渡条件删除,然后开始制作枪的瞄准过渡动画和瞄准取消过渡动画。

下面同理制作枪的瞄准过渡动画和瞄准取消过渡动画,在枪动画蓝图中添加一个ToAim状态和ToIdle状态。

设置ToAim状态的动画,即瞄准过渡动画。注意不要设置为循环动画。


设置ToIdle状态的动画,即瞄准取消过渡动画。注意不要设置为循环动画。


Move状态到ToAim状态的过渡条件和前面同理。

ToAim状态到Aim状态的过渡条件和前面同理。

Aim状态到ToIdle状态的过渡条件和前面同理。

ToIdle状态到Move状态的过渡条件和前面同理。

此时运行项目可以看到瞄准过渡动画就很自然了。但是此时如果我们快速的按瞄准按键和释放瞄准按键,可以看到瞄准动画和取消瞄准动画还是会完整的播放一遍,这样的话就会感觉这个游戏有些不跟手的感觉。
下面我们再将ToAim状态和ToIdle状态之间的过渡条件加上。

然后我们来设置ToAim状态到ToIdle状态之间的过渡条件。当正在播放瞄准过渡动画时,此时突然松开瞄准按键,那么就需要切换到瞄准取消动画。所以我们判断当E_PlayerState的值不为Aim时就从ToAim状态过渡到ToIdle状态。

然后我们来设置ToIdle状态到ToAim状态之间的过渡条件。当正在播放瞄准取消动画时,此时突然按下瞄准按键,那么就需要切换到瞄准过渡动画。所以我们判断当E_PlayerState的值为Aim时就从ToIdle状态过渡到ToAim状态。

同理将枪的动画蓝图中也添加ToAim状态和ToIdle状态之间的过渡条件。然后设置ToAim状态到ToIdle状态的过渡条件,和ToIdel状态到ToAim状态的过渡条件。



然后我们运行项目,此时快速按下和松开瞄准按键,枪的瞄准动画和取消瞄准动画也会同步播放。
但是当我们按住Shift,然后松开瞄准按键时,此时左上角人物的移动速度已经切换到奔跑速度了。但是角色和枪还要先播放完瞄准取消过渡动画后才能播放奔跑动画,这样就感觉角色有些延迟了。
我们需要在ToIdle状态到Move状态的过渡条件中再添加一个判断,即当播放瞄准取消过渡动画时,如果按下了Shift按键,那么就直接开始播放移动动画。如果没有按下Shift按键,那么当瞄准取消过渡动画剩余时间小于0.4s时也开始播放移动动画。即这两个条件有一个满足的话,就播放移动动画。


当我们运行项目时,移动角色时如果发现摄像机并没有跟随着晃动,那么我们需要在BP_FPSPlayer中将摄像机的使用Pawn控制旋转选项取消勾选。
