虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(一)

本文主要是介绍虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

UPCGBlueprintElement是PCGGraph中自定义节点的基类,但官方目前还没有给出详细的文档,所以从源代码里找点答案。

文章目录

  • 可覆盖函数(Override Functions)
    • Excute 和 Excute with Context
    • Loop Body函数和Loop函数
      • Point Loop Body和PointLoop
      • Variable Loop Body和VariableLoop
      • Nested Loop Body和NestedLoop
      • Iteration Loop Body和IterationLoop

在这里插入图片描述

可覆盖函数(Override Functions)

在这里插入图片描述

UPCGBlueprintElement是PCGGraph中所有自定义节点的基类,有如下几个可供蓝图覆盖的函数:

  • Excute
  • Excute with Context
  • Iteration Loop Body
  • Point Loop Body
  • Variable Loop Body
  • Nested Loop Body
  • Node Color Override
  • Node Title Override
  • Node Type Override

其中 ExcuteExcute with ContextNodeTitleOverrideNodeColorOverrideNodeTypeOverride是覆盖后被自动触发的;而剩余的几个“Loop Body函数”则需要在蓝图中显示调用对应的“Loop函数”才可以执行循环,比如:要调用PointLoop才可以执行Point Loop Body

Excute 和 Excute with Context

这两个函数可以理解为自定义节点的“主函数”,区别就是一个有PCGContext输入另一个没有,ExecuteWithContext会调用Execute

Excute

	UFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = "PCG|Execution")void Execute(const FPCGDataCollection& Input, FPCGDataCollection& Output);

Excute with Context

	UFUNCTION(BlueprintNativeEvent, Category = "PCG|Execution")void ExecuteWithContext(UPARAM(ref)FPCGContext& InContext, const FPCGDataCollection& Input, FPCGDataCollection& Output);
void UPCGBlueprintElement::ExecuteWithContext_Implementation(FPCGContext& InContext, const FPCGDataCollection& Input, FPCGDataCollection& Output)
{Execute(Input, Output);
}

其实还有个C++ 函数ExecuteInternalExcute with Context是由它调用的。

virtual bool ExecuteInternal(FPCGContext* Context) const override;
	/** Finally, execute the actual blueprint */Context->BlueprintElementInstance->ExecuteWithContext(*Context, Context->InputData, Context->OutputData);

Loop Body函数和Loop函数

在这里插入图片描述

Loop Body函数都是在Loop函数中定义的lambda表达式调用的。

  • Point Loop BodyNested Loop BodyIteration Loop Body通过FPCGAsync::AsyncPointProcessing调用;
  • Variable Loop Body通过FPCGAsync::AsyncMultiPointProcessing调用
  • 上述节点中的各种Data参数都是PCGPointData类型,需要的话可以在调用Loop函数的时候传入,它们会直接传入Loop Body函数

Point Loop Body和PointLoop

Point Loop Body需要通过PointLoop执行循环

Point Loop Body
在这里插入图片描述

PointLoop

	FPCGAsync::AsyncPointProcessing(&InContext, InPoints.Num(), OutPoints, [this, &InContext, InData, OutData, &InPoints](int32 Index, FPCGPoint& OutPoint){return PointLoopBody(InContext, InData, InPoints[Index], OutPoint, OutData->Metadata);});

Variable Loop Body和VariableLoop

Variable Loop Body需要通过VariableLoop执行循环

在这里插入图片描述

VariableLoop

	FPCGAsync::AsyncMultiPointProcessing(&InContext, InPoints.Num(), OutPoints, [this, &InContext, InData, OutData, &InPoints](int32 Index){return VariableLoopBody(InContext, InData, InPoints[Index], OutData->Metadata);});
}

FPCGAsync::AsyncPointProcessingFPCGAsync::AsyncMultiPointProcessing都是异步的,它们的区别就在于处理输入:输出为1:1还是1:N的循环。Point Loop BodyVariableLoopBody,前者输入一个point返回一个point;后者输入一个point可以返回一个point的数组。比如:如果你想把一个point看作一块地基,想在它的垂直上方再生成一串点作为楼层,然后把这些点返回,那么你就需要用到VariableLoopBody

Nested Loop Body和NestedLoop

Nested Loop Body需要通过NestedLoop执行循环

在这里插入图片描述
关键代码如下,但使用情景没想明白。

NestedLoop

	const TArray<FPCGPoint>& InOuterPoints = InOuterData->GetPoints();const TArray<FPCGPoint>& InInnerPoints = InInnerData->GetPoints();TArray<FPCGPoint>& OutPoints = OutData->GetMutablePoints();FPCGAsync::AsyncPointProcessing(&InContext, InOuterPoints.Num() * InInnerPoints.Num(), OutPoints, [this, &InContext, InOuterData, InInnerData, OutData, &InOuterPoints, &InInnerPoints](int32 Index, FPCGPoint& OutPoint){return NestedLoopBody(InContext, InOuterData, InInnerData, InOuterPoints[Index / InInnerPoints.Num()], InInnerPoints[Index % InInnerPoints.Num()], OutPoint, OutData->Metadata);});

Iteration Loop Body和IterationLoop

Iteration Loop Body需要通过IterationLoop执行循环

在这里插入图片描述

Point Loop Body一样,但它会提供一个NumIterations用于指定迭代次数

IterationLoop

	FPCGAsync::AsyncPointProcessing(&InContext, NumIterations, OutPoints, [this, &InContext, InA, InB, OutData](int32 Index, FPCGPoint& OutPoint){return IterationLoopBody(InContext, Index, InA, InB, OutPoint, OutData->Metadata);});

这篇关于虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/822288

相关文章

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

SpringBoot集成LiteFlow工作流引擎的完整指南

《SpringBoot集成LiteFlow工作流引擎的完整指南》LiteFlow作为一款国产轻量级规则引擎/流程引擎,以其零学习成本、高可扩展性和极致性能成为微服务架构下的理想选择,本文将详细讲解Sp... 目录一、LiteFlow核心优势二、SpringBoot集成实战三、高级特性应用1. 异步并行执行2

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

python如何生成指定文件大小

《python如何生成指定文件大小》:本文主要介绍python如何生成指定文件大小的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python生成指定文件大小方法一(速度最快)方法二(中等速度)方法三(生成可读文本文件–较慢)方法四(使用内存映射高效生成