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


所有评论(0)