详细介绍:《UE5_C++多人TPS完整教程》学习笔记60 ——《P61 开火蒙太奇(Fire Montage)》

news/2025/10/22 9:52:57/文章来源:https://www.cnblogs.com/lxjshuju/p/19157162

本文为B站系列教学视频 《UE5_C++多人TPS完整教程》 —— 《P61 开火蒙太奇(Fire Montage)》 的学习笔记,该系列教学视频为计算机工程师、程序员、游戏开发者、作家(Engineer, Programmer, Game Developer, Author)Stephen Ulibarri 发布在 Udemy 上的课程 《Unreal Engine 5 C++ Multiplayer Shooter》 的中文字幕翻译版,UP主(也是译者)为 游戏引擎能吃么。
在这里插入图片描述


文章目录

  • P61 开火蒙太奇(Fire Montage)
  • 61.1 开火操作映射
  • 61.2 创建开火动画蒙太奇
  • 61.3 播放蒙太奇
  • 61.4 Summary


P61 开火蒙太奇(Fire Montage)

本节课我们想要使用武器进行开火,这意味着我们需要创建用于开火的输入动作映射和开火的动画蒙太奇。
在这里插入图片描述


61.1 开火操作映射

  1. 添加开火操作映射 “Fire”,绑定按键为鼠标左键。
    在这里插入图片描述

  2. 打开 Visual Studio,在 “BlasterCharacter.h” 声明 “Fire” 操作映射函数 “FireButtonPressed()” 和 “FireButtonReleased()”,用于实现人物角色持枪开火和停火。

    /*** BlasterCharacter.h ***/
    ...
    UCLASS()
    class BLASTER_API ABlasterCharacter : public ACharacter
    {
    GENERATED_BODY()
    ...
    protected:
    // Called when the game starts or when spawned
    virtual void BeginPlay() override;
    // 与轴映射相对应的回调函数
    void MoveForward(float Value);		// 人物角色前进或后退
    void MoveRight(float Value);		// 人物角色左移或右移
    void Turn(float Value);				// 人物角色视角左转或右转
    void LookUp(float Value);			// 人物角色俯视或仰视
    // 与动作映射相对应的回调函数
    void EquipButtonPressed();			// 人物角色装备武器
    void CrouchButtonPressed();			// 人物角色蹲伏
    void AimButtonPressed();			// 人物角色开始瞄准
    void AimButtonReleased();			// 人物角色停止瞄准
    void AimOffset(float DeltaTime);	// 人物角色瞄准偏移
    virtual void Jump() override;		// 人物角色跳跃
    /* P61 开火蒙太奇(Fire Montage)*/
    void FireButtonPressed();			// 人物角色开火
    void FireButtonReleased();			// 人物角色停火
    /* P61 开火蒙太奇(Fire Montage)*/
  3. 在 “CombatComponent.h” 中声明变量 “bIsFireButtonPressed”,用于记录人物角色是否在开火,这样我们在动画蓝图就可以使用它的值判断是否播放开火动画,同时声明函数 “FireButtonPressed()” 并在 “CombatComponent.cpp” 中实现,用于开火或停火操作时设置 “bIsFireButtonPressed” 的值。

    /*** CombatComponent.h ***/
    UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
    class BLASTER_API UCombatComponent : public UActorComponent
    {
    GENERATED_BODY()
    ...
    protected:
    ...
    UFUNCTION()
    void OnRep_EquippedWeapon();				// 设置人物角色朝向的 Repnotify 函数
    /* P61 开火蒙太奇(Fire Montage)*/
    void FireButtonPressed(bool bPressed);	// 根据人物角色是否在开火,设置 bIsFireButtonPressed
    /* P61 开火蒙太奇(Fire Montage)*/
    private:
    ...
    UPROPERTY(EditAnywhere)
    float BaseWalkSpeed;						// 基础行走速度
    UPROPERTY(EditAnywhere)
    float AimWalkSpeed;							// 瞄准行走速度
    /* P61 开火蒙太奇(Fire Montage)*/
    bool bIsFireButtonPressed;					// 人物角色开火键是否按下
    /* P61 开火蒙太奇(Fire Montage)*/
    };
    /*** CombatComponent.cpp ***/
    ...
    /* P61 开火蒙太奇(Fire Montage)*/
    // 根据人物角色是否在开火,设置 bIsFireButtonPressed
    void UCombatComponent::FireButtonPressed(bool bPressed)
    {
    bIsFireButtonPressed = bPressed;
    }
    /* P61 开火蒙太奇(Fire Montage)*/
  4. 在 “BlasterCharacter.cpp” 的函数 “SetupPlayerInputComponent()” 中分别绑定操作映射函数 “FireButtonPressed()” 和 “FireButtonReleased()”,并完成它们的定义。

    /*** BlasterCharacter.cpp ***/
    ...
    // Called to bind functionality to input
    void ABlasterCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
    {
    Super::SetupPlayerInputComponent(PlayerInputComponent);
    // 绑定操作映射
    PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
    PlayerInputComponent->BindAction("Equip", IE_Pressed, this, &ABlasterCharacter::EquipButtonPressed);
    PlayerInputComponent->BindAction("Crouch", IE_Pressed, this, &ABlasterCharacter::CrouchButtonPressed);
    PlayerInputComponent->BindAction("Aim", IE_Pressed, this, &ABlasterCharacter::AimButtonPressed);
    PlayerInputComponent->BindAction("Aim", IE_Released, this, &ABlasterCharacter::AimButtonReleased);
    /* P61 开火蒙太奇(Fire Montage)*/
    PlayerInputComponent->BindAction("Fire", IE_Pressed, this, &ABlasterCharacter::FireButtonPressed);
    PlayerInputComponent->BindAction("Fire", IE_Released, this, &ABlasterCharacter::FireButtonReleased);
    /* P61 开火蒙太奇(Fire Montage)*/
    ...
    }
    ...
    /* P61 开火蒙太奇(Fire Montage)*/
    // 人物角色开火键按下
    void ABlasterCharacter::FireButtonPressed()
    {
    if (Combat) Combat->FireButtonPressed(true);	// 人物角色在开火,设置 Combat->bIsFireButtonPressed 为 true
    }
    // 人物角色开火键松开
    void ABlasterCharacter::FireButtonReleased()
    {
    if (Combat) Combat->FireButtonPressed(false);	// 人物角色已停火,设置 Combat->bIsFireButtonPressed 为 false
    }
    /* P61 开火蒙太奇(Fire Montage)*/

61.2 创建开火动画蒙太奇

  1. 编译后,在虚幻引擎中设置开火动画 “Fire_Rifle_Hip” 和瞄准开火动画 “Fire_Rifle_Ironsights” 的基础姿势动画为 “Zero_Pose” 和 “Aim_Zero_Pose
    在这里插入图片描述在这里插入图片描述

  2. 基于 “Fire_Rifle_Hip” 创建动画蒙太奇 “FireWeapon”,并移动至 “Game/Blueprints/Character/Animation/” 目录下。
    在这里插入图片描述

  3. 打开 “FireWeapon” 动画蒙太奇编辑窗口,“新建蒙太奇片段”(New Montage Section),命名为 “RifleHip”,然后 “删除蒙太奇片段”(Delete Montage Section)“Default”。
    在这里插入图片描述在这里插入图片描述

  4. 打开 “动画插槽管理器”(Animation Slot Manager)添加新的插槽 “WeaponSlot”,这样我们就可以在动画姿势中使用这个蒙太奇。
    在这里插入图片描述

  5. 在资产编辑器中切换 “DefaultGroup” 的插槽为 “WeaponSlot”。注意这里需要在左侧资产详情面板设置 “FireWeapon” 预览基础姿势为 “Zero_Pose”,否则在视口中人物角色还是 A 姿势;这个是教学视频里没提到的如果设置了预览基础姿势依然是 A 姿势,可以尝试点击 “预览插槽”(Preview Slot)。
    在这里插入图片描述在这里插入图片描述

  6. 拖拽 “Fire_Rifle_Ironsights” 至资产编辑器中,新建蒙太奇片段 “RifleAim”,在右下角蒙太奇片段中选中 “清除所有”(Clear),这样 “RifleHip” 就不会直接过渡到 “RifleAim” 了。
    在这里插入图片描述在这里插入图片描述在这里插入图片描述


61.3 播放蒙太奇

  1. 在 Visual Studio 中打开 “BlasterCharacter.h”,声明动画蒙太奇变量 “FireWeaponMontage” 和函数 “PlayFireMontage()”,在 “BlasterCharacter.cpp” 中完成函数 “PlayFireMontage()” 的定义。

    /*** BlasterCharacter.h ***/
    ...
    class BLASTER_API ABlasterCharacter : public ACharacter
    {
    GENERATED_BODY()
    public:
    ...
    // 重写复制属性函数
    virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;virtual void PostInitializeComponents() override;/* P61 开火蒙太奇(Fire Montage)*/// 播放开火蒙太奇void PlayFireMontage(bool bAiming);/* P61 开火蒙太奇(Fire Montage)*/...};
    /*** BlasterCharacter.cpp ***/
    ...
    /* P61 开火蒙太奇(Fire Montage)*/
    #include "BlasterAnimInstance.h"
    /* P61 开火蒙太奇(Fire Montage)*/
    ...
    /* P61 开火蒙太奇(Fire Montage)*/
    // 播放开火蒙太奇
    void ABlasterCharacter::PlayFireMontage(bool bAiming)
    {
    if (Combat == nullptr || Combat->EquippedWeapon == nullptr) return;
    UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance();	// 获取动画实例
    if (AnimInstance && FireWeaponMontage)
    {
    AnimInstance->Montage_Play(FireWeaponMontage);						// 在动画实例上播放开火蒙太奇
    FName SectionName;													// 蒙太奇片段名
    SectionName = bAiming ? FName("RifleAim") : FName("RifleHip");	// 如果人物角色在瞄准,播放 RifleAiming,否则播放 RifleHip
    AnimInstance->Montage_JumpToSection(SectionName);					// 在动画实例上播放蒙太奇片段
    }
    }
    /* P61 开火蒙太奇(Fire Montage)*/
  2. 编译后,在虚幻引擎中打开 “BP_EpicCharacter”,在右侧细节面板中设置 “Combat” 下的 “Fire Weapon Montage” 为 “FireWeapon”。
    在这里插入图片描述

  3. 打开 “BlasterAnimBP”,在 AnimGraph 面板添加蓝图节点 “使用缓存姿势 “Equipped””、“插槽 “DefaulSlot”” 节点以及 “新保存的缓存姿势”节点,并绘制下图所示蓝图。然后,选中 “插槽 “DefaulSlot”” 节点,在右侧细节面板切换插槽为 “WeaponSlot”。
    在这里插入图片描述

  4. 在 “AimOffset” 状态机的 “AimOffset” 状态节点蓝图面板中添加 “使用缓存姿势 “WeaponSlot””,按下图修改蓝图。
    在这里插入图片描述

  5. 在 Visual Studio 中打开 “CombatComponent.cpp” 完善函数 “FireButtonPressed()” 的定义,如果按下开火键,调用 “PlayFireMontage” 函数,根据人物角色的瞄准状态播放蒙太奇片段。

    /*** BlasterCharacter.cpp ***/
    /* P61 开火蒙太奇(Fire Montage)*/
    // 根据人物角色是否在开火,设置 bIsFireButtonPressed;根据人物角色的瞄准状态,播放开火蒙太奇片段
    void UCombatComponent::FireButtonPressed(bool bPressed)
    {
    bIsFireButtonPressed = bPressed;			// 设置 bIsFireButtonPressed
    if (Character && bIsFireButtonPressed)		// 如果人物角色在开火
    {
    Character->PlayFireMontage(bAiming);	// 根据 bAming 的值播放开火蒙太奇片段
    }
    }
    /* P61 开火蒙太奇(Fire Montage)*/
  6. 编译后在虚幻引擎中打开 “FireWeapon” 动画蒙太奇编辑窗口,在左侧资产详情面板将 “混入”(Blend In)和 “混出”(Blend Out)选项卡下的 “混合时间” 都设置为 0.0

  7. 进行测试,我们操控人物角色拾起武器,在不瞄准和瞄准两种情况下按下开火键,可以看到开火动画蒙太奇可以正常播放。
    在这里插入图片描述在这里插入图片描述


61.4 Summary

本节课我们成功实现了角色开火功能,包括输入处理、动画蒙太奇的创建和播放。在输入处理方面,我们在项目设置中创建 “Fire” 开火操作映射,绑定到鼠标左键。接着,在BlasterCharacter中定义了操作映射函数 “FireButtonPressed()” 和 “FireButtonReleased()” ,在 “CombatComponent” 中添加了用于记录开火键是否按下的变量 “bIsFireButtonPressed” 以及它对应的设置函数。随后,我们设置好 “Fire_Rifle_Hip” 和 “Fire_Rifle_Ironsights” 的基础姿势,基于开火动画创建“FireWeapon” 动画蒙太奇,并为 “FireWeapon” 添加了 “RifleHip” 和 “RifleAim” 两个蒙太奇片段,同时还创建了 “WeaponSlot” 插槽用于动画混合。接下来,我们进行了动画蓝图的优化,添加插槽节点和缓存姿势,在瞄准偏移状态机中集成武器插槽。最后,我们实现了蒙太奇的播放逻辑,在 “BlasterCharacter” 中实现 “PlayFireMontage()” 函数,根据瞄准状态播放对应的蒙太奇片段,在角色蓝图中设置开火蒙太奇资源;为确保动画立即播放,设置蒙太奇的混合时间为 0。测试结果表明我们的人物角色能够在站立和瞄准状态下正确播放对应的开火动画,为后续的武器射击功能奠定了基础。
在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/943068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么后悔在创业中用RUST这个妖魔化宣传的语言

概述 回顾在创业时,基于对性能、安全性、并发控制等特性的追求,决定把 Rust 作为后端的主要语言。认为 Rust 是一门“现代、安全又高效”的语言,兼顾性能与内存安全,因此看起来是非常理性的选择。然而,随着项目推…

2025年西安买房推荐Top 10:学区新房性价比终极指南

摘要 随着西安城市化进程加速和教育资源优化,2025年西安房地产市场持续火热,尤其是学区房和地铁口楼盘成为购房者关注焦点。本文基于行业数据和用户搜索行为,精选出西安买房推荐前十名榜单,结合性价比、交通便利性…

全国医院排名前十

全国医院排名前十全国医院综合实力排名前十的公立医院主要依据科研水平、临床能力及专科声誉,其中北京协和医院、四川大学华西医院、复旦大学附属中山医院等常年位居前列。以下为具体名单及选择建议:全国综合实力前十…

2025 年最新推荐!五莲花 / 五莲红 / 五莲灰 / 芝麻灰等路沿石优质厂家榜单:深度聚焦实力企业资源、加工与服务核心优势

引言 在路沿石行业快速发展的当下,市场需求持续增长,但客户在选择合作厂家时却面临诸多难题。部分厂家原料供应不稳定,导致产品品质参差不齐,难以满足市政工程、房地产项目等对耐用性的严苛要求;一些企业加工设备…

2025 年丁基胶厂家最新推荐排行榜:涵盖耐高温 / 光伏用 / 车用等多领域产品,助力企业精准挑选优质合作伙伴

引言 当前丁基胶应用场景持续拓展,建筑、汽车、太阳能等行业对其性能要求愈发多元,然而市场上供应商水平参差不齐,部分企业产品单一、技术薄弱,难以满足企业个性化需求,还有些供应商服务滞后、供应不稳定,给企业…

linux 中sed命令 d与g选项的区别

001、(base) [b20223040323@admin2 x_downloadagain]$ ls a.txt (base) [b20223040323@admin2 x_downloadagain]$ cat a.txt ## 测试数据 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15kk 16 17 18 19 2…

C# Avalonia 16- Animation- SampleViewer - ReusableFollowExample

C# Avalonia 16- Animation- SampleViewer - ReusableFollowExampleReusableFollowExample.axaml代码<UserControl xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/w…

2025年五金零件加工厂家权威推荐榜:精密零件/小五金加工/五金精密零件加工专业实力与品质保障精选指南

2025年五金零件加工厂家权威推荐榜:精密零件/小五金加工/五金精密零件加工专业实力与品质保障精选指南 行业背景与发展趋势 随着制造业向高质量、高精度方向转型升级,五金零件加工行业正经历着深刻的技术变革。在工业…

2025 年风电母线槽厂家最新推荐榜:聚焦企业专利技术、品质管控及知名客户合作案例的权威解析

在风电行业快速发展的背景下,母线槽作为关键输电设备,其性能与可靠性直接影响风电场运营效率。近年来,风电母线槽市场涌现出一批以技术驱动为核心的优秀企业,它们通过创新研发与严格品控,赢得了行业认可。本文基于…

2025年甲醇发动机润滑油厂家权威推荐榜:专业润滑技术,高效能保护,直销源头实力厂家口碑之选

2025年甲醇发动机润滑油厂家权威推荐榜:专业润滑技术,高效能保护,直销源头实力厂家口碑之选 随着全球能源结构转型加速,甲醇作为清洁替代燃料在交通运输领域的应用日益广泛。甲醇发动机因其高热效率和低排放特性,…

2025 年最新保温装饰一体板厂家排行榜:优选西宁及全国靠谱生产厂家,专业推荐值得信赖

引言 当前建筑建材市场中,保温装饰一体板需求激增,但行业乱象频发。众多品牌混杂,部分产品质量不达标,存在保温性能差、防火等级低等安全隐患,消费者缺乏专业知识难以辨别优劣,且售后不完善、施工不规范等问题,…

2025年10月deepseek排名优化推荐:高性价比解决方案市场报告

2025年10月,当企业想在DeepSeek、豆包、通义千问、Kimi等生成式引擎里获得更靠前的品牌露出时,“deepseek排名优化”成为市场部门的高频搜索词。用户场景通常有三类:一是品牌刚进入AI搜索生态,需要快速建立可见度;…

跨网文件交换系统:保障数据安全与加速研发的核心支撑

在数字化转型浪潮下,生物制药企业的研发、生产、质控等环节产生了海量高价值数据,如基因测序数据、临床试验报告、生产工艺参数等。这些数据常需在企业内部不同安全等级的网络(如研发内网、办公外网、生产控制网)间…

2025 最新不锈钢管厂家推荐排行榜权威发布:304/316L/2205 等材质焊管无缝管优质企业精选

引言 随着不锈钢管在石油、医药、航天等多领域的应用愈发广泛,市场需求持续攀升,但行业乱象也随之显现:部分产品耐腐蚀性、强度等核心性能不达标,加工精度参差不齐,难以匹配高端场景需求;同时,既有知名品牌与新…

评测阿里云 RDS for MySQL + DuckDB 架构:QuickBI 分析性能与兼容性实测

写在前面 最近看到阿里云RDS DuckDB发布,手头有一个TB级别的业务库,会定期导入到CK中进行OLAP类分析,用于查看数据的整体趋势,在使用时,当前有下面的通点:需要维护DTS由MySQL到ClickHouse的链路异构数据库的数据…

2025 年国内地磅生产厂家最新推荐排行榜:聚焦电子 / 物联网 / 无人值守 / 汽车衡 / 防爆等类型,精选综合实力强劲企业

引言 在工业生产、物流运输、港口码头等关键领域,地磅作为核心称重设备,其精度、稳定性与耐用性直接关乎企业生产效率提升、成本精准控制及管理决策科学性。当前地磅市场虽发展迅猛,但厂家数量繁杂,产品质量差距悬…

大模型后训练

预训练(基础知识广泛学)------微调(具体实操岗前学)------后训练(RLHF专业领域深入学) 策略模型、参考模型、价值模型、奖励模型策略模型:待后训练的大模型 参考模型:初始的策略模型。 奖励模型(RM):目标是刻画模…

2025年低烟无卤辐照线厂家推荐排行榜,UL3302低烟无卤,UL3767低烟无卤,UL4413低烟无卤,专业认证与优质性能保障

2025年低烟无卤辐照线厂家推荐排行榜:UL3302低烟无卤、UL3767低烟无卤、UL4413低烟无卤,专业认证与优质性能保障 在电子设备、汽车制造、通讯设施及医疗仪器等行业中,电线电缆的安全性和环保性日益受到重视。低烟无…

jq工具解析JSON数据操作示例

原创jq工具解析JSON数据操作示例一、基础操作场景 1. 字段提取 # 提取顶层字段 echo {"name":"John","age":30} | jq .name# 嵌套对象提取 echo {"user":{"profile&qu…

技术面:Spring(循环依赖,spring与springboot的区别)

什么是spring的循环依赖?什么是spring的三级缓存?三级缓存怎么解决的循环依赖?解决循环依赖一定要三级缓存吗?spring默认是否支持循环依赖?spring与springboot的区别是什么?Spring的循环依赖 循环依赖是指在使用…