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


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

    4种引用类型

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

    就是直接定义

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


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

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

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


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

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

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


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

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

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

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

    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();
    
    };
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    // 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

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

    namespace EAsyncLoadingResult
    {
    	enum Type
    	{
    		/** Package failed to load */
    		Failed,
    		/** Package loaded successfully */
    		Succeeded,
    		/** Async loading was canceled */
    		Canceled
    	};
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

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

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

  • 相关阅读:
    windows ubuntu子系统,肿瘤全外篇1.安装软件及建立数据库
    kvm虚拟机压缩qcow2镜像空间
    oracle-pl/sql -常用sql (持续更新中)
    可持续建筑分论坛精彩回顾 | 第二届始祖数字化可持续发展峰会
    软件测试用里篇
    105.am40刷机(linux)折腾记1-前期的准备工作1
    两步随机接入机制的深度解析和未来增强
    Ribbon负载均衡
    springboot注解方式,@Autowire和有参构造和无参构造使用哪个创建对象
    优秀笔记软件盘点(五)—那些强大的卡片笔记写作法软件
  • 原文地址:https://blog.csdn.net/qq_51654332/article/details/126870439