0%

UE(6):UObject和UGameInstance的实例化

UObject的实例化

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Engine/Classes/Engine/DataTable.h"
#include "UObject/NoExportTypes.h"
#include "MyObject.generated.h"

USTRUCT(BlueprintType)
struct FMyDataTableStruct: public FTableRowBase
{
GENERATED_USTRUCT_BODY()
// 声明构造函数
FMyDataTableStruct();

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyTestDataTableStruct")
float Health;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyTestDataTableStruct")
FString Name;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyTestDataTableStruct")
int Level;
};

/**
*
*/
UCLASS()
class MYPROJECT2_API UMyObject : public UObject
{
GENERATED_BODY()
public:
// 声明结构体
UPROPERTY()
FMyDataTableStruct MyDataTableStruct;
};

// MyObject.cpp
// 实现构造函数
FMyDataTableStruct::FMyDataTableStruct()
{
Health = 10.0f;
Name = TEXT("zhangsan");
Level = 1;
}

// MyPawn.h
// 声明变量
UPROPERTY()
UMyObject* MyTestObject;

// MyPawn.cpp
void AMyPawn::BeginPlay()
{
Super::BeginPlay();

TSubclassOf<UMyObject> MySubClassObject = UMyObject::StaticClass();
// Object实例化
MyTestObject = NewObject<UMyObject>(GetWorld(), MySubClassObject);
// 判断是否实例化成功
if (MyTestObject) {
UE_LOG(LogTemp, Warning, TEXT("MyTestObject is %s"), *MyTestObject->GetName());
// 获取结构体变量
UE_LOG(LogTemp, Warning, TEXT("My Health is %f"), MyTestObject->MyDataTableStruct.Health);
UE_LOG(LogTemp, Warning, TEXT("My Name is %s"), *MyTestObject->MyDataTableStruct.Name);
UE_LOG(LogTemp, Warning, TEXT("My Level is %d"), MyTestObject->MyDataTableStruct.Level);
}
}

image-20240821152243312

UGameInstance的实例化

GameInstance全局唯一单例,这个在引擎初始化的时候就已经生成,一直存在到引擎关闭

作用:

  1. 引擎初始化与关闭时执行的逻辑
  2. 为游戏保全全局数据:比如上一个关卡的信息需要在下一个关卡使用时我们用 GameInstance 保存数据但是只是临时数据,游戏结束则消失,如果想要本地持久保存数据需要用 SaveGame

引擎中创建 MyGameInstance

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
// MyGameInstance.h
// 类中声明
public:
// 声明构造函数
UMyGameInstance();
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = "MyInstance")
FString MyAPPID;
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = "MyInstance")
FString MyUserID;
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = "MyInstance")
FString MyName;

// MyGameInstance.cpp
// 实现构造函数
UMyGameInstance::UMyGameInstance()
{
MyAPPID = TEXT("123");
MyUserID = TEXT("456");
MyName = TEXT("zhangsan");
}

// MyPawn.h
#include "MyGameInstance.h"
// 声明一个Instance变量
UPROPERTY()
UMyGameInstance* MyInstance;

// MyPawn.cpp
// MyInstance实例化
MyInstance = Cast<UMyGameInstance>(GetWorld()->GetFirstLocalPlayerFromController()->GetGameInstance());
if (MyInstance) {
UE_LOG(LogTemp, Warning, TEXT("MyInstance is %s"), *MyInstance->GetName());
UE_LOG(LogTemp, Warning, TEXT("MyAPPID is %s"), *MyInstance->MyAPPID);
UE_LOG(LogTemp, Warning, TEXT("MyUserID is %s"), *MyInstance->MyUserID);
UE_LOG(LogTemp, Warning, TEXT("MyName is %s"), *MyInstance->MyName);
}

运行

编辑—>项目设置—>地图与模式—>游戏实例—>游戏实例类—>MyGameInstance

image-20240821170426505