《UE5_C++多人TPS完整教程》学习笔记61 ——《P62 武器开火特效(Fire Weapon Effects)》


本文为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 实现播放武器开火特效动画

  1. 打开动画资产 "/Game/Assets/MilitaryWeapSilver/Weapons/Animations/Fire_Rifle_W'" 编辑窗口,可以发现这个动画的资产编辑器中有两个通知,其中轨道 1 的通知用于显示枪口火光(Muzzle flash)特效,轨道 2 的通知负责播放开火音效,播放动画,我们还可以看到扣动扳机(Trigger)时枪体发射子弹(Eject a shell)的地方。

  2. 我们想要按下开火键时,任何人物角色装备的武器都能播放开火特效动画。在 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)*/
  1. 在 "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 创建投射物武器蓝图类

  1. 编译后打开虚幻引擎,在目录 "/Game/Blueprints/Weapon/" 下以投射物武器 C++ 类 "ProjectileWeapon" 为父类,新建蓝图类 "BP_AssaultRifle"。

  2. 打开 "BP_AssaultRifle" 蓝图编辑器,在武器网格体组件 "Weapon Mesh" 细节面板中设置骨骼网格体为 "Assault_Rifle_A";接着,调整球体组件 "Area Sphere" 的位置与尺寸直至能包裹武器网格体;然后,在拾取组件 "Pickup Widget" 细节面板的 "用户界面 "(USER INTERFACE)选项卡下将 "空间 " 从 "世界 " 设置为 "屏幕 ",将 "控件类 " 设置为 "WBP_OverheadWidget",勾选 "以所需大小绘制";最后,在 "BP_AssaultRifle(Self)" 细节面板中设置开火动画 "Fire Animation" 为 "Fire_Rifle_W"。


  3. 编译并保存后,在关卡 "BlasterMap" 中将 "BP_AssaultRifle" 拖拽至场景中,并删除先前的 "BP_Weapon"。

  4. 进行测试,分别操控服务器和客户端上的人物角色拾取武器后进行开火,可以看到在本地机器上武器开火特效动画能够正确播放,但在其他机器上却不能看到,这说明我们没有对武器开火特效动画的播放进行网络同步,我们将在下节课中做到这一点。


62.3 Summary

本节课我们成功实现了武器开火特效系统,为武器添加了视觉和听觉反馈。在 "Weapon" 类中添加用于指定武器开火特效动画的 "FireAnimation" 属性和播放开火特效动画的 "Fire()" 函数,在 "Fire()" 的定义中调用 "PlayAnimation()" 播放已装备武器的开火特效动画,并关闭动画循环,确保每次开火时只播放一次。接着,在 "CombatComponent" 的 "FireButtonPressed()" 中调用武器类的 "Fire()" 函数,这样只有在装备武器时才会播放开火动画;随后,在虚幻引擎中基于 "ProjectileWeapon" 类创建投射物武器 "BP_AssaultRifle" 蓝图,配置武器网格体为突击步枪模型,设置球体碰撞组件包裹武器,配置拾取组件的显示参数,为武器指定专用的开火动画 "Fire_Rifle_W",动画包含枪口火光特效和开火音效通知,虽然本地机器上能够正确播放开火特效,但在其他客户端上无法看到,这表明需要实现网络同步功能。这将是下一节课的重点内容,确保所有玩家都能看到其他玩家的开火效果。


相关推荐
码匠许师傅7 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
小小龙学IT9 小时前
DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」
数据库·c++
知无不研10 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
C++ 老炮儿的技术栈12 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
檀越剑指大厂12 小时前
哪个远程控制软件低延迟适合玩游戏?2026年8月六款远程工具按游戏类型深度实测
游戏·玩游戏
qz_Serene14 小时前
C++:类和对象(上)
开发语言·c++
郝学胜-神的一滴15 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程
hetao173383715 小时前
2026-08-09~08-14 hetao1733837 的刷题记录
c++·算法
_ZHOURUI_H_16 小时前
Unity TCP底层极限拆解:粘包、半包、CRC、序列号、双缓冲到底怎么一起工作的?
网络·网络协议·tcp/ip·游戏·unity·游戏引擎·游戏开发
言乐616 小时前
Python游戏水平测试辅助系统2
开发语言·windows·python·游戏·django