UE4 C++ 类的4种引用类型,和异步加载资产

2023-11-15

UE4 C++ 类的4种引用类型,和异步加载资产

4种引用类型

	对象引用:引用 World 的实例对象。

就是直接定义

UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="My")//对象引用
	UWorld* LoadPackageSoftObjectPath4;


	类引用:引用从 World 继承而来的类。

TSubclassOf 是提供 UClass 类型安全性的模板类
允许在类型安全的情况下传递 TClassType 的模板

UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="My")//类引用
	TSubclassOf<UWorld>LoadPackageSoftObjectPath3;


软类引用:从类型的 World 继承的类的路径,该类型可能不会被加载。可用于异步加载类。

TSoftClassPtr是 FSoftObjectPtr 的模板化包装器,其工作方式类似于TSubclassOf,它可以在 UProperties 中用于蓝图子类

UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="My")//软类引用
	TSoftClassPtr<UWorld> LoadPackageSoftObjectPath2;


	软对象引用: 类型为 World 的实例Object的路径,该类型可能不会被加载。可用于异步加载资产。

TSoftObjectPtr是通用FSoftObjectPtr的模板化包装器,可以在 UProperties 中使用

UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="My")//软对象引用
	TSoftObjectPtr<UWorld> LoadPackageSoftObjectPath;

异步加载资产,这里异步加载关卡,打开关卡

C++类的游戏模式基础:

// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "LoadLevelGameModeBase.generated.h"

/**
 * 
 */
UCLASS()
class LOADLEVEL_API ALoadLevelGameModeBase : public AGameModeBase
{
	GENERATED_BODY()
public:
	bool bIsLoaded;

	UPROPERTY()
	FString LoadPackagePath;

	UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="My")//软对象引用
	TSoftObjectPtr<UWorld> LoadPackageSoftObjectPath;

	UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="My")//软类引用
	TSoftClassPtr<UWorld> LoadPackageSoftObjectPath2;
	
	UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="My")//类引用
	TSubclassOf<UWorld>LoadPackageSoftObjectPath3;

	UPROPERTY(EditAnywhere,BlueprintReadOnly,Category="My")//对象引用
	UWorld* LoadPackageSoftObjectPath4;
	
	// 用于加载完成的回调
	DECLARE_DYNAMIC_DELEGATE(FOnAsyncLoadFinished);
public:
	UFUNCTION(BlueprintCallable,Category="My")
	void MyAsyncLoad(const FOnAsyncLoadFinished& OnAsyncLoadFinished);
	
	UFUNCTION(BlueprintCallable,Category="My")
	float GetLoadProgress();

};

// Copyright Epic Games, Inc. All Rights Reserved.


#include "LoadLevelGameModeBase.h"

//开始异步加载

void ALoadLevelGameModeBase::MyAsyncLoad(const FOnAsyncLoadFinished& OnAsyncLoadFinished)
{
	//不使用GetBaseFilename,编译 error C4458: LoadPackageAsync failed to begin to load a package···
	LoadPackagePath = FPaths::GetBaseFilename(LoadPackageSoftObjectPath.ToString(), false);
	bIsLoaded = false;
	UE_LOG(LogTemp, Warning, TEXT("String: %s"), *LoadPackagePath);
	
	LoadPackageAsync(
		LoadPackagePath,
		FLoadPackageAsyncDelegate::CreateLambda([=](const FName& PackageName, UPackage* LoadedPackage, EAsyncLoadingResult::Type Result)
			{
			 //开始
				if (Result == EAsyncLoadingResult::Failed)
				{
					UE_LOG(LogTemp, Warning, TEXT("Load Failed"));
				}
				else if (Result == EAsyncLoadingResult::Succeeded)//加载完毕
					{
						bIsLoaded = true;
						UE_LOG(LogTemp, Warning, TEXT("Load Succeeded"));
						OnAsyncLoadFinished.ExecuteIfBound();//调用绑定的事件,
					}
			}
		), 0, PKG_ContainsMap);
}

//获取加载的进度 -1 —— 100
float ALoadLevelGameModeBase::GetLoadProgress()
{
		float FloatPercentage = GetAsyncLoadPercentage(*LoadPackagePath);
		if (!bIsLoaded)
		{
			FString ResultStr = FString::Printf(TEXT("Percentage: %f"), FloatPercentage);
			GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Green, ResultStr);
			UE_LOG(LogTemp, Warning, TEXT("Percentage: %f"), FloatPercentage);
		}
		else
		{
			FloatPercentage = 100;
		}
		return FloatPercentage;
}

这个是开始加载和加载完成

namespace EAsyncLoadingResult
{
	enum Type
	{
		/** Package failed to load */
		Failed,
		/** Package loaded successfully */
		Succeeded,
		/** Async loading was canceled */
		Canceled
	};
}

主要看LoadPackageAsync这个函数的使用:

在这里插入图片描述
了解后用生成一个继承游戏模式基础的蓝图类
在蓝图类里调用和赋初值

在这里插入图片描述
加载完后打开关卡就行了

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

UE4 C++ 类的4种引用类型,和异步加载资产 的相关文章

随机推荐

  • UE5 Rokoko Studio Live(动捕实时链接)

    UE5 Rokoko动作捕捉实时 一 新建初始化项目 添加插件 打开UE5 1 1 新建 第三人称游戏 文件夹筛选找到模板自带的关卡 新建动画蓝图 gt 然后选择到UE的小白人骨骼 因为我们需要Rokoko的实时动捕 需要在项目里添加Rok
  • IDEA常用快捷键

    IDEA常用快捷键 快捷键 描述 Ctrl Shift R 全局搜索 替换 Ctrl Shift F 全局搜索 Ctrl F 局部搜索 Shift双击 搜索类 接口等 Ctrl 鼠标点击类名称 进入类的内部 Ctrl Alt O 清除不使用
  • 气候数据处理代码实现

    案例 根据站点降雨量日数据求月总降雨量 年总降雨量 月降雨天数 年降雨天数等 数据 部分数据如下 统计结果
  • 怎么理解KMP算法中的next数组(为甚有时候加一有时候不加一?)

    KMP算法怎么来的和找规律 以及对于BF算法他的主要区别就不再赘述我们 我们来说一下怎么用最快的速度加上已知规律找到给定字符串的next数组 C语言中和java中都适用 我们已经找到了部分规律 next数组中的值可能和已匹配部分字符串的前缀
  • 关于RabbitMQ的面试题

    关于RabbitMQ的面试题 整理了一下面试中问到rabbitmq消息队列时 面试官可能会问到的问题 面试题1 为什么使用rabbitmq 什么时候用 怎么用 一开始写项目 架构比较单一 使用的是单体结构 把所有的业务都堆积在一个项目里 随
  • [1220]hue数据导出

    1 执行要下载的sql语句 2 执行完成后 点击下面导出 3 选择所有 4 选择每个人对应的文件夹 没有自己名称的可以创建一个 5 选择导出 6 右面是导出执行时的界面 7 选择已经执行的文件 8 按照下面截图提示 就可以将文件下载到本地了
  • iOS上架报错:无法添加以供审核

    无法提交以供审核 要开始审核流程 必须提供以下项目 您必须为要添加的 app 提供版权信息 您在提交 app 审核时遇到的问题是因为需要提供版权信息 而您的 app 缺少相关的版权信息 以下是解决此问题的步骤 确认您是否拥有 app 的版权
  • kettle 关于数据库事务操作的解释说明

    事务与数据库 1 数据库连接只在执行作业或转换时使用 在作业里 每一个作业项都打开和关闭一个独立的数据库连接 转换也是如此 但是因为转换里的步骤是并行执行的 每个步骤都打开一个独立的数据库连接并开始一个事务 尽管这样在很多情况下会提高性能
  • Airbnb深度学习在搜索领域的探索总结

    今天的博客主要参考了Airbnb发表的paper Applying Deep Learning To Airbnb Search 这篇paper介绍了近2年Airbnb在搜索场景下所使用模型的演进路线 以及一些失败的总结和经验的总结 最难能
  • 常用的渗透测试工具之 SQLMap

    web安全攻防 第三章学习之SQLmap SQLMap介绍 SQLMap是自动化的SQL注入工具 主要功能是扫描 发现并利用URL的SQL注入漏洞 内置了很多绕过插件 SQLMap采用了五种独特的SQL注入技术 如下 1 基于布尔类型的盲注
  • maven deploy 遇到 “方法不会覆盖或实现超类型的方法” 不要慌

    思考问题 这个bug看的我莫名其妙 看名字也看不懂说的啥 在网上看到说什么把 Override去掉就行了什么 我就觉得很奇怪 跟这个能有什么关系呢 网上既然说是跟 Override有关 那么这应该是是跟我实现的接口有关 后来发现是我在接口中
  • 【星海随笔】Windows 下 安装 Eclipse IDE 编辑 C++ Code

    首先下载Eclips https download csdn net download weixin 41997073 86727250 安装后 然后点点点就可以了 但要记住自己安装的路径 安装后 先认识一下这个工具 File可以创建项目
  • sublime vue 语法高亮插件安装

    转自 http www cnblogs com cosnyang p 6290950 html 默认情况下 Vue js 的单文件组件 vue 在 sublime 编辑器中是不被识别的 若要想高亮显示 需要安装插件 Vue Syntax H
  • No such operator image::read_file问题解决

    在学习动手学深度学习这门课的时候 在13 6 节 标检测数据集这一章遇到了问题 读取数据的时候报错 No such operator image read file 网上有人说问题在于pytorch版本和torchvision版本不对应 可
  • weixin-js-sdk使用

    注意 以下内容自身的项目为uniapp编译生成微信小程序 小程序内嵌webview 一 微信初始化 安装微信sdk npm install weixin js sdk save 页面引入 import wx from weixin js s
  • 构建高性能数据库缓存之Redis(一)

    一 Redis概述 1 1 什么是redis Redis是一个开源的用ANSI C编写 支持网络 基于内存 亦可持久化的日志型 Key Value数据库 根据DB Engines com站点月度排行的数据显示 Reidis是最流行的键值对存
  • SpringBoot整合MinIO

    文章目录 1 问题背景 2 前言 3 步骤 3 1 引入依赖 3 2 连接MinIO服务端的必要参数 3 3 代码实现文件上传功能 3 4 验证 1 问题背景 前面搭建了MinIO容器 现在来研究SpringBoot整合MinIO 2 前言
  • 并发编程基础知识(一)[进程篇]

    目录 一 程序的执行方式 1 进程是什么东西 2 进程与程序区别 3 进程状态 4 linux进程地址空间布局 5 linux下进程相关的API函数 1 创建一个新进程 2 进程退出 3 等待子进程退出 4 让一个进程去执行一个指定的程序文
  • 什么是迁移学习(Transfer Learning)?【精讲+代码实例】

    文章目录 1 Introduction 2 Development of Machine Learning 3 What is transfer learning 4 How to transfer 4 1 Example 1 物体识别 4
  • UE4 C++ 类的4种引用类型,和异步加载资产

    UE4 C 类的4种引用类型 和异步加载资产 4种引用类型 对象引用 引用 World 的实例对象 就是直接定义 UPROPERTY EditAnywhere BlueprintReadOnly Category My 对象引用 UWorl