1、概述

VR(Virtual Reality)虚拟现实,是一种通过计算机生成的三维图像和声音等多种感官反馈手段,使用户获得身临其境的仿真体验的技术。目前主要应用于游戏、教育、医疗等领域,并逐渐扩展到虚拟旅游、设计模拟、军事训练等方面。
开发引擎:Unity、Unreal Engine
2D设计工具:PS、AI
3D建模工具:3dmax、C4D、blender
常用的VR SDK:steam VR plugin、vive input utility

2、UE5

UE4 C++编程基础记录
虚幻引擎为您提供在构建过程中生成代码的工具。这些工具拥有一些类命名规则。如命名与规则不符,将触发警告或错误。下方的类前缀列表说明了命名的规则。

派生自 Actor 的类前缀为 A,如 AController。
派生自 对象 的类前缀为 U,如 UComponent。
枚举 的前缀为E,如 EFortificationType。
接口 类的前缀通常为 I,如 IAbilitySystemInterface。
模板类的前缀为 T,如 TArray。
派生自 SWidget(Slate UI)的类前缀为 S,如 SButton。
其余类的前缀均为 字母 F ,如 FVector。

前缀 说明
A 继承自Actor的类
U 继承自UObject,但不继承自Actor的类
E 枚举 的前缀
I 接口 类的前缀
T 模板类的前缀
S 派生自 SWidget(Slate UI)的类前缀
H HitResult相关类前缀
F 其余类,纯c++类

基础标记:都是UE5使用其自身的反射实现,来启动动态功能,比如,垃圾回收,序列化,网络复制和蓝图/C++通信。这些功能你可以根据需求选择的加入,只要为相应的类型添加正确的标记就可生成反射数据。

标记 说明
UCLASS() 告知虚幻引擎生成类的反射数据。类必须派生自 UObject。
USTRUCT() 告知虚幻引擎生成结构体的反射数据。
GENERATED_BODY() UE4 使用它替代为类型生成的所有必需样板文件代码。就是说这个类不直接使用父类的声明。但是,你必须得去实现,自己去声明,否则就会报错。更多信息
UPROPERTY() 使 UCLASS 或 USTRUCT 的成员变量可用作 UPROPERTY。UPROPERTY 用途广泛。它允许变量被复制、被序列化,并可从蓝图中进行访问。垃圾回收器还使用它们来追踪对 UObject 的引用数。
UFUNCTION() 使 UCLASS 或 USTRUCT 的类方法可用作 UFUNCTION。UFUNCTION 允许类方法从蓝图中被调用,并在其他资源中用作 RPC

3、智能指针

UObject: TObjectPtr
非-UObject :TSharedPtr

TObjectPtr(UE5 推荐的 UObject 指针包装器)
TWeakObjectPtr(弱引用,自动置空)
TLazyObjectPtr(延迟/跨关卡对象引用)
TSoftObjectPtr / FSoftObjectPath(软引用 / 以路径引用 Asset,可异步加载)
TScriptInterface(接口引用,存 UObject* + 接口指针)
TSubclassOf(类类型选择器:保存 UClass 子类)
TSharedPtr / TSharedRef / TWeakPtr(引用计数智能指针,用于非-UObject 的普通 C++ 对象)
TUniquePtr(独占所有权的智能指针,用于非-UObject 对象)

// 创建一个空白的共享指针
TSharedPtr<FMyObjectType> EmptyPointer;
// 为新对象创建一个共享指针
TSharedPtr<FMyObjectType> NewPointer(new FMyObjectType());
// 从共享引用创建一个共享指针
TSharedRef<FMyObjectType> NewReference(new FMyObjectType());
TSharedPtr<FMyObjectType> PointerFromReference = NewReference;
// 创建一个线程安全的共享指针
TSharedPtr<FMyObjectType, ESPMode::ThreadSafe> NewThreadsafePointer = MakeShared<FMyObjectType, ESPMode::ThreadSafe>(MyArgs);
 

// 使用MakeShareable(推荐) TSharedPtr<TArray<uint8>>
auto MyArrayPtr = MakeShareable(new TArray<uint8>());   

// 或使用MakeShared(更高效,单次内存分配)
auto EfficientPtr = MakeShared<TArray<uint8>>();
void ExampleUsage()
{
    // 1. 创建MyClass的智能指针(如问题所示)
    TSharedPtr<MyClass> MyPtr = MakeShareable(new MyClass());
    MyPtr->SetValue(42);
    
    // 2. 创建包含TArray<uint8>的智能指针
    TSharedPtr<TArray<uint8>> ImageData = MakeShared<TArray<uint8>>();
    
    // 模拟加载图像数据
    const int32 ImageSize = 1024 * 768; // 假设的图像大小
    ImageData->SetNumUninitialized(ImageSize);
    
    // 填充数据(示例)
    for (int32 i = 0; i < ImageData->Num(); i++)
    {
        (*ImageData)[i] = static_cast<uint8>(i % 256);
    }
    
    // 3. 在函数间传递
    ProcessImageData(ImageData);
    
    // 4. 使用Lambda捕获智能指针
    auto ProcessLambda = [ImageData]()
    {
        if (ImageData.IsValid())
        {
            UE_LOG(LogTemp, Log, TEXT("Processing %d bytes"), ImageData->Num());
        }
    };
    
    ProcessLambda();
    
    // 5. 重置智能指针
    ImageData.Reset(); // 引用计数减1,如果为0则释放内存
}

void ProcessImageData(const TSharedPtr<TArray<uint8>>& Data)
{
    if (!Data.IsValid())
    {
        return;
    }
    
    // 处理数据
    int32 Total = 0;
    for (uint8 Value : *Data)
    {
        Total += Value;
    }
    
    UE_LOG(LogTemp, Log, TEXT("Total value: %d"), Total);
}

3、UObject

#pragma once 
#include 'Object.h'
#include 'MyObject.generated.h'

UCLASS()
class MYPROJECT_API UMyObject : public UObject
{
	GENERATED_BODY()

};

UObject实例创建
NewObject
NewNamedObject
ConstructObject

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐