《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",动画包含枪口火光特效和开火音效通知,虽然本地机器上能够正确播放开火特效,但在其他客户端上无法看到,这表明需要实现网络同步功能。这将是下一节课的重点内容,确保所有玩家都能看到其他玩家的开火效果。


相关推荐
仟濹24 分钟前
「经典图形题」集合 | C/C++
c语言·开发语言·c++
zhangzhangkeji44 分钟前
UE5 材质-17:水材质系列一 ,panner 平移节点,
ue5·材质
乙己4071 小时前
设计模式——单例模式(singleton)
java·c++·单例模式·设计模式
嵌入式小李.man2 小时前
linux中多路复用IO:select、poll和epoll
linux·c++
郝学胜-神的一滴2 小时前
QAxios研发笔记(二):在Qt环境下基于Promise风格简化Http的Post请求
开发语言·c++·笔记·qt·网络协议·程序人生·http
晨非辰2 小时前
《数据结构风云》:二叉树遍历的底层思维>递归与迭代的双重视角
数据结构·c++·人工智能·算法·链表·面试
Yupureki4 小时前
从零开始的C++学习生活 17:异常和智能指针
c语言·数据结构·c++·学习·visual studio
deng-c-f11 小时前
配置(4):VScode c/c++编译环境的配置:c_cpp_properties.json
c语言·c++·vscode
应用市场12 小时前
Godot C++开发指南:正确获取节点的Forward/Up/Right方向向量
c++·游戏引擎·godot
小-黯12 小时前
OpenGL使用C++ 绘制三角形
c++·opengl·xmake