UE4 获取目录下所有的图片转换成Texture2D并通过UMG显示出来

2023-10-27

主要内容:

本文主要讲解简单插件的编写、将类继承至Subsystem“子系统”框架的好处、鼠标射线检测以及鼠标拖拽功能的实现。

实现步骤:

一、编写插件

1.首先新建一个空的C++项目,然后新建插件,Author是作者名,Description是描述,为什么要编写插件?因为插件方便功能的移植,只需要放在项目的Plugins(没有就自己新建一个)目录下,然后在编辑器内启用就能使用插件的功能
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210407144445610.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNDEwMDU0,size_16,color_FFFFFF,t_70

2.创建完插件后会多出一个文件夹,然后就在这个文件夹内新建一个继承自Subsystem框架的类,引擎已经预定义的5个让你可以由此派生的父类,自己判断继承至哪个类,运用Subsystem的好处:自动实例化、托管生命周期、可以在蓝图的各个地方调用该类的属性以及方法,关于Subsystem框架的更详细的介绍可以参考大钊在知乎编写的《InsideUE4》专栏《InsideUE4》
UEngineSubsystem
UEditorSubsystem
UGameInstanceSubsystem
UWorldSubsystem
ULocalPlayerSubsystem

在这里插入图片描述
在这里插入图片描述

3.编写代码

ImageToTexture.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "ImageToTexture.generated.h"

/**
 * 
 */
UCLASS()
class LOADIMAGETOTEXTURE2D_API UImageToTexture : public UGameInstanceSubsystem
{
	GENERATED_BODY()

public:
	//通过路径获取单张图片将之转化成Texture2D
	UFUNCTION(BlueprintCallable, Category = "Image")
		UTexture2D* LoadTexture2D(const FString path);

	//获取指定路径下的所有图片的名称,类似于XX.JPG
	UFUNCTION(BlueprintCallable, Category = "Image")
		TArray<FString> GetFolderFiles(FString path);

	//将指定路径下的所有图片转化成Texture2D
	UFUNCTION(BlueprintCallable, Category = "Image")
		TArray<UTexture2D*> GetAllImageFromFiles(FString Paths);

	//判断图片类型
	TSharedPtr<class IImageWrapper> GetImageWrapperByExtention(const FString Path);
};

ImageToTexture.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "ImageToTexture.h"
#include "IImageWrapper.h"
#include "IImageWrapperModule.h"
#include "Core\Public\HAL\FileManagerGeneric.h"

UTexture2D* UImageToTexture::LoadTexture2D(const FString path)
{
	UTexture2D* Texture = nullptr;
	if (!FPlatformFileManager::Get().GetPlatformFile().FileExists(*path))
	{
		return nullptr;
	}
	TArray<uint8> RawFileData;
	if (!FFileHelper::LoadFileToArray(RawFileData, *path))
	{
		return nullptr;
	}
	TSharedPtr<IImageWrapper> ImageWrapper = GetImageWrapperByExtention(path);
	if (ImageWrapper.IsValid() && ImageWrapper->SetCompressed(RawFileData.GetData(), RawFileData.Num()))
	{
		TArray<uint8> UncompressedRGBA;
		if (ImageWrapper->GetRaw(ERGBFormat::RGBA, 8, UncompressedRGBA))
		{
			Texture = UTexture2D::CreateTransient(ImageWrapper->GetWidth(), ImageWrapper->GetHeight(), PF_R8G8B8A8);
			if (Texture != nullptr)
			{
				void* TextureData = Texture->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
				FMemory::Memcpy(TextureData, UncompressedRGBA.GetData(), UncompressedRGBA.Num());
				Texture->PlatformData->Mips[0].BulkData.Unlock();
				Texture->UpdateResource();
			}
		}
	}
	return Texture;
}

TArray<FString> UImageToTexture::GetFolderFiles(FString path)
{
	TArray<FString> files;
	FPaths::NormalizeDirectoryName(path);
	IFileManager& FileManager = IFileManager::Get();
	FString FinalPath = path / TEXT("*");
	FileManager.FindFiles(files, *FinalPath, true, true);
	return files;
}

TArray<UTexture2D*> UImageToTexture::GetAllImageFromFiles(FString Paths)
{
	TArray<FString> ImgPaths = GetFolderFiles(Paths);
	TArray<UTexture2D*> Texture2DArr;
	for (auto path : ImgPaths)
	{
		UTexture2D* Texture2D = LoadTexture2D(Paths + "/" + path);
		Texture2DArr.Add(Texture2D);
	}
	return Texture2DArr;
}

//只写了png和jpg格式的图片读取,如果有其他格式的需求,请自行添加
TSharedPtr<class IImageWrapper> UImageToTexture::GetImageWrapperByExtention(const FString Path)
{
	IImageWrapperModule& module = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper"));
	if (Path.EndsWith(".png"))
	{
		return module.CreateImageWrapper(EImageFormat::PNG);
	}
	if (Path.EndsWith(".jpg"))
	{
		return module.CreateImageWrapper(EImageFormat::JPEG);
	}
	return nullptr;
}

二、制作UI和蓝图

1.新建Actor蓝图WBP_Static用来充当画板的角色,添加一个Plane(Static Mesh Component),创建动态材质实例,新建材质Mat_UE赋给Plane,最后将WBP_Static放在关卡内
在这里插入图片描述
Mat_UE
在这里插入图片描述
在这里插入图片描述

2.创建WBP_Image,用来显示单张图片
在这里插入图片描述
在这里插入图片描述
3.重写三个函数,都可以从左边Functions点击+号,在Override里找到

重写On Mouse Button Down函数,用来检测按键是否按下
在这里插入图片描述

重写On Drag Detected鼠标拖拽函数
在这里插入图片描述

重写On Drag Cancelled函数,用来执行鼠标拖拽取消后的逻辑
在这里插入图片描述
4.创建WBP_Main,用来展现所有的图片
在这里插入图片描述
找到项目文件夹新建一个存放图片的文件夹(Image)用来测试
在这里插入图片描述
在这里插入图片描述

5.在关卡蓝图里创建WBP—Main
在这里插入图片描述
三、最终效果及项目下载地址(4.25)
在这里插入图片描述
链接:https://pan.baidu.com/s/1mwDDgOCzTfDdfxFEnN-VkA?pwd=i71w
提取码:i71w

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UE4 获取目录下所有的图片转换成Texture2D并通过UMG显示出来 的相关文章

  • UE4和C++ 开发-新手常用C++API

    C 暴露给蓝图可编辑 UCLASS Blueprintable 创建FString FString Printf TEXT aa bb 蓝图调用变量 UCLASS ClassGroup Custom meta BlueprintSpawna
  • UE4_UATHelper: Packaging (Windows (64-bit)): ERROR: Failed to copy

    在项目中引用了开发的插件 插件中引用了第三方库 目录结构如下 报错信息如下 UATHelper Packaging Windows 64 bit ERROR Failed to copy E Project WorkSpace KafkaD
  • 想用好虚幻4引擎做游戏,你需要避免这些扰人的坑(备忘)

    在手游品质越发上扬的如今 已经有不少厂商开始使用一些性能更好的引擎 去尝试游戏制作了 而虚幻4引擎 以下简称UE4 就是其中之一 在这款引擎中已经诞生了诸如 铁拳7 地狱之刃 帕拉贡 等一系列大作 对玩家而言 这些作品都是不折不扣的视觉盛宴
  • UE4 DDC共享

    本人用的是源码引擎编译的 内网使用DDC 先创建一个共享文件夹 这个文件夹来保存共享资源 修改引擎的baseengine ini cpp DerivedDataBackendGraph Shared Type FileSystem Read
  • 【UE4源代码观察】观察DDC(DerivedDataCache)

    UE4源代码观察 观察DDC DerivedDataCache YakSue的博客 CSDN博客 概念 DDC 全名DerivedDataCache 派生数据缓存 很早就知道UE4里存在DDC这个概念 也发现了DDC占用了很多磁盘空间 也遇
  • UE TSubclassOf

    定义 TSubclassOf
  • UE 材质学习

    值材质三原素 材质 材料 肌理 纹络 or 纹理 图案 Material Texture Pattern UE5中对应材质的 三原素 的内容 材质 Metallic 金属感 Roughness 粗糙度 Specular 高光 镜面 肌理 N
  • 修改UE4缓存路径,免得太多占用c盘空间

    UE4系列文章目录 文章目录 UE4系列文章目录 前言 一 修改默认缓存路径 打开Epic Games 自定义缓存位置 前言 在安装好了UE4之后 UE4引擎会默认生成缓存路径 C Users ASUS AppData Local Unre
  • [UE4笔记] 3DUI空间交互

    在Actor中使用widget的时候制作3DUI 如果直接选择World模式 鼠标和UI是无法产生交互的 只要勾选了红框里的选项 就可以正常交互了 老是忘记 所以写个笔记记录一下 效果 注意 如果你还是点击不到 输入控制台命令showfla
  • 11月5日 Unreal Engine Rider 代码使用记录

    11月5日的代码使用记录 TSubclassOf UPROPERTY EditAnywhere TSubclassOf
  • UE4-DeltaTime(时间增量)

    UE4 DeltaTime 时间增量 Time 2020年10月14日13 33 52 Author Yblackd UE4 DeltaTime 1 结论 2 deltaTime 增量时间 3 为什么乘以 时间增量 4 注意误区 5 参考
  • UE4 技能系统(GAS插件的使用) 01--Build Basic Classes 创建基础类

    翻译自Udemy的视频课程introduction to unreal engine 4 ability system Build Basic Classes 创建基础类 1 创建工程和人物设置 01 创建Git仓库 使用UE4 22 VS
  • 使用UE4(UnrealEngine)创建工程

    UE4系列文章目录 文章目录 UE4系列文章目录 前言 一 步骤 1 打开UE4软件 2 新建工程 3 选择游戏类型模板 4 项目设置 运行游戏 前言 使用UE4 UnrealEngine 创建工程 我这里的ue4版本是4 27 2 一 步
  • UE4 UI界面

    在UE4中创建UI界面是创建一个widget 进去之后左上角是选择控件 找到直接拖上去 中间那个框代表的就是我们的屏幕 在button中打字也就是给button命名时需要在上面在拖一个text控件 更好的排版可以改变锚点 这四个就类似与边距
  • UE4安卓打包配置(大陆内网络整顿后,Android打包时AndroidWorks无法使用的解决方法)

    由于国内进行了网络整顿 UE4官网上用CodeWorksforAndroid下载安卓打包工具配置的方法已经不能使用了 开了VPN也链接不上 这使得用UE4打包配置安卓游戏变得非常麻烦 博主捣鼓了好几天才打包成功 深感在中国学习UE4的艰难与
  • UE4持续集成打包(Mac脚本自动化打包)

    主要通过RunUAT进行打包 win和mac均可以打包 本次打包实现在Mac环境下 使用 Engine Build BatchFiles RunUAT sh 参考命令格式 参考文献1 RunUAT BuildCookRun project
  • 【UE4】DataTable - 数据表

    本文使用 UE 4 26 引擎自带 ARPG 项目 从代码和编辑器两个方面记录一下 UE4 中的 DataTable 也就是数据表的用法 一 DataTable 是什么 DataTable 就是数据表 以下简称 DT 也就是二维的 M 行
  • 第十七篇:Unity/UE4如何实现Cave空间(一)

    首先什么叫CAVE空间 CAVE是围绕着观察者具有多个图像画面的虚拟现实系统 多个投影面组成一个虚拟空间 理论上CAVE是基于计算机图形学把高分辨率的立体投影技术和三维计算机图形技术 音响技术 传感器技术等综合在一起 产生一个供多人使用的完
  • UE4 射线检测案例(C++)

    UE4 射线检测 C 开发场景 玩家 C 开发的 武器 C 射线检测函数 蓝图 C 效果 制作流程 添加开火按键映射 新建一个继承ACharacter的C 用蓝图继承刚刚新建的C 然后设置好游戏模式 我 这是是 用了一个枚举 其实你直接调用
  • UE4(Unreal Engine4)在蒙太奇动画中添加音频轨道通知

    UE4系列文章目录 文章目录 UE4系列文章目录 前言 一 遇到的问题 二 操作步骤 前言 UE4 Unreal Engine4 在蒙太奇动画中添加音频轨道通知 我们想在某一帧动画中添加声音 比如我们想在动画的第13帧这里添加音效 一 遇到

随机推荐

  • curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to raw.githubusercontent.com:443

    MacOS系统使用 Homebrew 官方地址时 报错 Mac安装homebrew的时候报错 Mac bin bash c curl fsSL https raw githubusercontent com Homebrew install
  • 自定义openwrt的配置界面:luci进阶之路

    5 20 晴 今天的太阳挺大的 晒得我进园区直接37 3警告 于是我百度搜索微信朋友圈怎么关闭 才把温度稳定下来 算了算了 上班说事 由于公司部门调动 逐渐接触到新的知识 新的模块 还听说这玩意比较冷门 没办法 该搞还是得搞 又不是搞不了
  • 渗透测试技术----常见web漏洞--命令执行原理及防御

    一 命令执行漏洞介绍 1 命令执行漏洞简介 命令执行漏洞时指服务器没有对执行的命令进行过滤 用户可以随意执行系统命令 命令执行漏洞属于高危漏洞之一 也属于代码执行的范围内 2 命令执行漏洞的原理 应用程序有时需要调用一些执行系统命令的函数
  • 嵌入式AI助力当代商业的发展

    数字化转型的业务影响是广泛的 但购买者应寻求嵌入式AI在以下领域具有最大的影响力 1 业务流程和任务的自动化 当买家搜索购买包含AI的软件时 他们应该研究该解决方案为员工自动执行日常任务的方式 嵌入式AI应该节省员工的时间和精力 以便他们可
  • 华为文稿演示服务器操作异常修复,修复服务器

    修复服务器 内容精选 换一换 安装Agent插件后 修复插件配置为用户提供了一键配置AK SK RegionID ProjectId的功能 省去了繁琐的手动配置步骤 提升配置效率 目前大部分区域已上线一键式授予该区域插件权限功能 即自动修复
  • java编码 第一次

    这是java的快速入门 演示java的开发步骤 对代码的相关说明 1 public class Hello 表示Hello是一个类 是一个public公有的类 2 Hello 表示一个类的开始和结束 3 public static void
  • java循环while之等差数列均值_java基础_while 循环语句的定义及用法

    一 while 循环语句的定义 在 C 语言中 while 循环是除了 for 循环外最常用的循环语句 相对于 for 循环而言 while 循环更多地应用于循环次数未定的循环控制中 while 循环的一般表达形式为 while 表达式 循
  • 色温

    色温是表示光线中包含颜色成分的一个计量单位 从理论上说 黑体温度指绝对黑体从绝对零度 273 开始加温后所呈现的颜色 黑体在受热后 逐渐由黑变红 转黄 发白 最后发出蓝色光 当加热到一定的温度 黑体发出的光所含的光谱成分 就称为这一温度下的
  • 线程池OOM错误

    1 LinkedBlockingQueue报错 package com spring pro threadpool completableFuture youhua test import java util concurrent Exec
  • 【场景】大数据常考场景题 - Bitmap

    大数据开发面试通常会问场景题 主要考察大数据中常用的数据结构 比如 Bitmap Bloom Filter 等等 今天就说一个工作中碰到的 比如昨天说到的问题 用户要在自定义时间区间内查询 就需要快速响应 可能用到 ClickHouse 可
  • Ubuntu 下安装 apt-get install npm

    步骤一 sudo apt get remove nodejs npm 删除原来的 sudo apt get install curl curl sL https deb nodesource com setup sudo bash sudo
  • 第十一届蓝桥杯国赛 奇偶覆盖

    我的主要思路是找到每个矩形内的单位方格 再使用set集合将所有方格统计 最后在set集合里遍历每一个方格 统计其再矩形里出现的次数 即为面积 再蓝桥刷题系统上只能过30 有优化方案的欢迎私信讨论 矩形类 class The it def i
  • Angular4 使用GET向后端请求数据

    Angular4 使用GET向后端请求数据 在工程的src app app module ts的头部引入http jsonp import HttpModule JsonpModule from angular http 在工程的src a
  • 线程池实例

    public Executor asyncServiceExecutor ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor 配置核心线程数 executor setCore
  • 日常Linux操作命令使用手册

    OS 查看操作系统 cat etc issue GPU 查看GPU 利用率 nvidia smi 文件和空间 查看linux文件目录的大小和文件夹包含的文件数 查看磁盘使用情况 df h 统计总数大小 du sh xmldb du sm s
  • Java: 断言(assert)

    断言 assert 语句一般用于程序不准备通过捕获异常来处理的错误 例如 账号交易时 对于支出的金额为正数 收入 支出 纯收入 或者收入的金额为负数 程序必须立即停止执行 同时发现错误 当正式收益时 就可以避开错误 但仍保留断言语句在程序中
  • 6.28同花顺笔试

    笔试共22题 题型比较多 选择 简答 编程 开放逻辑题都有 笔试时长2h 对深度学习方面考察的比较多 包含性能评价指标 常见定义等 选择题与简答题 1 提高深层神经网络特征表达能力的方法 题目问的下列哪个方法无法用来提高 a 增加层深度 b
  • 微信小程序遇到does not have a method “xxxx“ to handle event “tap“

    刚开始学小程序的小白 学到事件绑定的时候 跟着老师的步骤一步一步把代码输入好 结果发现和老师的结果不大一样 我在网上找了很多方法 有说多打空格的 有说要写进method 里的 都试过 没用 结果意外之下 我随手取消勾选 将JS编译成ES5
  • 2022.08 VMware官网下载安装+配置Linux虚拟机,最新最全

    前言 文章概要叙述 步骤一 安装VMware VMware 安装包下载 VMware官方下载页面 1 1小节 步骤二 配置虚拟机 步骤三 安装操作系统 CentOS7 9 镜像文件下载 CentOS阿里云镜像下载页 2 2 1小节 一 VM
  • UE4 获取目录下所有的图片转换成Texture2D并通过UMG显示出来

    主要内容 本文主要讲解简单插件的编写 将类继承至Subsystem 子系统 框架的好处 鼠标射线检测以及鼠标拖拽功能的实现 实现步骤 一 编写插件 1 首先新建一个空的C 项目 然后新建插件 Author是作者名 Description是描