虚幻学习笔记13—C++静态和动态加载

news2024/10/5 14:23:21

一、前言

        我们在蓝图中可以很方便的添加各种需要的组件,那么在C++代码中要如何实现呢。在代码中分静态和动态加载,而无论静态和动态,加载的内容有资源和资源类,资源类通常为带资源的蓝图类。

二、实现

        在实现静态或动态加载时,都需要提前在构造函数里创建所需的类型,代码如下:

	MyScene = CreateDefaultSubobject<USceneComponent>(TEXT("MyScene"));
	MyMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MyStaticMesh"));
	MyParticle = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("MyParticle"));
	MyBox = CreateDefaultSubobject<UBoxComponent>(TEXT("MyBox"));
	MyAudio = CreateDefaultSubobject<UAudioComponent>(TEXT("MyAudio"));

然后设置其父子级

	//设置父子级
	RootComponent = MyScene;//将MyScene作为默认的根组件
	MyMesh->SetupAttachment(MyScene);
	MyParticle->SetupAttachment(MyScene);
	MyBox->SetupAttachment(MyScene);
	MyAudio->SetupAttachment(MyBox);
2.1、静态加载资源

        静态加载必须也在构造函数里,代码如下:

	//静态加载资源
	static ConstructorHelpers::FObjectFinder<UStaticMesh>TempStaticMesh(TEXT("/Script/Engine.StaticMesh'/Game/StarterContent/Shapes/Shape_Pipe.Shape_Pipe'"));
	MyMesh->SetStaticMesh(TempStaticMesh.Object);
	static ConstructorHelpers::FObjectFinder<UParticleSystem>TempParticle(TEXT("/Script/Engine.ParticleSystem'/Game/StarterContent/Particles/P_Fire.P_Fire'"));
	MyParticle->SetTemplate(TempParticle.Object);
	static ConstructorHelpers::FObjectFinder<USoundWave>TempSoundWave(TEXT("/Script/Engine.SoundWave'/Game/StarterContent/Audio/Collapse01.Collapse01'"));
	MyAudio->SetSound(TempSoundWave.Object);

其中”TEXT"里面的路径获取方法如下:

首先,在编辑器的内容里找到资源,然后鼠标右键点击“复制引用”,如图2.1.1所示,然后将复制的引用添加到上述的TEXT里面即可。

图2.1.1
2.2、静态加载类

        静态加载的类也要在构造函数里,代码如下,注意:类和资源不同地方在于,类后面必须加上“_C”,否则会出现编译报错或运行崩溃的不可控情况。

	//静态加载类,复制引用后,文件名后面必须加上"_C",不然会运行崩溃
	static ConstructorHelpers::FClassFinder<AActor>TempMyActor(TEXT("/Script/Engine.Blueprint'/Game/StarterContent/Blueprints/Blueprint_WallSconce.Blueprint_WallSconce_C'"));
	MyActor = TempMyActor.Class;

        另外,这里创建的加载的类并不能马上就显示在场景中,还只是在内存中,如果在变量定义的时候添加了“UPROPERTY(VisibleAnywhere, BlueprintReadOnly)“也只会显示在编辑界面中,如果要显示在场景中还需要实例化一下,但是实例化不能在构造函数中,代码如下:

	if (MyActor)
	{
		UE_LOG(LogTemp, Warning, TEXT("My Actor is:%s"), *MyActor->GetName());
		AActor* TempSpawnActor = GetWorld()->SpawnActor<AActor>(MyActor, FVector(100, 500, 100), FRotator::ZeroRotator);
	}
2.3、动态加载资源

        动态加载通常用Load方法,这个和Unity的方法很相似。通常不会放在构造函数里,这点也和静态加载不同,具体代码如下,这里加载的资源会显示到场景中,如代码会替换之前静态加载的资源。

	//动态加载资源
	UStaticMesh* TempStaticMesh = LoadObject<UStaticMesh>(nullptr, TEXT("/Script/Engine.StaticMesh'/Game/StarterContent/Shapes/Shape_NarrowCapsule.Shape_NarrowCapsule'"));
	if (TempStaticMesh)
	{
		MyMesh->SetStaticMesh(TempStaticMesh);
	}
2.4、动态加载类

动态加载的类和静态加载类一样,在复制引用名称后面也要加“_C”,代码如下:

	//动态加载类
	UClass* TempClass = LoadClass<AActor>(this, TEXT("/Script/Engine.Blueprint'/Game/StarterContent/Blueprints/Blueprint_CeilingLight.Blueprint_CeilingLight_C'"));
	if (TempClass)
	{
		AActor* SpawanActor = GetWorld()->SpawnActor<AActor>(TempClass, FVector::ZeroVector, FRotator::ZeroRotator);
		UE_LOG(LogTemp, Warning, TEXT("Class Name:"), *TempClass->GetName());
	}

这样加载的类也是会直接呈现在场景中。

三、总结

3.1、静态加载必须在构造函数里实现。

3.2、静态加载的类,复制引用后,文件名后面必须加上”_C“,不然会造成编译不通过或运行崩溃等各种问题。

3.3、静态加载的类都在内存中,不能被显性的呈现在视口、场景中,动态加载的类可以。

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

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

相关文章

mybatis-plus雪花算法自动生成ID到前端后精度丢失问题

问题发生 前端接收到后端的数据出现异常&#xff0c;异常如下&#xff1a; 如图这是后端正常返回的数据&#xff0c; 但是点击预览时发现这个id的数据被改变了 这就导致了我通过id去修改相关数据时无法成功 问题原因 id的长度过长&#xff08;19位&#xff09;&#xff0c;前…

针对网页html中插入动图gif不能循环播放只播放一次的解决方案

针对网页html中插入动图gif不能循环播放只播放一次的解决方案 原因分析解决方案 原因分析 使用图片编辑软件制作的过程中未启用“循环播放”功能&#xff0c;这里以Photoshop为例&#xff0c;演示设置GIF图片循环播放的操作流程&#xff1a;所需材料&#xff1a;PS。第一步&am…

云仓酒庄为您挑选意大利葡萄酒

作为世界产酒大国之一&#xff0c;意大利葡萄酒种类也是纷繁多样&#xff0c;赢得了众多葡萄酒爱好者的喜爱。说意大利葡萄酒地位仅次法国也不为过。那么&#xff0c;云仓酒庄的品牌雷盛红酒分享有没有一些挑选意大利葡萄酒的方法和技巧呢&#xff1f; 意大利的酒也有几千万种…

基于springboot乐器视频学习网站设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题&#xff0c;今天给大家介绍…

ES-脚本

脚本 简单使用 POST product/_update/2 {"script": {"source": "ctx._source.salary1" #将薪水字段的值 1} }预定义变量 POST product/_update/2 {"script": {"lang": "painless","source": "…

办公技巧:分享五个在线画图工具,值得收藏

目录 1. processon ​编辑 2. visual paradigm online 3. zen flowchart 4. draw io 5. Excalidraw 今天小编给大家分享五个在线画图工具&#xff0c;感兴趣的可以下载试一试&#xff01; 1. processon 说流程图除了必提http://draw.io&#xff0c;processon也必须要有…

【深度学习】机器学习概述(一)机器学习三要素——模型、学习准则、优化算法

​ 文章目录 一、基本概念二、机器学习的三要素1. 模型a. 线性模型b. 非线性模型 2. 学习准则a. 损失函数1. 0-1损失函数2. 平方损失函数&#xff08;回归问题&#xff09;3. 交叉熵损失函数&#xff08;Cross-Entropy Loss&#xff09;4. Hinge 损失函数 b. 风险最小化准则1.…

如何在 Windows 10/11 上恢复已删除的 Word 文档

意外删除重要的 Word 文档可能会令人心碎。当文件恰好非常重要时尤其如此。关键数据的丢失可能会导致沮丧和恐慌&#xff0c;因为数小时的辛勤工作和有价值的信息似乎消失得无影无踪。然而&#xff0c;在您屈服于绝望之前&#xff0c;有个好消息。 有多种技术和工具可帮助您恢…

【AI美图】第04期效果图,AI人工智能无绘画,精选五组特写版美图欣赏

标题好看的照片让AI实现 也许你不相信吧&#xff0c;这么秀的照片居然全部是电脑合成AI妙手&#xff0c;一键打造&#xff0c;速度之快&#xff0c;效果之好&#xff0c;任谁都不愿意相信&#xff0c;然后在今天这一切都是现实的&#xff0c;现在让我们从照片的拍摄谈谈什么样的…

准备迎接超级人工智能系统,OpenAI宣布RLHF即将终结!超级对齐技术将接任RLHF,保证超级人工智能系统遵循人类的意志

本文原文来自DataLearnerAI&#xff1a; 准备迎接超级人工智能系统&#xff0c;OpenAI宣布RLHF即将终结&#xff01;超级对齐技术将接任RLHF&#xff0c;保证超级人工智能系统遵循人类的意志 | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/105170265526…

RocketMQ —消费重试

消费者出现异常&#xff0c;消费某条消息失败时&#xff0c; Apache RocketMQ 会根据消费重试策略重新投递该消息进行故障恢复。本文介绍消费重试机制的原理、版本兼容性和使用建议。 一、应用场景​ Apache RocketMQ 的消费重试主要解决的是业务处理逻辑失败导致的消费完整性…

EasyExcel读取Excel数据(含多种方式)

目录 EasyExcel简介 使用EasyExcel进行读数据 引入依赖&#xff1a; EasyExcel提供了两种读取模式 使用 监听器 读取模式 1.创建一个实体类 2.创建监听器 代码 使用 同步读 读取模式 1.创建一个实体类 2.代码 添加导入数据库的逻辑 其实官方文档讲得很清楚&#xff…

git 的使用

git reset详解-CSDN博客 git reset 命令详解 git revert命令详解。-CSDN博客 关于Git分支中HEAD和Master的理解 - 知乎 (zhihu.com) 一文带你精通 Git&#xff08;Git 安装与使用、Git 命令精讲、项目的推送与克隆&#xff09;-CSDN博客 Git 常用操作&#xff08;5&#xff…

【Linux】tree命令使用

tree命令 tree命令用于以树状图列出目录的内容。 语法 tree [参数] [目录] tree 命令 -Linux手册页 bash: tree: 未找到命令... 安装tree yum -y install tree如果你系统中有安装tree 但是还是执行找不到该命令的话&#xff0c;那原因就是&#xff1a;环境变量错误&#x…

智能优化算法应用:基于热交换算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于热交换算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于热交换算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.热交换算法4.实验参数设定5.算法结果6.参考文…

【数字电路】MacBook使用iverilog进行数字电路仿真

安装流程 在终端中用brew包管理工具进行安装仿真工具&#xff1a; 编译verilog代码&#xff1a; brew install icarus-verilog编译verilog代码&#xff1a; brew install verilatorMacOS系统显示UNIX GUI brew install xquartz可视化仿真波形图&#xff1a; brew install gtk…

2024年天津体育学院专升本专业课网上报名确认缴费安排

天津体育学院2024年高职升本科专业考试报名安排 一、时间安排 1.报名时间&#xff1a;2023年12月19日9&#xff1a;00-12月21日17&#xff1a;00 2.缴费时间&#xff1a;2023年12月26日-27日 &#xff08;考试考务费&#xff1a;体育教育专业&#xff1a;160元/人&#xff…

项目中使用Arrays.asList、ArrayList.subList的坑

使用Arrays.asList的注意事项 1.1 可能会踩的坑 先来看下Arrays.asList的使用&#xff1a; List<Integer> statusList Arrays.asList(1, 2); System.out.println(statusList); System.out.println(statusList.contains(1)); System.out.println(statusList.contains(3)…

C之switch小问题

执行结果&#xff1a; 为什么会是100呢&#xff1f; 因为C语言会忽视 switch语句与第一个case之间的code&#xff0c;也就是根本不会执行 “num100;

el-date-picker 选择一个或多个日期

el-date-picker可选择多个日期 type“dates” 加个s即可 <div><span>el-date-picker选择多个日期</span><el-date-pickertype"dates"v-model"dateList"placeholder"选择一个或多个日期"></el-date-picker></di…