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


相关推荐
reddingtons3 小时前
场景美术师的“无限画板”:UE5中非破坏性的材质混合(Material Blending)工作流
ue5·材质·设计师·技术美术·游戏策划·游戏美术·substance
努力的小钟4 小时前
UE5 GAS GameAbility源码解析 EndAbility
ue5
AA陈超4 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P05-04 使用效果应用游戏标签
c++·游戏·ue5·游戏引擎·虚幻
zhangzhangkeji4 小时前
UE5 测量 -1,长度测量:P2制作定位球与定位线,P3制作射线检测节点,P4在鼠标位置生成定位球
ue5
不伤欣5 小时前
Unity Mask镂空效果(常用于新手引导或高亮显示UI元素)
游戏·ui·unity·游戏引擎
澄澈i6 小时前
CMake学习篇[3]---CMake进阶+嵌套CMakeLists+多层级关系
c++·学习·cmake
杨小码不BUG6 小时前
蛇形舞动:矩阵填充的艺术与算法(洛谷P5731)
c++·算法·矩阵·csp-j/s·循环控制
草莓熊Lotso7 小时前
《C++ STL list 完全指南:从基础操作到特性对比,解锁链表容器高效用法》
开发语言·c++·list
繁星星繁8 小时前
C++11学习笔记
c++·笔记·学习