UE5.1编辑器拓展【一、脚本化资产行为,通知,弹窗,高效复制多个同样的资产】

news2024/11/25 11:46:53

目录​​​​​​​

插件制作

添加新的类:AssetActionUtility

添加新的模块:EditorScriptingUtilities

路径了解

添加debug的头文件

代码【debug.h】内涵注释:

写函数

.h文件

.cpp文件


插件制作

首先第一步是做一个插件:

因为是用于编辑器的,所以在模块中我们需要进行更改:

将类型改为Editor,下方的加载则是在默认之前:PreDefault.

添加新的类:AssetActionUtility

AssetActionUtility可以用于创建、删除和重命名资产,以及管理资产的引用关系。

将创建的这个类放入插件中,并命名:

此时此刻我们会发现是编译失败的,那是因为我们缺失了相关的模块。

所以我们对模块进行添加:

在添加了相应的模块之后,我们发现,竟仍然是无法识别头文件的状态:

这种时候,我们就需要去这个模块的build.cs中去查看:

在发现这个路径之后,我们来到我们现在插件的build.cs中去进行添加:

System.IO.Path.GetFullPath(Target.RelativeEnginePath) + "/Source/Editor/Blutility/Private"
System.IO.Path.GetFullPath(Target.RelativeEnginePath)是获取虚幻引擎的相对路径
"/Source/Editor/Blutility/Private"是模块文件的位置

这样就可以编译成功了。

添加新的模块:EditorScriptingUtilities

路径了解

了解一下关于路径的概念:

路径分为两种,分别是Object Path和Package Path.

假设现在有资产a在文件夹test里面:

Object Path的意思就是直接到资产的名字,那么地址就是/Game/test/a

Package Path的意思就是/Game/test/

添加debug的头文件

这个所谓的debug头文件是自己创建的,主要是为了方便使用更多的其他debug函数。

首先要准备3个头文件:

#include "Misc/MessageDialog.h"

这个头文件的作用是弹出对话框的
#include "Framework/Notifications/NotificationManager.h"
#include "Widgets/Notifications/SNotificationList.h"

这两个头文件的作用是弹出通知的

代码【debug.h】内涵注释:

这个并不用cpp文件

#pragma once
#include "Misc/MessageDialog.h"
#include "Framework/Notifications/NotificationManager.h"
#include "Widgets/Notifications/SNotificationList.h"

void DebugPrint(const FString& DebugMessage, const FColor& DebugColor)
{
	//将打印到屏幕上
	if (GEngine)
	{
		GEngine->AddOnScreenDebugMessage(-1, 8, DebugColor, DebugMessage);
	}
}

void DebugPrintLog(const FString& DebugMessage)
{
	UE_LOG(LogTemp, Warning, TEXT("%s"), *DebugMessage);
}
//弹出窗口,返回窗口类型
EAppReturnType::Type ShowMsgDialog(EAppMsgType::Type MsgType, const FString& Message,bool bShowMessageAsWarning=true )
{
	if (bShowMessageAsWarning)
	{
		FText MsgTitle = FText::FromString("!Warning!");
		//第一个输入弹出的窗口类型,第二个是警告信息,第三个是消息标题
		return FMessageDialog::Open(MsgType, FText::FromString(Message), &MsgTitle);
	}
	else
	{
		return FMessageDialog::Open(MsgType, FText::FromString(Message));
	}
}
//消息通知
void ShowNotifyInfo(const FString& Message,float FadeOutTime)
{
	FNotificationInfo NotifyInfo(FText::FromString(Message));
	NotifyInfo.bUseLargeFont = true;//是否用较大粗体显示字体
	NotifyInfo.FadeOutDuration = FadeOutTime;//淡出时间
	//添加通知
	FSlateNotificationManager::Get().AddNotification(NotifyInfo);
}

写函数

在了解了一些基本知识后,我们开始在继承了AssetActionUtility的文件的头文件中写一个复制资产的函数:

.h文件

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

#pragma once

#include "CoreMinimal.h"
#include "AssetActionUtility.h"
#include "QuicklyAssetAction.generated.h"

/**
 * 
 */
UCLASS()
class CUSTOMEDITOREXTEND_API UQuicklyAssetAction : public UAssetActionUtility
{
	GENERATED_BODY()
public:
	UFUNCTION(CallInEditor)
		void DuplicateAssets(int32 DuplicateNum);
};

然后到cpp文件中进行实现,实现的同时也要包含制作的debug头文件,用于debug:

.cpp文件

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


#include "AssetAction/QuicklyAssetAction.h"
#include "Debug.h"
#include "EditorUtilityLibrary.h"
#include "EditorAssetLibrary.h"


void UQuicklyAssetAction::DuplicateAssets(int32 DuplicateNum)
{
	if (DuplicateNum<=0)
	{
		ShowMsgDialog(EAppMsgType::Ok, "Please enter a valid value >0", true);
		return;
	}
	//获取选择的资产数据,比如获取的是一个,还是多个资产
	TArray<FAssetData> SelectedAssetsData= UEditorUtilityLibrary::GetSelectedAssetData();
	//用于计数的Counter,复制成功则+1,记录总共复制了多少资产
	uint32 Counter = 0;
	//迭代选择的SelectedAssetsData数组
	for (const FAssetData& SelectedAssetData:SelectedAssetsData)
	{
		//这里迭代的是数组中的一个资产要复制的数量
		for (int32 i = 0; i < DuplicateNum; i++)
		{
			FString SourceAssetPath = SelectedAssetData.ObjectPath.ToString();//获取资产路径【路径名字+资产名字】
			FString NewDuplicatedAssetName = SelectedAssetData.AssetName.ToString()+TEXT("_")+FString::FromInt(i+1);//新复制的资产名字
			FString NewPathName = FPaths::Combine(SelectedAssetData.PackagePath.ToString(), NewDuplicatedAssetName);//将包路径【没有资产名字的路径】和新的名字结合
			//DuplicateAsset输入的两个,第一个是源路径,第二个是目标路径 
			//这里判断是否复制资产是否有效,有效就保存,并且Counter+1
			if (UEditorAssetLibrary::DuplicateAsset(SourceAssetPath, NewPathName))
			{
				//保存资产,输入路径。  第二个输入是bool,为是否为改变后进行保存【而我们要直接保存,所以是false】
				UEditorAssetLibrary::SaveAsset(NewPathName,false);
				Counter++;
			}
		}
	}
	if (Counter>0)//这里是通知有多少资产复制成功了
	{
		ShowNotifyInfo("Duplicate Success:" + FString::FromInt(Counter) + " Files!",7);
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1053747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flink中序列化RoaringBitmap不同方式的对比

背景 在flink中&#xff0c;我们有时候会使用到RoaringBitmap进行统计计数等操作&#xff0c;而当使用RoaringBitmap时&#xff0c;这就涉及到了最重要的问题&#xff0c;如何序列化&#xff1f;序列化的目的是为了进行网络通信或者状态序列化的目的&#xff0c;本文的重点是比…

根据GWAS数据估算样本量N和使用千人基因组填充maf的参考文献

https://github.com/GenomicSEM/GenomicSEM/wiki/2.1-Calculating-Sum-of-Effective-Sample-Size-and-Preparing-GWAS-Summary-Statistics

【LeetCode热题100】--104.二叉树的最大深度

104.二叉树的最大深度 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) …

尚硅谷谷粒商城部分报错问题处理

1、启动报错&#xff1a; 内容&#xff1a; org.springframework.beans.factory.BeanCreationException: Error creating bean with name attrAttrgroupRelationController: Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed t…

使用prometheus监控java服务

在prometheus官方下载页面没有看到jvm_exproter的下载地址但是官方页面是有推荐下载地址的 访问 Prometheus - Monitoring system & time series database prometheus官方网址 官方推荐地址下载是在github网络访问不方便的可以用下面的网址 wget https://repo1.maven…

【小程序 - 基础】页面导航、页面事件、生命周期、WXS脚本_04

目录 一、页面导航 1. 什么是页面导航 2. 小程序中实现页面导航的两种方式 2.1 声明式导航 2.1.1 导航到 tabBar 页面 2.1.2 导航到非 tabBar 页面 2.1.3 后退导航 2.2 编程式导航 2.2.1 导航到 tabBar 页面 2.2.2 导航到非 tabBar 页面 2.2.3 后退导航 2.3. 导航…

Proxyer实现内网穿透云服务器

Proxyer Proxyer是一个网络代理工具&#xff0c;它可以将本地计算机的网络流量&#xff08;如HTTP、HTTPS、TCP等&#xff09;转发到远程服务器。使用Proxyer可以在本地计算机上建立一个代理服务器&#xff0c;通过代理服务器来访问互联网上的资源。 yum仓库设置 rm -f /etc…

在Ubuntu上通过Portainer部署微服务项目

这篇文章主要记录自己在ubuntu上部署自己的微服务应用的过程&#xff0c;文章中使用了docker、docker-compose和portainer&#xff0c;在部署过程中遇到了不少问题&#xff0c;因为博主也是初学docker-compose&#xff0c;通过这次部署实战确实有所收获&#xff0c;在这篇文章一…

LeetCode【121. 买卖股票的最佳时机】

你才不是什么小人物&#xff0c;你在我这里&#xff0c;是所有的天气和心情。 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一…

idea Springboot 校园助学贷款系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 校园助学贷款系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统 具有完整的源代码和数据库&…

小谈设计模式(8)—代理模式

小谈设计模式&#xff08;8&#xff09;—代理模式 专栏介绍专栏地址专栏介绍 代理模式代理模式角色分析抽象主题&#xff08;Subject&#xff09;真实主题&#xff08;Real Subject&#xff09;代理&#xff08;Proxy&#xff09; 应用场景远程代理虚拟代理安全代理智能引用代…

ubuntu22.04 x11窗口环境手势控制

ubuntu22.04 x11窗口环境手势控制 ubuntu x11窗口环境的手势控制并不优秀&#xff0c;我们可以使用touchegg去代替 这个配置过程非常简单&#xff0c;并且可以很容易在一定范围内达到你想到的效果&#xff0c;类比mac的手势控制 关于安装 首先添加源&#xff0c;并安装 sud…

数据结构-----二叉排序树

目录 前言 1.什么是二叉排序树 2.如何构建二叉排序树 3.二叉排序树的操作 3.1定义节点储存方式 3.2插入节点操作 3.2创建二叉排序树 3.4遍历输出&#xff08;中序遍历&#xff09; 3.5数据查找操作 3.6获取最大值和最小值 3.7删除节点操作 3.8销毁二叉排序树 4.完…

漏斗分析模型

从业务流程起点开始到最后日标完成的每个环节都会有用户流失&#xff0c;因此需要一种分析方法来衡量业务流程每一步的转化效率&#xff0c;漏斗分析方法就是这样的分析方法。 例如&#xff0c;在淘宝上一款商品的浏览量是 300、点击量是 100、订单量是 20、支付量是 10&#…

centos 部署nginx 并配置https

centos版本&#xff1a;centos 7.8 &#xff08;最好不要用8&#xff0c;8的很多用法和7相差很大&#xff09; 一.安装nginx 1。下载Nginx安装包&#xff1a;首先&#xff0c;访问Nginx的官方网站&#xff08;https://nginx.org/&#xff09;或您选择的镜像站点&#xff0c;找…

Linux知识点+命令

1. 简介 Linux 是一套免费使用和自由传播的类 Unix 操作系统&#xff0c;是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。 Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的…

BUUCTF reverse wp 81 - 85

[SCTF2019]babyre 反编译失败, 有花指令 有一个无用字节, 阻止反编译, patch成0x90 所有标红的地方nop掉之后按p重申函数main和loc_C22, F5成功 int __cdecl main(int argc, const char **argv, const char **envp) {char v4; // [rspFh] [rbp-151h]int v5; // [rsp10h] [rb…

谷歌扩展下载

Chrome 扩展下载安装网站推荐 # 1. 极简插件优质crx应用 ●地址&#xff1a;https://chrome.zzzmh.cn ●推荐&#xff1a;★★★★★ 一个非常良心 & 干净 & 简洁的 Chrome 扩展下载网站&#xff0c;体验非常不错&#xff01; 侧边栏可以通过类型对扩展进行筛选和排序&…

亲测可用国产GPT人工智能

分享一些靠谱、可用、可以白嫖的GPT大模型。配合大模型&#xff0c;工作效率都会极大提升。 清华大学ChatGLM 官网&#xff1a; 智谱清言中国版对话语言模型&#xff0c;与GLM大模型进行对话。https://chatglm.cn/开源的、支持中英双语的1300亿参数的对话语言模型&#xff0…

1688商品详情 API(测试实例)

1688.item_get 测试实例 API测试页 点此进入 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_searc…