学习虚幻C++开发日志——创建Selection Widget及其应用

embedded/2025/1/12 5:24:55/

教程视频:脚本冒险 - YouTube

前提:此代码运用到Common UI插件,需将其开启,以免后序编写产生未定义结构体的报错信息!

用C++进行UI绑定

创建继承于CommonUserWidget的类,此处命名为SelectionBase 

SelectionBase类头文件

#pragma once#include "CoreMinimal.h"
#include"UObject/Object.h"
#include"CommonButtonBase.h"
#include"SelectionOption.h"#include "SelectionBase.generated.h"// 声明一个委托类型,该委托接受一个整数参数
DECLARE_DELEGATE_OneParam(FOnSelectionChange, int);class UCommonTextBlock;UCLASS()
class MYPROJECT_API USelectionBase :public UCommonUserWidget
{GENERATED_BODY()
public:USelectionBase();virtual void NativeConstruct()override;void Clear();void AddOption(const FSelectionOption& InOption);void SetCurrentSelection(int InIndex);UFUNCTION(BlueprintCallable)void SelectionPrevious();UFUNCTION(BlueprintCallable)void SelectNext();FOnSelectionChange OnSelectionChange;
protected:UFUNCTION()UWidget* OnNavigation(EUINavigation InNavigation);void UpdateCurrentSelection();UPROPERTY(EditAnywhere,BlueprintReadOnly)TArray<FSelectionOption>Options;UPROPERTY(BlueprintReadOnly,meta=(BindWidget))TObjectPtr<UCommonTextBlock>Label;int CurrentSelection;
};

SelectionBase类源文件

#include"SelectionBase.h"
#include"CommonTextBlock.h"
#include"Logging/StructuredLog.h"USelectionBase::USelectionBase()
{//设置当前选择为0CurrentSelection = 0;//开启可以聚焦(CommonUI特性)SetIsFocusable(true);//设置对象可见性为可见SetVisibilityInternal(ESlateVisibility::Visible);
}void USelectionBase::NativeConstruct()
{Super::NativeConstruct();if (Options.Num() == 0){//UE_LOGFMT(LogTemp, Log, "USelectionBase:No options where provied.");return;}UpdateCurrentSelection();FCustomWidgetNavigationDelegate NavigationDelegate;NavigationDelegate.BindDynamic(this, &USelectionBase::OnNavigation);//设置自定义的导航规则,当使用左或右箭头导航时,调用 OnNavigation 方法。SetNavigationRuleCustom(EUINavigation::Left, NavigationDelegate);SetNavigationRuleCustom(EUINavigation::Right, NavigationDelegate);
}void USelectionBase::Clear()
{//重置 Options 数组,移除所有选项。Options.Reset();
}void USelectionBase::AddOption(const FSelectionOption& InOption)
{//向 Options 数组中添加一个新的选项。Options.Add(InOption);//调用 UpdateCurrentSelection 方法来更新当前选择UpdateCurrentSelection();
}void USelectionBase::SetCurrentSelection(int InIndex)
{check(InIndex >= 0 && InIndex <Options.Num());//设置当前选择到指定的索引。CurrentSelection = InIndex;UpdateCurrentSelection();
}void USelectionBase::SelectionPrevious()
{OnNavigation(EUINavigation::Left);
}void USelectionBase::SelectNext()
{OnNavigation(EUINavigation::Right);
}UWidget* USelectionBase::OnNavigation(EUINavigation InNavigation)
{check(InNavigation == EUINavigation::Left || InNavigation == EUINavigation::Right);const auto Direction = InNavigation == EUINavigation::Left ? -1 : 1;CurrentSelection += Direction;//处理循环选择(当选择超出范围时回到另一端)。if (CurrentSelection < 0){CurrentSelection = Options.Num() - 1;}else if (CurrentSelection >= Options.Num()){CurrentSelection = 0;}UpdateCurrentSelection();OnSelectionChange.ExecuteIfBound(CurrentSelection);return this;
}void USelectionBase::UpdateCurrentSelection()
{//检查当前选择是否有效。if (CurrentSelection < 0 || CurrentSelection >= Options.Num()){// Handle the error, e.g., log an error message and return//UE_LOG(LogTemp, Error, TEXT("UpdateCurrentSelection Widget: Invalid array index: %d"), CurrentSelection);return;}//更新显示的标签为当前选择项的标签Label->SetText(Options[CurrentSelection].Label);
}

此处创建了SelectionOption.cpp文件进行定义Option结构体,使其在SelectionBase进行结构体调用。 

#pragma once#include"SelectionOption.generated.h"
USTRUCT(BlueprintType)
struct FSelectionOption
{GENERATED_BODY()UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="Option")FText Label;
};

最后在虚幻编辑器进行蓝图调用绑定

创建一个蓝图UI组件继承于SelectionBase,

需要创建一个CommonText并且命名为Label的变量进行Bind Widgets,否则会编译UMG产生报错,按钮按键的点击事件在蓝图函数中进行调用。


http://www.ppmy.cn/embedded/153215.html

相关文章

【C++开源库】tinyxml2解析库使用介绍

TinyXML-2是一个在C中使用的轻量级、简单且高效的XML解析库。它由Lee Thomason开发&#xff0c;旨在提供快速解析和生成XML数据的功能&#xff0c;同时保持代码的简洁性和易于使用。TinyXML-2支持多种编译器和平台&#xff0c;包括Windows、Linux和macOS。 特点与优势 简单易用…

VUE3 VITE项目在 npm 中,关于 Vue 的常用命令有一些基础命令

如果你正在使用 Vite 构建的 Vue 3 项目&#xff0c;并且想要使用相关的 Vue 和 Vite 工具&#xff0c;下面是一些常用的命令和步骤来创建和管理 Vue 项目。 1. 使用 npm create 创建 Vue 3 项目&#xff08;Vite&#xff09; 如果你还没有创建项目&#xff0c;可以使用以下命…

UE5 打包要点

------------------------- 1、需要环境 win sdk &#xff0c;大约3G VS&#xff0c;大约10G 不安装就无法打包&#xff0c;就是这么简单。 ----------------------- 2、打包设置 编译类型&#xff0c;开发、调试、发行 项目设置-地图和模式&#xff0c;默认地图 项目…

小程序相关

1.右侧胶囊宽度&#xff0c;胶囊和文本重合问题 // #ifdef MP-WEIXIN // 获取胶囊左边界坐标 const { left } uni.getMenuButtonBoundingClientRect() this.rightSafeArea left px // #endif//给到你的内容宽度 <view :style"{max-width:rightSafeArea}"> …

面试:C++类成员初始化顺序

1、非静态数据成员&#xff1a;按它们在类定义的声明顺序初始化&#xff0c;不会按它们在初始化列表的顺序。 2、静态数据成员&#xff1a;在main函数启动之前&#xff0c;并且只初始化一次 3、基类构造函数&#xff1a;如果类从一个或多个基类继承而来&#xff0c;基类的构造…

数据结构与算法之二叉树: LeetCode 199. 二叉树的右视图 (Ts版)

二叉树的右视图 https://leetcode.cn/problems/binary-tree-right-side-view/ 描述 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1 输入&#xff1a;root [1,2,3,nu…

为AI聊天工具添加一个知识系统 开发环境准备

现在&#xff0c;我准备开始开发这个项目&#xff0c;需要搭建开发环境 并将前面的程序整理到项目文件中。请完成--我是一个新手 好的&#xff01;我将帮助您从头开始搭建开发环境&#xff0c;并整理好之前的程序代码到项目文件中&#xff0c;以便您可以轻松启动这个项目。以下…

springCloudGateWay使用总结

1、什么是网关 功能: ①身份认证、权限验证 ②服务器路由、负载均衡 ③请求限流 2、gateway搭建 2.1、创建一个空项目 2.2、引入依赖 2.3、加配置 3、断言工厂 4、过滤工厂 5、全局过滤器 6、跨域问题