UE5 - 制作《塞爾達傳說》中林克的技能 - 14 - 技能面板

讓我們繼續《塞爾達傳說》中林克技能的制作!!!
UE版本:5.6.0
VS版本:2022
本章節的核心目標:技能面板
先讓我們看一下完成后的效果:

第14章效果

本章節項目鏈接:
通過網盤分享的文件:14_技能面板
鏈接: https://pan.baidu.com/s/1BcNuIlxd2elJZd70RfJgug 提取碼: rd7w
–來自百度網盤超級會員v3的分享


已經完成的功能:

動作按鍵是否完成
移動W、S、A、D完成
疲勞完成
沖刺Left Shift完成
滑行與跳躍Space完成
下落完成

預計制作的技能

技能(符文)按鍵是否完成
RBB(方向遙控炸彈)未設定未開始
RBS(圓形遙控炸彈)未設定未開始
Mag(磁鐵)未設定未開始
Stasis(時間靜止)未設定未開始
Ice(凍結)未設定未開始

UI交互

UI面板按鍵是否完成
打開(關閉)技能面板Tab進行中

本章節的項目文件:

技能的圖標:

在這里插入圖片描述

說明:每種技能共有4個圖標,用來表示4個不同的狀態。
Disable_Hover_Pressed:表示的是鼠標在未選中的圖標上懸停和按下的效果。
Disable_Normal:表示的是未選中的圖標(正常狀態下的顯示)。
Enable_Hover_Pressed:表示的是鼠標在選中的圖標上懸停和按下的效果。
Enable_Normal:表示的是選中的圖標顯示的效果。


0.導入素材

??將文件夾內的圖片全部拖拽進UE中。
在這里插入圖片描述
??為了防止模糊,我們將這些圖片的壓縮方式設置為UserInterface2D
具體操作為:全選圖片=》右鍵【資產操作】=》【編輯屬性矩陣中的選擇】
在這里插入圖片描述
選擇【壓縮】=》壓縮設置【UserInterface2D】
在這里插入圖片描述


1.ZSCharBase.h中新建符文的枚舉類

UENUM(BlueprintType)
enum class ERunes : uint8
{R_EMAX UMETA(DisplayName = "EMAX"),R_RBB UMETA(DisplayName = "方形遙控炸彈"),R_RBS UMETA(DisplayName = "圓形遙控炸彈"),R_Mag UMETA(DisplayName = "磁鐵"),R_Stasis UMETA(DisplayName = "時間靜止"),R_Ice UMETA(DisplayName = "凍結")
};UCLASS()
class ZELDARSKILLS_API AZSCharBase : public ACharacter
{GENERATED_BODY()
public:};

2.制作 - 顯示技能圖標用的格子

??目的1: 方便添加和管理圖標的顯示。
??目的2: 用于選中技能事件的邏輯交互(我們得獲知玩家點擊到了哪一個技能,然后才能執行后續的邏輯)。

2.1 新建用戶控件藍圖(命名為:UI_RuneSlot)

??命名為UI_RuneSlot,用于顯示技能圖標。
在這里插入圖片描述
在這里插入圖片描述

2.2 為UI_RuneSlot添加尺寸框

??尺寸框(Size Box)作用:控制子控件尺寸的核心布局容器。在這里我們用到了它的子布局:寬度重載和高度重置
??具體而言:添加尺寸框到UI_RuneSlot下后,勾選:寬度重載和高度重載,并將其值設置為250,而后選擇屏幕上所需
在這里插入圖片描述

2.3 為UI_RuneSlot添加勾選框

??勾選框(Check Box)作用:在本次項目而言,主要作用為與鼠標進行交互,能夠根據鼠標當前的一個操作情況顯示圖片。它的尺寸大小由尺寸框控制
在這里插入圖片描述
??重命名為CB,并勾選其為變量。后續在藍圖中有用。
在這里插入圖片描述

2.3.1(測試)為勾選框添加一張任意圖片

??目的:根據這張技能圖標顯示情況,獲取到圖片在勾選框應該顯示的大小。如下圖所示,明顯圖片填入后偏大(因為這個圖片是512x512的)。
在這里插入圖片描述
??將圖片的大小(Image Size)設置為250和250,就剛好合適(記下這個值,后面我們在藍圖中用得到)。
在這里插入圖片描述

2.3.2(可選)禁用鍵盤選中技能圖標

??如果你不希望玩家通過鍵盤來選擇符文,你可以取消勾選框內的該屬性。
在這里插入圖片描述

2.3.3(可選)調整勾選框內顯示的圖片

??不調整的話,勾選框內顯示的圖片與你導入的圖片相比會偏暗。這是由勾選框的前景顏色所引起的,取消繼承,并將前景顏色改為全白既可以解決這個問題。
在這里插入圖片描述

2.4 自定義添加圖片功能(UI_RuneSlot藍圖)

2.4.1(藍圖)觸發事件和設置的目標屬性

??是編輯器內部的功能:Event Pre Construct 觸發。設置的目標屬性是勾選框的樣式:Make Check Box Style
在這里插入圖片描述

2.4.2(藍圖)設置Unchcked Image

??Unchecked Image的值通過Make Slate Brush賦值。這個筆刷繪制用的“顏料”,就是我們的素材。接下來為我們的筆刷準備“顏料”
在這里插入圖片描述
??(1)Make Slate Brush的Image_Size設置為:(250,250)
在這里插入圖片描述
??(2)新建變量(Texture 2D【紋理2D】),并命名為:IMG_D_N:用于接收名字帶有Disabled_Normal的圖片。Make Slate Brush的Image設置為:IMG_D_N
在這里插入圖片描述

2.4.3(藍圖)設置Unchecked Hovered Image和Unchecked Pressed Image

??與2.4.2的操作完全一致。
在這里插入圖片描述

2.4.4(藍圖)設置剩下的情況

在這里插入圖片描述

2.4.5(藍圖)變量細節設置

??為了讓這些變量可以由我們手動進行賦值(添加圖片),因此我們要勾選可編輯實例和生成時公開
在這里插入圖片描述

2.4.6(藍圖,可選)Foreground Color 設置

在這里插入圖片描述

2.4.7(完成)功能完成示意圖

在這里插入圖片描述

2.5 選中符文的邏輯交互(UI_RuneSlot藍圖)

2.5.1(藍圖)添加事件-勾選狀態變化時

??當玩家點擊UI_RuneSlot后觸發的事件。
在這里插入圖片描述
在這里插入圖片描述

2.5.2(藍圖)新建事件分發器

??事件分發器的作用:用于管理和調度事件的傳遞與響應。它允許廣播事件,其他對象可根據需要訂閱這些事件,從而實現對象間的消息傳遞。
??新建一個事件分發器,命名為OnClicked,我們讓它傳遞如下兩個參數:
??(1)新建變量(文本)Name:用于傳遞點擊的符文名字
??(2)新建變量(ERunes)RuneType:用于傳遞點擊的符文類型
??PS:記得勾選 (1)可編輯實例和(2)生成時公開
在這里插入圖片描述

2.5.3(藍圖)新建函數獲取設置格子選中狀態

??目的:方便設置當前格子的選中狀態
??(1)新建一個函數:命名為CheckStatus
??(2)內部邏輯:設置勾選框的Checked即可
在這里插入圖片描述

2.5.4(完成)功能完成示意圖

??編譯執行后,回到UI_RuneSlot設計器界面,顯示如下內容,為該部分功能完成。
在這里插入圖片描述


3.制作 - 技能面板

??目的1:顯示所有的技能(UI_RuneSlot)
??目的2:管理技能選中邏輯

3.1 新建C++腳本(命名為:ZSRuneSelections)

在這里插入圖片描述
在這里插入圖片描述

3.2 創建基于ZSRuneSelections的藍圖類

??右鍵ZSRuneSelections,選擇創建基于ZSRuneSelections的藍圖類,并命名為UI_RuneSelections,放到UI文件夾下。
在這里插入圖片描述

3.3 搭建技能面板

3.3.1(UI設計)添加畫布面板

??(1)添加畫布面板;
??(2)為畫布面板,添加一個背景模糊(Background Blur),調整其參數:全覆蓋,將偏移量置為0,模糊強度設置為1。【添加背景模糊的目的:讓打開技能面板的時候,背景顯示模糊。】
在這里插入圖片描述

3.3.2(UI設計)添加水平框

??目的:管理技能。
??參數設置:
??(1)錨點:中心
??(2)位置X:0;位置Y:0;
??(3)對齊:(0.5,0.5)【說明:中心位置】;
??(4)尺寸X:1250【說明:有5個技能,每個技能長250,因此 為5x250=1250】。
??(5)尺寸Y:250【說明:高度就是250】
??(6)重命名:HB_RuneContainer,并勾選其為變量
在這里插入圖片描述

3.4 添加格子到技能面板中

??拖拽5個UI_RuneSlot到水平框下。
在這里插入圖片描述

3.5 設置UI_RuneSlot的參數

??以RBS為例
在這里插入圖片描述

3.6 交互文本

??創建一個文本,該文本的作用是顯示當前選中的技能名字。設置成如下圖所示,并記得勾選其為變量
在這里插入圖片描述


4. 代碼 - 選擇技能

4.1 技能面板與角色的交互

4.1.1 角色獲知當前選中的技能

簡單來說:ZSRuneSelections:告知ZSCharBase,當前選中的技能是誰。
具體而言:
ZSCharBase.h

	// 當前選中的符文UPROPERTY(EditAnywhere, Category = "Runes")ERunes ActiveRune{ ERunes::R_EMAX };

ZSRuneSelections.h

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "ZSCharBase.h"
#include "ZSRuneSelections.generated.h"/*** */
UCLASS()
class ZELDARSKILLS_API UZSRuneSelections : public UUserWidget
{GENERATED_BODY()public:UPROPERTY(EditAnywhere, BlueprintReadWrite)AZSCharBase* playerRef;UFUNCTION(BlueprintCallable)// 設置:角色當前選中的技能void SelectedRuneType(ERunes RuneType); 
};

ZSRuneSelections.cpp

// Fill out your copyright notice in the Description page of Project Settings.#include "UI/ZSRuneSelections.h"void UZSRuneSelections::SelectedRuneType(ERunes RuneType)
{// 玩家選擇技能if (playerRef){playerRef->ActiveRune = RuneType; // 更新玩家選中的技能}
}

4.2 UI_RuneSelections管理UI_RuneSlot

??我們希望通過UI_RuneSelections去管理所有的技能格子(UI_RuneSlot)。

4.2.1(藍圖)注冊UI_RuneSlot的OnClicked事件的響應函數

??通過UI_RuneSelections注冊UI_RuneSlot的OnClicked事件的響應函數。
在這里插入圖片描述

??綁定的響應函數為(自定義的:SelectedRune),該函數的功能如下:
(1)告知角色當前選中的技能(SelectRuneType方法)
(2)UIRuneSlot根據自身是否被選中設置其選中狀態Check Status)。
(3)UI_RuneSelectionsTXT_Hint顯示的內容設置為當前選中的符文名字
在這里插入圖片描述

??整體一覽:
在這里插入圖片描述


5.通過Tab鍵 - 玩家與技能面板交互

5.1 為UI_ZSLayout的畫布面板創建控件切換器

5.1.1 UI_ZSLayout介紹

??UI_ZSLayout是本人文章UE5 - 制作《塞爾達傳說》中林克的技能 - 9 - 耐力條制作(涉及藍圖)中,創建的。
??內部構造很簡單,就一個耐力條,如下圖
在這里插入圖片描述
??涉及的藍圖邏輯與耐力條的值有關,如下圖所示。
在這里插入圖片描述
??藍圖中的Update Stamina函數的內容如下圖:
在這里插入圖片描述

5.1.2 創建控件切換器

??選中UI_ZSLayout的畫布面板,右鍵,選擇包裹->控件切換器
在這里插入圖片描述
在這里插入圖片描述

??重命名為WS,并勾選為變量
在這里插入圖片描述

5.1.3 創建新的畫布面板

??存放PB_ST的畫布面板重命名為StatusPanel,將新建的畫布面板重命名為RunesPanel
在這里插入圖片描述

5.1.4 添加UI_RuneSelections

?? 將UI_RunesSelections拖拽到RunesPanel下面,調整大小,全覆蓋,偏移值設置為0,并將其勾選為變量。
在這里插入圖片描述

5.2 輸入操作與交互邏輯

5.2.1 UE創建輸入操作資產

??命名為:IA_ToogleUI
在這里插入圖片描述
??設置其為暫停時觸發
在這里插入圖片描述
??老規矩,到IMC_ZS_Settings添加,并設置為tab
在這里插入圖片描述

5.2.2 (cpp)交互邏輯

ZSCharBase.h

	// 聲明 喚出技能面板動作UPROPERTY(EditAnywhere, Category = "Inputs")UInputAction* ToggleUIAction;// 指向UZSLayout類型的UObject實例,用于管理UI布局的生命周期// 該指針由UE5垃圾回收系統自動管理,無需手動釋放UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI")TObjectPtr<UZSLayout> LayoutRef;#pragma region ToggleUIUFUNCTION()// Tab - 按下 - 觸發的函數void ToggleUI_Started(const FInputActionValue& val);
#pragma endregionUFUNCTION(BlueprintImplementableEvent)// 獲取角色當前切換的【畫布面板】編號// 如當前的Status Panel 編號為:0int32 GetWSIndexInfo();UFUNCTION(BlueprintImplementableEvent)// 設置角色當前切換的【畫布面板】編號,用于與UI交互// 如我設置為 0:則關閉技能面板顯示void SetWSIndex(int32 index);

ZSCharBase.cpp

void AZSCharBase::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{Super::SetupPlayerInputComponent(PlayerInputComponent);// UIEIComp->BindAction(ToggleUIAction, ETriggerEvent::Started, this, &AZSCharBase::ToggleUI_Started);}void AZSCharBase::ToggleUI_Started(const FInputActionValue& val)
{AZSPlayerController* PC = Cast<AZSPlayerController>(Controller);// 判斷當前顯示的面板是否為 技能面板if (GetWSIndexInfo() == 1){// ----- 隱藏技能面板 ------// 關閉鼠標顯示PC->bShowMouseCursor = false;// 將玩家控制器的輸入模式設置為僅游戲模式PC->SetInputMode(FInputModeGameOnly());// 繼續游戲PC->SetPause(false);// 隱藏技能面板 - 將控件切換器的索引設置為0(狀態面板)SetWSIndex(0);}else{// ----- 顯示技能面板 ------// 顯示鼠標 - 我們要用來選技能PC->bShowMouseCursor = true;// 設置玩家控制器為游戲與UI混合輸入模式,并聚焦到指定UI組件// 讓玩家能夠通過鼠標與UI元素進行交互FInputModeGameAndUI InputHandle;InputHandle.SetWidgetToFocus(LayoutRef->TakeWidget());PC->SetInputMode(InputHandle);// 暫停游戲PC->SetPause(true);// 顯示技能面板 - 將控件切換器的索引設置為1SetWSIndex(1);}}

5.2.3(藍圖)交互邏輯

??先添加IA_ToogleUIBP_Player中。
在這里插入圖片描述

??實現GetWSIndexInfo
(1)獲取到Layout Ref(也就是咱們的ZSLayoutUI)
(2)拿到其下的WS,返回激活的Index。
(3)若是LayoutRef的值無效,返回-1(即:什么都不會做)
在這里插入圖片描述

??實現SetWSIndex
(1)獲取到Layout Ref(也就是咱們的ZSLayoutUI)
(2)(2)拿到其下的WS,設置其Index(為傳入的Index)。
在這里插入圖片描述


第14部分完成啦!!
十分感謝大家的閱讀、點贊、收藏!!
如果有不足之處,有疑問之處,有錯誤地方,歡迎大家在評論區討論、批評、指正!!!

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

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

相關文章

用Tensorflow進行線性回歸和邏輯回歸(八)

新的TensorFlow概念 創建簡單的機器學習系統需要學習一些新的概念。 優化器 上兩節介紹的元素已經提示了TensorFlow是如何完成機器學習的。你已學習了如何用張量操作來定義損失函數。缺少的是你不知道如何用TensorFlow進行梯度下降。盡管可以用TensorFlow元素直接用 Python定…

基于python代碼的通過爬蟲方式實現TK下載視頻(2025年6月)

Tk的視頻頁面通常需要登錄才能獲取完整數據,但通過構造匿名游客的請求,我們可以繞過登錄限制,提取視頻的元信息(如標題、ID和播放地址)。核心思路如下: 構造匿名Cookie:通過模擬瀏覽器的請求,獲取Tk服務器分配的游客Cookie。解析網頁:利用BeautifulSoup解析HTML,定位…

火山 RTC 引擎14 設置CB

一、火山RTC引擎集成時,設置CB 1、統一設置 void NRTCEngine::SetByteRtcCBS() {UserPublishStreamCallback callback = [this](const std::string& roomId, const std::string& uid, bytertc::MediaStreamType type) {this->OnSigUserPublishStream(roomId, uid, …

BUUCTF在線評測-練習場-WebCTF習題[極客大挑戰 2019]PHP1-flag獲取、解析

解題思路 打開靶場&#xff0c;提示備份 常見的備份后綴名有.bak&#xff0c;.backup&#xff0c;.zip等等 這里肯定是要掃目錄了&#xff0c;不知道是我的問題還是目錄掃描工具的問題還是BUUCTF的問題&#xff0c;每次要掃目錄能掃出一堆東西來&#xff0c;不管你用什么后綴…

對話云蝠智能:大模型如何讓企業呼叫系統從 “成本中心” 變身 “價值樞紐”?

在人工智能重塑企業服務的浪潮中&#xff0c;云蝠智能&#xff08;南京星蝠科技有限公司旗下品牌&#xff09;以深厚的技術積累和行業實踐&#xff0c;逐步成長為國內智能外呼領域的標桿企業。其發展路徑揭示了技術自主創新與場景深度結合的必然性。 一、技術架構&#xff1a;全…

Python-文件管理

1. Open方法 Python 中的文件操作主要通過內置的 open() 函數來完成&#xff0c;該函數用于打開文件&#xff0c;并返回一個文件對象。通過文件對象&#xff0c;可以進行各種文件操作&#xff0c;如讀取、寫入、關閉等。 使用 open() 方法一定要保證關閉文件對象&#xff0c;即…

高速DIC技術之推進劑樣品在霍普金森桿的高速沖擊下的變形監測與不同材質頭盔在不同沖擊位置下的變形測試-VIC-3D HS非接觸全場動態應變測量系統

工程領域對材料與結構在極端動態載荷下復雜變形行為的測量有強烈的需求&#xff0c;且這種測量必須是精確、全域、非接觸式的&#xff0c;高速DIC技術應運而生并不斷得到發展。 常見動態應用包括&#xff08;但不限于&#xff09;&#xff1a;碰撞測試、爆炸試驗、沖擊試驗、跌…

微算法科技融合Grover算法與統一哈希函數的混合經典-量子算法技術,可在多領域高效提升文本處理效率

隨著數據規模的不斷擴大&#xff0c;尤其是在大數據和人工智能驅動的應用中&#xff0c;這些經典算法的線性復雜度逐漸成為瓶頸。面對數十億級別的文本數據&#xff0c;線性時間的算法仍然難以滿足實時性的要求。此外&#xff0c;經典算法在處理無序或隨機文本時&#xff0c;性…

Spring Boot Security Core

依賴配置&#xff08;Maven&#xff09; xml 復制 下載 運行 <!-- Spring Security Core --> <dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-core</artifactId><version>6.2.5<…

【趙渝強老師】OceanBase云平臺OCP

OCP的全稱是OceanBase Cloud Platform&#xff0c;即&#xff1a;OceanBase云平臺。OCP面向有OceanBase管理需求的中小型用戶&#xff0c;提供了基礎的主機管理、OceanBase 集群和租戶運維等能力。在OCP中主要包含兩個組成部分&#xff0c;它們分別是&#xff1a;MetaDB和OCP S…

快速定位Swagger文檔請求地址‘/v2/api-docs‘,發生未知異常.NullPointerException:精準定位+根治方案

問題現場&#xff1a;訪問 http://localhost:8080/v2/api-docs 時日志報錯&#xff1a; 請求地址/v2/api-docs,發生未知異常. java.lang.NullPointerException: nullat springfox.documentation.swagger2.mappers.RequestParameterMapper.bodyParameter(RequestParameterMappe…

圖像處理解決方案

證件照小工具微信小程序系統是基于微擎開源生態開發的多功能圖像處理平臺&#xff0c;專為用戶提供便捷的證件照制作及圖片編輯服務。微擎系統作為一款基于 PHP 開發的開源應用生態系統&#xff0c;具備快速搭建多端應用的能力&#xff0c;其模塊化架構與跨平臺兼容性為證件照工…

Qt聯合Halcon開發四:【詳細圖解】海康相機配置并鏈接測試

1. 下載與安裝海康 MVS SDK 首先&#xff0c;訪問海康機器人官網的下載中心&#xff0c;選擇 “Machine Vision” 模塊下的 MVS 軟件包。 1. 打開瀏覽器&#xff0c;進入&#xff1a;https://www.hikrobotics.com/cn/ 2. 下載最新版的 MVS 安裝包&#xff08;通常以 MVS_x.x.…

vue3打包后,圖片丟失

前言&#xff1a; 在 webpack 中使用 require() 來引入靜態圖片&#xff0c;但在 vite 中就不行。 代碼實現 <template><div><img :src"empty"></div> </template><script setup> // 引入本地圖片(注意改成您的路徑) import em…

MongoDB 8.0.10 windows11安裝記錄

最近在學習node&#xff0c;看的教程用的是MongoDB 5.0的&#xff0c;安裝上和新版的有一些區別&#xff0c;都安裝完后不能直接在C:\Program Files\MongoDB\Server\8.0\bin 這個目錄使用mongo 啟動&#xff0c;因為都沒那文件。 摸索了下弄好了。 下載社區版最新安裝包&#…

信息系統項目管理師023:云計算(2信息技術發展,網絡安全面試問題

2.關鍵技術 云計算的關鍵技術主要涉及虛擬化技術、云存儲技術、多租戶和訪問控制管理、云安全技術等。 1&#xff09;虛擬化技術 虛擬化是一個廣義術語&#xff0c;在計算機領域通常是指計算元件在虛擬的基礎上而不是真實的基礎上運行。虛擬化技術可以擴大硬件的容量&#x…

django csrf的局限性

Django的CSRF保護機制雖被廣泛應用&#xff0c;但在實際場景中存在以下關鍵局限性&#xff0c;需開發者特別注意&#xff1a; 一、內容類型限制&#xff08;Content-Type約束&#xff09; 僅保護特定響應類型 CSRF中間件默認只對text/html和application/xmlxhtml響應生效&#…

如何將緩存存到客戶端瀏覽器上呢

要將緩存存到客戶端瀏覽器&#xff0c;關鍵是讓 瀏覽器接收到合適的 HTTP 緩存控制響應頭。這通常通過 add_header 添加控制頭來實現。 ? 一般做法&#xff08;強緩存 協商緩存&#xff09;&#xff1a; &#x1f539; 1. 強緩存&#xff1a;使用 Cache-Control 和 Expires …

微軟ASR與開源模型分析

一、微軟ASR核心能力 1. 支持場景 場景功能實時語音轉文本低延遲流式識別&#xff08;會議字幕/直播轉錄&#xff09;音頻文件轉文本支持多種格式&#xff08;WAV/MP3等&#xff09;&#xff0c;批量處理長音頻定制化模型針對特定行業術語&#xff08;醫療/金融&#xff09;訓…

2025下半年軟考中級科目難度解析與選科指南

2025年下半年軟考中級科目共有6科&#xff0c;包括系統集成項目管理工程師、信息系統管理工程師、信息安全工程師、網絡工程師、軟件設計師以及多媒體應用設計師。面對眾多科目&#xff0c;考生應如何做出選擇&#xff1f; 一、考試時間安排 在開始備考之前&#xff0c;了解考…