本文为B站系列教学视频 《UE5_C++多人TPS完整教程》 ------ 《P62 武器开火特效(Fire Weapon Effects)》 的学习笔记,该系列教学视频为计算机工程师、程序员、游戏开发者、作家(Engineer, Programmer, Game Developer, Author)Stephen Ulibarri 发布在 Udemy 上的课程 《Unreal Engine 5 C++ Multiplayer Shooter》 的中文字幕翻译版,UP主(也是译者)为 游戏引擎能吃么。

文章目录
- [P62 武器开火特效(Fire Weapon Effects)](#P62 武器开火特效(Fire Weapon Effects))
- [62.1 实现播放武器开火特效动画](#62.1 实现播放武器开火特效动画)
- [62.2 创建投射物武器蓝图类](#62.2 创建投射物武器蓝图类)
- [62.3 Summary](#62.3 Summary)
P62 武器开火特效(Fire Weapon Effects)
本节课我们将在制作武器开火的蒙太奇,这样当我们按下开火键时,人物角色装备的武器就能具有开火特效。

62.1 实现播放武器开火特效动画
-
打开动画资产 "
/Game/Assets/MilitaryWeapSilver/Weapons/Animations/Fire_Rifle_W'
" 编辑窗口,可以发现这个动画的资产编辑器中有两个通知,其中轨道 1 的通知用于显示枪口火光(Muzzle flash)特效,轨道 2 的通知负责播放开火音效,播放动画,我们还可以看到扣动扳机(Trigger)时枪体发射子弹(Eject a shell)的地方。
-
我们想要按下开火键时,任何人物角色装备的武器都能播放开火特效动画。在 Viusal Studio 中打开 "
Weapon.h
",添加动画资产类 "UAnimationAsset
" 头文件 "/Animation/AnimaitionAsset.h
",声明动画资产类 "FireAnimation
" 以及用于播放武器开火特效动画的函数 "Fire()
",接着在 "Weapon.cpp
" 中完成 "Fire()
" 的定义,用于播放武器开火特效动画,并且关闭动画循环。
cpp
/*** Weapon.h ***/
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
/* P62 武器开火特效(Fire Weapon Effects)*/
#include "Animation/AnimationAsset.h"
/* P62 武器开火特效(Fire Weapon Effects)*/
#include "Weapon.generated.h"
...
UCLASS()
class BLASTER_API AWeapon : public AActor
{
GENERATED_BODY()
public:
...
// 显示拾取组件
void ShowPickupWidget(bool bShowWidget);
/* P62 武器开火特效(Fire Weapon Effects)*/
// 播放开火动画
void Fire();
/* P62 武器开火特效(Fire Weapon Effects)*/
private:
UPROPERTY(VisibleAnywhere, Category = "Weapon Properties") // 添加所有地方可见的骨骼网格组件,这样就可以通过蓝图进行编辑武器,归类为 Weapon Properties
class USkeletalMeshComponent* WeaponMesh;
UPROPERTY(VisibleAnywhere, Category = "Weapon Properties") // 添加一个重叠体积(Overlap Volume),这里使用球体组件 "包裹" 武器骨骼体组件,用于判定人物是否碰到球体,若碰到人物将会拾取该武器
class USphereComponent* AreaSphere;
//UPROPERTY(VisibleAnywhere, Category = "Weapon Properties") // 添加新声明的武器状态枚举类型,归类为 Weapon Properties
//EWeaponState WeaponState;
/* P62 武器开火特效(Fire Weapon Effects)*/
UPROPERTY(EditAnywhere, Category = "Weapon Properties")
class UAnimationAsset* FireAnimation;
/* P62 武器开火特效(Fire Weapon Effects)*/
...
};
cpp
/*** Weapon.cpp ***/
...
/* P62 武器开火特效(Fire Weapon Effects)*/
#include "Components/SkeletalMeshComponent.h"
/* P62 武器开火特效(Fire Weapon Effects)*/
/* P62 武器开火特效(Fire Weapon Effects)*/
void AWeapon::Fire()
{
if (FireAnimation)
{
WeaponMesh->PlayAnimation(FireAnimation,false);
}
}
/* P62 武器开火特效(Fire Weapon Effects)*/
- 在 "
CombatComponent.cpp
" 中为 "FireButtonPressed()
" 添加代码,用于在按下开火键时调用已装备武器的 "Fire()
" 函数,播放武器开火特效动画。
cpp
/*** CombatComponent.cpp ***/
...
// 根据人物角色是否在开火,设置 bIsFireButtonPressed;根据人物角色的瞄准状态,播放开火蒙太奇片段
void UCombatComponent::FireButtonPressed(bool bPressed)
{
bIsFireButtonPressed = bPressed; // 设置 bIsFireButtonPressed
/* P62 武器开火特效(Fire Weapon Effects)*/
if (EquippedWeapon == nullptr) return; // 若没有装备武器,退出
/* P62 武器开火特效(Fire Weapon Effects)*/
if (Character && bIsFireButtonPressed) // 如果人物角色在开火
{
Character->PlayFireMontage(bAiming); // 根据 bAming 的值播放开火蒙太奇片段
/* P62 武器开火特效(Fire Weapon Effects)*/
EquippedWeapon->Fire(); // 已装备的武器播放开火动画
/* P62 武器开火特效(Fire Weapon Effects)*/
}
}
62.2 创建投射物武器蓝图类
-
编译后打开虚幻引擎,在目录 "/Game/Blueprints/Weapon/" 下以投射物武器 C++ 类 "
ProjectileWeapon
" 为父类,新建蓝图类 "BP_AssaultRifle
"。
-
打开 "
BP_AssaultRifle
" 蓝图编辑器,在武器网格体组件 "Weapon Mesh
" 细节面板中设置骨骼网格体为 "Assault_Rifle_A
";接着,调整球体组件 "Area Sphere
" 的位置与尺寸直至能包裹武器网格体;然后,在拾取组件 "Pickup Widget
" 细节面板的 "用户界面 "(USER INTERFACE)选项卡下将 "空间 " 从 "世界 " 设置为 "屏幕 ",将 "控件类 " 设置为 "WBP_OverheadWidget
",勾选 "以所需大小绘制
";最后,在 "BP_AssaultRifle(Self)
" 细节面板中设置开火动画 "Fire Animation
" 为 "Fire_Rifle_W
"。
-
编译并保存后,在关卡 "
BlasterMap
" 中将 "BP_AssaultRifle
" 拖拽至场景中,并删除先前的 "BP_Weapon
"。
-
进行测试,分别操控服务器和客户端上的人物角色拾取武器后进行开火,可以看到在本地机器上武器开火特效动画能够正确播放,但在其他机器上却不能看到,这说明我们没有对武器开火特效动画的播放进行网络同步,我们将在下节课中做到这一点。
62.3 Summary
本节课我们成功实现了武器开火特效系统,为武器添加了视觉和听觉反馈。在 "Weapon
" 类中添加用于指定武器开火特效动画的 "FireAnimation
" 属性和播放开火特效动画的 "Fire()
" 函数,在 "Fire()
" 的定义中调用 "PlayAnimation()
" 播放已装备武器的开火特效动画,并关闭动画循环,确保每次开火时只播放一次。接着,在 "CombatComponent
" 的 "FireButtonPressed()
" 中调用武器类的 "Fire()
" 函数,这样只有在装备武器时才会播放开火动画;随后,在虚幻引擎中基于 "ProjectileWeapon
" 类创建投射物武器 "BP_AssaultRifle
" 蓝图,配置武器网格体为突击步枪模型,设置球体碰撞组件包裹武器,配置拾取组件的显示参数,为武器指定专用的开火动画 "Fire_Rifle_W
",动画包含枪口火光特效和开火音效通知,虽然本地机器上能够正确播放开火特效,但在其他客户端上无法看到,这表明需要实现网络同步功能。这将是下一节课的重点内容,确保所有玩家都能看到其他玩家的开火效果。