UE5多人MOBA+GAS 13、添加死亡、復活邏輯以及布娃娃含物理資產的修改調整

文章目錄

  • 使用GE為角色添加定時的Tag控制死亡時間
    • 1、添加死亡Tag
    • 2、創建死亡GE,并完成相關配置
    • 3、在AbilitySystemComponent中監聽屬性的變化,調用GE來添加Tag到角色上
    • 4、在角色中監聽ASC傳入的Tag以及Tag的層數,來響應不同的函數
  • 添加死亡、復活的邏輯
    • 1、在`CAbilitySystemComponent`中,添加回血回藍函數
    • 2、在`CCharacter`中添加動畫蒙太奇,添加一些邏輯
    • 3、到子類`CPlayerCharacter`中覆蓋`OnDead`和`OnRespawn`
  • 添加布娃娃
  • 對物理資產的修改調整
    • 1、添加膠囊體
    • 2、添加約束(不然膠囊體之間會斷開)


使用GE為角色添加定時的Tag控制死亡時間

1、添加死亡Tag

去Tag中添加新的標簽

CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Stats_Dead)
UE_DEFINE_GAMEPLAY_TAG_COMMENT(Stats_Dead, "Stats.Dead", "死亡")

2、創建死亡GE,并完成相關配置

添加新的GEGE_Death
在這里插入圖片描述
使用擁有持續時間策略,后面幅度計算類型會采用屬性基礎,用等級來計算死亡時間,添加死亡標簽到角色上
在這里插入圖片描述

3、在AbilitySystemComponent中監聽屬性的變化,調用GE來添加Tag到角色上

到能力組件CAbilitySystemComponent中監聽生命的變化,對生命值為0的時候添加死亡的GE

public:UCAbilitySystemComponent();// 添加GEvoid AuthApplyGameplayEffect(TSubclassOf<UGameplayEffect> GameplayEffect, int Level = 1);private:void HealthUpdated(const FOnAttributeChangeData& ChangeData);// 死亡效果UPROPERTY(EditDefaultsOnly, Category = "Gameplay Effects")TSubclassOf<UGameplayEffect> DeathEffect;
UCAbilitySystemComponent::UCAbilitySystemComponent()
{GetGameplayAttributeValueChangeDelegate(UCAttributeSet::GetHealthAttribute()).AddUObject(this, &UCAbilitySystemComponent::HealthUpdated);
}void UCAbilitySystemComponent::AuthApplyGameplayEffect(TSubclassOf<UGameplayEffect> GameplayEffect, int Level)
{if (GetOwner() && GetOwner()->HasAuthority()){FGameplayEffectSpecHandle EffectSpecHandle = MakeOutgoingSpec(GameplayEffect, Level, MakeEffectContext());ApplyGameplayEffectSpecToSelf(*EffectSpecHandle.Data.Get());}
}void UCAbilitySystemComponent::HealthUpdated(const FOnAttributeChangeData& ChangeData)
{if (!GetOwner() || !GetOwner()->HasAuthority()) return;if (ChangeData.NewValue <= 0.0f){// 角色死亡if (DeathEffect){AuthApplyGameplayEffect(DeathEffect);}}
}

4、在角色中監聽ASC傳入的Tag以及Tag的層數,來響應不同的函數

在能力系統中使用了GE來獲取Tag,然后來到角色中監聽ASC獲取到的Tag做出相應的響應,到CCharacter中:

#pragma region GAS組件相關
private:// 綁定GAS屬性改變委托void BindGASChangeDelegates();// 死亡標簽更新void DeathTagUpdated(const FGameplayTag Tag, int32 NewCount);#pragma endregion#pragma region 死亡和復活 (Death and Respawn)
private:void StartDeathSequence();void Respawn();
#pragma endregion

在角色構造函數中添加,綁定要在實現能力組件和屬性初始化的下面。

ACCharacter::ACCharacter()
{PrimaryActorTick.bCanEverTick = true;// 禁用網格的碰撞功能GetMesh()->SetCollisionEnabled(ECollisionEnabled::NoCollision);CAbilitySystemComponent = CreateDefaultSubobject<UCAbilitySystemComponent>(TEXT("CAbilitySystemComponent"));CAttributeSet = CreateDefaultSubobject<UCAttributeSet>(TEXT("CAttributeSet"));OverHeadWidgetComponent = CreateDefaultSubobject<UWidgetComponent>(TEXT("OverHeadWidgetComponent"));OverHeadWidgetComponent->SetupAttachment(GetRootComponent());// 綁定GAS屬性改變委托BindGASChangeDelegates();
}void ACCharacter::BindGASChangeDelegates()
{if (CAbilitySystemComponent){CAbilitySystemComponent->RegisterGameplayTagEvent(TGameplayTags::Stats_Dead).AddUObject(this, &ACCharacter::DeathTagUpdated);}
}void ACCharacter::DeathTagUpdated(const FGameplayTag Tag, int32 NewCount)
{// 標簽數量不為0時,死亡。為0則復活。if (NewCount != 0){StartDeathSequence();}else{Respawn();}
}void ACCharacter::StartDeathSequence()
{UE_LOG(LogTemp, Warning, TEXT("%s:狗帶"),*GetName())
}void ACCharacter::Respawn()
{UE_LOG(LogTemp, Warning, TEXT("%s:復活"),*GetName())
}

在角色藍圖中給角色添加死亡GE
在這里插入圖片描述
在這里插入圖片描述

添加死亡、復活的邏輯

1、在CAbilitySystemComponent中,添加回血回藍函數

	// 回滿血、滿藍效果void ApplyFullStatEffect();// 滿血、滿藍效果UPROPERTY(EditDefaultsOnly, Category = "Gameplay Effects")TSubclassOf<UGameplayEffect> FullStatEffect;
void UCAbilitySystemComponent::ApplyFullStatEffect()
{AuthApplyGameplayEffect(FullStatEffect);
}

2、在CCharacter中添加動畫蒙太奇,添加一些邏輯

#pragma region UI/*** @brief 設置頭頂狀態條的啟用狀態\n* 啟用或禁用頭頂UI組件的顯示。\n* @param bIsEnabled 是否啟用頭頂UI*/void SetStatusGaugeEnabled(bool bIsEnabled);
#pragma endregion
#pragma region 死亡和復活 (Death and Respawn)
private:// 死亡蒙太奇UPROPERTY(EditDefaultsOnly, Category = "Death")TObjectPtr<UAnimMontage> DeathMontage;// 播放死亡動畫void PlayDeathAnimation();// 死亡void StartDeathSequence();// 復活void Respawn();// 子類中實現virtual void OnDead();virtual void OnRespawn();
#pragma endregion
void ACCharacter::SetStatusGaugeEnabled(bool bIsEnabled)
{// 清除定時器GetWorldTimerManager().ClearTimer(HeadStatGaugeVisibilityUpdateTimerHandle);if (bIsEnabled){// 啟動頭頂血條ConfigureOverHeadStatusWidget();}else{// 關閉頭頂血條OverHeadWidgetComponent->SetHiddenInGame(true);}
}void ACCharacter::PlayDeathAnimation()
{if (DeathMontage){PlayAnimMontage(DeathMontage);}
}void ACCharacter::StartDeathSequence()
{OnDead();// 播放死亡動畫PlayDeathAnimation();// 關閉頭頂血條SetStatusGaugeEnabled(false);// 禁用移動GetCharacterMovement()->SetMovementMode(EMovementMode::MOVE_None);// 禁用碰撞GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);UE_LOG(LogTemp, Warning, TEXT("%s:狗帶"),*GetName())
}void ACCharacter::Respawn()
{OnRespawn();SetStatusGaugeEnabled(true);// 開啟移動GetCharacterMovement()->SetMovementMode(EMovementMode::MOVE_Walking);// 開啟碰撞GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);GetMesh()->GetAnimInstance()->StopAllMontages(0.f);if (CAbilitySystemComponent){CAbilitySystemComponent->ApplyFullStatEffect();}UE_LOG(LogTemp, Warning, TEXT("%s:復活"),*GetName())
}void ACCharacter::OnDead()
{
}void ACCharacter::OnRespawn()
{
}

3、到子類CPlayerCharacter中覆蓋OnDeadOnRespawn

#pragma region Input// 輸入開關void SetInputEnabledFromPlayerController(bool bEnabled);
#pragma endregion
#pragma region 死亡和復活 (Death and Respawn)virtual void OnDead() override;virtual void OnRespawn() override;
#pragma endregion
void ACPlayerCharacter::SetInputEnabledFromPlayerController(bool bEnabled)
{// 獲取玩家控制器APlayerController* PlayerController = GetController<APlayerController>();// 如果玩家控制器為空,則返回if (!PlayerController){return;}if (bEnabled){// 啟用玩家控制器輸入EnableInput(PlayerController);}else{// 禁用玩家控制器輸入DisableInput(PlayerController);}
}void ACPlayerCharacter::OnDead()
{// 死亡,禁用玩家控制器輸入SetInputEnabledFromPlayerController(false);
}void ACPlayerCharacter::OnRespawn()
{// 復活,啟用玩家控制器輸入SetInputEnabledFromPlayerController(true);
}

創建一個死亡蒙太奇,設置新的插槽,關閉自動混出
在這里插入圖片描述

在動畫藍圖中添加這個新的插槽
在這里插入圖片描述
到角色中添加死亡蒙太奇
在這里插入圖片描述
添加補狀態的GE,這個GE在初始化屬性的時候創建了
在這里插入圖片描述
打死后又會復活:
在這里插入圖片描述
在這里插入圖片描述

添加布娃娃

#pragma region 死亡和復活 (Death and Respawn)
private:// 相對于網格的變換FTransform MeshRelativeTransform;// 死亡蒙太奇完成時間偏移UPROPERTY(EditDefaultsOnly, Category = "Death")float DeathMontageFinishTimeShift = -0.8f;// 死亡蒙太奇UPROPERTY(EditDefaultsOnly, Category = "Death")TObjectPtr<UAnimMontage> DeathMontage;// 死亡蒙太奇計時器句柄FTimerHandle DeathMontageTimerHandle;// 死亡蒙太奇完成處理void DeathMontageFinished();// 啟用/禁用 布娃娃系統void SetRagdollEnabled(bool bIsEnabled);// 播放死亡動畫void PlayDeathAnimation();// 死亡void StartDeathSequence();// 復活void Respawn();virtual void OnDead();virtual void OnRespawn();
#pragma endregion
void ACCharacter::BeginPlay()
{Super::BeginPlay();ConfigureOverHeadStatusWidget();MeshRelativeTransform = GetMesh()->GetRelativeTransform();//UE_LOG(LogTemp, Warning, TEXT("ACCharacter::BeginPlay,%hhd"),GetIsReplicated());//UE_LOG(LogTemp, Warning, TEXT("True是:,%hhd"),true);
}void ACCharacter::DeathMontageFinished()
{SetRagdollEnabled(true);
}void ACCharacter::SetRagdollEnabled(bool bIsEnabled)
{if (bIsEnabled){GetMesh()->DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform); // 從父組件分離網格,但保持世界變換不變GetMesh()->SetSimulatePhysics(true); // 啟用物理模擬GetMesh()->SetCollisionEnabled(ECollisionEnabled::PhysicsOnly); // 僅啟用物理碰撞}else{GetMesh()->SetSimulatePhysics(false); // 禁用物理模擬GetMesh()->SetCollisionEnabled(ECollisionEnabled::NoCollision); // 禁用碰撞GetMesh()->AttachToComponent(GetRootComponent(), FAttachmentTransformRules::KeepRelativeTransform); // 將網格重新附加到根組件,保持相對變換GetMesh()->SetRelativeTransform(MeshRelativeTransform); // 設置網格的相對變換}
}void ACCharacter::PlayDeathAnimation()
{if (DeathMontage){// 獲取死亡蒙太奇的持續時間float MontageDuration = PlayAnimMontage(DeathMontage);GetWorldTimerManager().SetTimer(DeathMontageTimerHandle, this, &ACCharacter::DeathMontageFinished, MontageDuration + DeathMontageFinishTimeShift);}
}void ACCharacter::StartDeathSequence()
{OnDead();// 播放死亡動畫PlayDeathAnimation();// 關閉頭頂血條SetStatusGaugeEnabled(false);// 禁用移動GetCharacterMovement()->SetMovementMode(EMovementMode::MOVE_None);// 禁用碰撞GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);UE_LOG(LogTemp, Warning, TEXT("%s:狗帶"),*GetName())
}void ACCharacter::Respawn()
{OnRespawn();// 關閉布娃娃SetRagdollEnabled(false);// 開啟血條SetStatusGaugeEnabled(true);// 開啟移動GetCharacterMovement()->SetMovementMode(EMovementMode::MOVE_Walking);// 開啟碰撞GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);// 停止所有蒙太奇GetMesh()->GetAnimInstance()->StopAllMontages(0.f);// 應用全屬性if (CAbilitySystemComponent){CAbilitySystemComponent->ApplyFullStatEffect();}UE_LOG(LogTemp, Warning, TEXT("%s:復活"),*GetName())
}

用上了布娃娃系統后
在這里插入圖片描述

對物理資產的修改調整

在這里插入圖片描述
刪除手上兩個膠囊體
在這里插入圖片描述
可以顯示所有骨骼
在這里插入圖片描述

1、添加膠囊體

在這里插入圖片描述

2、添加約束(不然膠囊體之間會斷開)

在這里插入圖片描述
對約束增加一些限制
在這里插入圖片描述
使用鏡像創造對稱的膠囊體(可以偷懶),對稱的約束需要手動重新調制
在這里插入圖片描述
給兩個小腿也添加膠囊
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88460.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88460.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88460.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Jiasou TideFlow重塑AI SEO全鏈路自動化新標桿

引言 在Google日均處理85億次搜索請求的數字化浪潮中&#xff0c;傳統SEO工作流面臨三大致命瓶頸&#xff1a;人工拓詞效率低下、跨部門協作成本高企、數據監控鏈路斷裂。因此諸如Jiasou AI SEO這樣專門為AI SEO而生的Agent就應運而生了。 背景 Jiasou AIGC不僅僅可以批量生成…

CentOs 7 MySql8.0.23之前的版本主從復制

準備倆臺虛擬機并啟動倆臺虛擬機都開啟mysql后查看二進制日志是否開啟先登錄mysqlmysql -u root -r輸入sql命令show variables like %log_bin%;如果log_bin 的value為OFF則是沒有開啟&#xff0c;跟著下面步驟開啟二進制日志退出mysqlexitvim /etc/my.cnf在最底下添加log_binmy…

Leetcode 3607. Power Grid Maintenance

Leetcode 3607. Power Grid Maintenance 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3607. Power Grid Maintenance 1. 解題思路 這一題思路上首先是一個DSU的思路&#xff0c;將所有的連通網絡計算出來&#xff0c;并對每一個網絡的節點進行歸類。然后我們需要對每一個網…

開源 python 應用 開發(三)python語法介紹

最近有個項目需要做視覺自動化處理的工具&#xff0c;最后選用的軟件為python&#xff0c;剛好這個機會進行系統學習。短時間學習&#xff0c;需要快速開發&#xff0c;所以記錄要點步驟&#xff0c;防止忘記。 鏈接&#xff1a; 開源 python 應用 開發&#xff08;一&#xf…

1-Kafka介紹及常見應用場景

Kafka 介紹 Apache Kafka 是一個開源的 分布式流處理平臺&#xff0c;最初由 LinkedIn 開發&#xff0c;后捐贈給 Apache 軟件基金會。它被設計用于高吞吐量、低延遲、可水平擴展地處理實時數據流。官網地址是&#xff1a;https://kafka.apache.org/ 以下是 Kafka 的核心介紹…

CH9121T電路及配置詳解

目錄1. CH9121T簡介2. 原理圖及接口2.1 參考電路2.2 CH9121T評估板2.3 差分端口2.4 網口燈顯示2.5 晶振2.6 其他接口3. 使用手冊及說明3.1 配置介紹3.2 默認參數3.3 串口波特率3.4 配置指令3.5 應用示例1. CH9121T簡介 CH9121 是一款網絡串口透傳芯片&#xff0c;自帶 10/100M…

科研數據可視化核心技術:基于 AI 與 R 語言的熱圖、火山圖及網絡圖繪制實踐指南

在學術研究競爭日趨激烈的背景下&#xff0c;高質量的數據可視化已成為科研成果呈現與學術傳播的關鍵要素。據統計&#xff0c;超過 60% 的學術稿件拒稿原因與圖表質量存在直接關聯&#xff0c;而傳統繪圖工具在處理組學數據、復雜關聯數據時&#xff0c;普遍存在效率低下、規范…

Windows體驗macOS完整指南

一、虛擬機安裝macOS專業方案1. 環境準備階段硬件檢測&#xff1a;進入BIOS&#xff08;開機時按Del/F2鍵&#xff09;確認開啟VT-x/AMD-V虛擬化選項建議配置&#xff1a;i5十代以上CPU/16GB內存/256GB SSD軟件準備&#xff1a;官網下載VMware Workstation 17 Pro獲取Unlocker補…

【普及/提高?】洛谷P1577 ——切繩子

見&#xff1a;P1577 切繩子 - 洛谷 題目描述 有 N 條繩子&#xff0c;它們的長度分別為 Li?。如果從它們中切割出 K 條長度相同的繩子&#xff0c;這 K 條繩子每條最長能有多長&#xff1f;答案保留到小數點后 2 位(直接舍掉 2 位后的小數)。 輸入格式 第一行兩個整數 N …

imx6ull-裸機學習實驗16——I2C 實驗

目錄 前言 I2C簡介 基本特性?? I2C 協議 起始位 停止位 數據傳輸 應答信號 I2C 寫時序 I2C 讀時序 I.MX6U I2C 簡介 寄存器 地址寄存器I2Cx_IADR(x1~4) 分頻寄存器I2Cx_IFDR 控制寄存器I2Cx_I2CR 狀態寄存器I2Cx_I2SR 數據寄存器I2Cx_I2DR AP3216C 簡介 …

【TCP/IP】5. IP 協議

5. IP 協議5. IP 協議5.1 概述5.2 IP 數據報格式5.3 無連接數據報傳輸5.3.1 首部校驗5.3.2 數據分片與重組5.4 IP 數據報選項5.4.1 選項格式5.4.2 選項類型5.5 IP 模塊的結構本章要點5. IP 協議 5.1 概述 IP 協議是 TCP/IP 協議簇的核心協議&#xff0c;位于網絡層&#xff0…

Linux 服務器挖礦病毒深度處理與防護指南

在 Linux 服務器運維中&#xff0c;挖礦病毒是常見且危害較大的安全威脅。此類病毒通常會隱蔽占用大量 CPU 資源進行加密貨幣挖礦&#xff0c;導致服務器性能驟降、能耗激增&#xff0c;甚至被黑客遠程控制。本文將從病毒特征識別、應急處理流程、深度防護措施三個維度&#xf…

MySQL數據表設計 系統的營銷功能 優惠券、客戶使用優惠券的設計

系統的營銷功能營銷功能概述&#xff1a;系統的營銷功能主要是&#xff1a;市場活動管理、營銷自動化、銷售線索管理以及數據分析和報告等。?ToC?&#xff08;Consumer&#xff09;&#xff1a;面向個人消費者&#xff0c;滿足日常消費需求。?優惠券的種類&#xff1a;ToC的…

讓 3 個線程串行的幾種方式

1、通過join()的方式 子線程調用join()的時候&#xff0c;主線程等待子線程執行完再執行。如果讓多個線程順序執行的話&#xff0c;那么需要他們按順序調用start()。/*** - 第一個迭代&#xff08;i0&#xff09;&#xff1a;* 啟動線程t1 -> 然后調用t1.join()。* …

在 Vue 項目中關閉 ESLint 規則

在 Vue 2 項目中關閉 ESLint 規則有以下幾種方法&#xff0c;根據您的需求選擇合適的方式&#xff1a; 1. 完全禁用 ESLint 修改 vue.config.js&#xff08;推薦&#xff09; module.exports {// 關閉 ESLintlintOnSave: false }或修改 package.json {"scripts": {&…

電腦息屏工具,一鍵黑屏超方便

軟件介紹 今天為大家推薦一款實用的PC端屏幕管理工具——CloseDsp。這款"息屏小能手"能一鍵關閉顯示器&#xff0c;解決各種場景下的屏幕管理需求。 核心功能 CloseDsp最突出的特點是能瞬間關閉顯示器屏幕。只需點擊"關閉顯示器"按鈕&#xff0c;屏幕…

嵌入式調試LOG日志輸出(以STM32為例)

引言在嵌入式系統開發中&#xff0c;調試是貫穿整個生命周期的關鍵環節。與傳統PC端程序不同&#xff0c;嵌入式設備資源受限&#xff08;如內存、存儲、處理器性能&#xff09;&#xff0c;且運行環境復雜&#xff08;無顯示器、鍵盤&#xff09;&#xff0c;傳統的斷點調試或…

Zephyr的設備驅動模型

默認配置默認配置 boards/arm/nucleo_f401re/ ├── nucleo_f401re.dts ← 板卡設備樹主入口 ├── nucleo_f401re_defconfig ← 默認 Kconfig 配置 ├── board.cmake ← CMake 構建入口overlay1.新增加驅動需要修改對應板的設備樹文件&#xf…

Mysql字段沒有索引,通過where x = 3 for update是使用什么級別的鎖

沒有索引時&#xff0c;FOR UPDATE 會鎖住整個表 現在&#xff0c;你正在一本一本地翻看所有書&#xff0c;尋找“維修中”的書&#xff0c;并且你對管理員說&#xff1a;“在我清點和修改完之前&#xff0c;別人不能動這些書&#xff0c;也不能往這個范圍里加新書&#xff01;…

TCP-與-UDP-協議詳解:原理、區別與應用場景全解析

TCP 與 UDP 協議詳解&#xff1a;原理、區別與應用場景全解析 在日常使用網絡的過程中&#xff0c;我們經常聽到 TCP 和 UDP 這兩個詞。你打開網頁、發送消息、觀看視頻&#xff0c;背后都在使用 TCP 或 UDP 進行數據傳輸。那么這兩個協議到底是怎么工作的&#xff1f;它們之間…