前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >虚幻引擎之动态贴花

虚幻引擎之动态贴花

作者头像
Jean
发布2020-11-06 08:23:41
发布2020-11-06 08:23:41
1.4K00
代码可运行
举报
文章被收录于专栏:Web行业观察Web行业观察
运行总次数:0
代码可运行

UE4之动态贴花

目录

声明依赖测试环境事件1:从文件到材质【C++】事件1:从文件到材质【蓝图】事件2:从组件到投影【C++】事件2:从组件到投影【蓝图】效果

  1. 声明依赖
  2. 测试环境
  3. 事件1:从文件到材质【C++】
  4. 事件1:从文件到材质【蓝图】
  5. 事件2:从组件到投影【C++】
  6. 事件2:从组件到投影【蓝图】
  7. 效果

本文关于如何让用户从电脑中选择图片,自动制作成UE4贴花,并贴到地面上,整个理想的流程如下:

声明依赖

在manifest文件[name].build.cs中覆盖以下代码,声明项目中需要调用的功能。

代码语言:javascript
代码运行次数:0
运行
复制
PublicDependencyModuleNames.AddRange(new string[] {     "Core",     "CoreUObject",     "Engine",     "InputCore" ,     "ImageWrapper",     "SlateCore",     "DesktopPlatform"  });
  • Core:核心标准库,包括数学库和容器类
  • CoreUObject:虚幻根对象,C++反射功能
  • Engine:引擎框架,包括actors和components
  • InputCore:输入设备驱动,包括键盘鼠标
  • ImageWrapper:图片相关的工具
  • DesktopPlatform:桌面UI界面

测试环境

搞一块地板用来贴贴花,一面墙用来辨识方向,设置基本的GameMode来操作玩家:WASD+QE+鼠标移动;鼠标左键投影贴画,鼠标右键选择图片。再创建一个widget提示用户这些操作。

事件1:从文件到材质【C++】

详细API接口:https://docs.unrealengine.com/en-US/API/Developer/DesktopPlatform/IDesktopPlatform/OpenFileDialog/index.html

代码语言:javascript
代码运行次数:0
运行
复制
// 截取自 getFile.cpp 文件
void UgetFile::getFileDialog( const FString& DefaultPath, const FString& FileTypes, TArray& OutFileNames, const bool multiple, const FString& DialogTitle){    if (GEngine)    {        if (GEngine->GameViewport)        {            void* ParentWindowHandle = GEngine->GameViewport->GetWindow()->GetNativeWindow()->GetOSWindowHandle();            IDesktopPlatform* DesktopPlatform = FDesktopPlatformModule::Get();            if (DesktopPlatform)            {                uint32 SelectionFlag = multiple? 1:0;                DesktopPlatform->OpenFileDialog(ParentWindowHandle, DialogTitle, DefaultPath, FString(""), FileTypes, SelectionFlag, OutFileNames);            }        }    }}

事件1:从文件到材质【蓝图】

事件2:从组件到投影【C++】

详细API接口:https://docs.unrealengine.com/en-US/API/Runtime/ImageWrapper/IImageWrapper/index.html

代码语言:javascript
代码运行次数:0
运行
复制
// 截取自 getFile.cpp 文件
UTexture2D* UImageLoader::LoadTexture2D(const FString path, bool& IsValid, int32& OutWidth, int32& OutHeight){    UTexture2D* Texture = nullptr;    IsValid = false;    if (!FPlatformFileManager::Get().GetPlatformFile().FileExists(*path))    {        return nullptr;    }    TArray CompressedData;    if (!FFileHelper::LoadFileToArray(CompressedData, *path))    {        return nullptr;    }    TSharedPtr ImageWrapper = GetImageWrapperByExtention(path);    if (ImageWrapper.IsValid() && ImageWrapper->SetCompressed(CompressedData.GetData(), CompressedData.Num()))    {        TArray UncompressedRGBA;        if (ImageWrapper->GetRaw(ERGBFormat::RGBA, 8, UncompressedRGBA))        {            Texture = UTexture2D::CreateTransient(ImageWrapper->GetWidth(), ImageWrapper->GetHeight(), PF_B8G8R8A8);            if (Texture != nullptr)            {                IsValid = true;                OutWidth = ImageWrapper->GetWidth();                OutHeight = ImageWrapper->GetHeight();                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;}

事件2:从组件到投影【蓝图】

效果

游戏界面:

弹窗界面:

<完>


虚幻引擎系列推荐:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WebHub 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • UE4之动态贴花
    • 声明依赖
    • 测试环境
    • 事件1:从文件到材质【C++】
    • 事件1:从文件到材质【蓝图】
    • 事件2:从组件到投影【C++】
    • 事件2:从组件到投影【蓝图】
    • 效果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档