UObject和AActor有什么区别?
时间: 2024-01-04 22:04:23 浏览: 215
在UE4中,UObject和AActor都是基本的类。
UObject是所有UE4对象的基类,包括Actor、Component、Widget等。它提供了一些基础的功能,例如对象的引用计数、序列化和反序列化、编辑器中的属性管理等。因此,它通常被用于创建一些不需要在场景中渲染的对象,例如游戏逻辑、数据存储等。
AActor是UObject的一个子类,它代表了在场景中可以被渲染的物体。它包含了一些与场景渲染相关的属性,例如位置、旋转、缩放、碰撞体等。它还包含了一些与场景交互相关的功能,例如触发事件、碰撞检测等。因此,它通常被用于创建场景中的实体,例如角色、道具、特效等。
总的来说,UObject和AActor都是UE4中非常重要的类。UObject是所有对象的基类,提供了一些基础功能,而AActor是UObject的子类,代表了可以在场景中被渲染和交互的实体。
相关问题
怎么创建一个uobject
"UObject"这个词通常出现在Unreal Engine(虚幻引擎)中,它是一个强大的游戏开发框架。在Unreal Engine中,创建一个基础的 UObject 类型的对象通常涉及以下几个步骤:
1. **继承自AActor或其他合适的基类**:首先,你需要创建一个新的C++类,并从`UObject`、`AActor`或者其他的合适基类派生,比如`UStaticMeshComponent`如果你需要制作静态网格组件。
```cpp
class MyNewClass : public AActor
{
GENERATED_BODY() // 这行会自动生成一些必要的 UObject 特性
public:
//...
};
```
2. **添加必要的属性**:通过`UProperty`或`USTRUCT`宏定义成员变量,这些将作为对象的内容。
3. **实现构造函数和析构函数**:确保有适当的初始化和清理逻辑。
4. **虚拟函数和事件处理**:如果需要,可以声明和实现虚函数,以便于多态。
5. **注册组件**:使用`RegisterComponent`等函数在编辑器中注册这个类,让它可以在游戏模式下实例化。
6. **在蓝图中引用**:如果你想在蓝图中使用这个类,需要在蓝图系统里对其进行引用配置。
在 Unreal Engine 4(UE4)中实例化一个UObject
### 如何在 Unreal Engine 4 (UE4) 中创建和初始化 UObject 实例
为了确保 UE4 的垃圾回收机制正常工作,不推荐使用 C++ 的 `new` 和 `delete` 来分配和释放继承自 `UObject` 的对象。相反,应当采用由引擎提供的特定函数来实例化这些对象。
#### 使用 NewObject 函数
一种常用的方法是调用模板函数 `NewObject<T>()` 。此方法允许指定新对象所属的外层对象以及名称等参数:
```cpp
AActor* Owner = GetWorld()->GetFirstPlayerController()->GetPawn();
USkeletalMeshComponent* MeshComp = NewObject<USkeletalMeshComponent>(Owner, NAME_None);
```
上述代码片段展示了如何基于给定的所有者(通常是场景中的某个演员),通过静态模板函数 `NewObject<>` 创建一个新的骨骼网格组件[^2]。
#### 动态加载蓝图类并生成实例
如果目标是从已编译好的蓝图资产动态构建一个 `UObject` ,那么可以先获取该蓝图对应的 `UBlueprintGeneratedClass *` 类型指针,再利用它作为模板实参传递给 `NewObject()` 或者直接调用其成员函数 `ConstructObject()`.
```cpp
FString PathToBP(TEXT("/Game/MyBlueprints/BP_MyCharacter"));
TSubclassOf<AActor> BPACTORCLASS = StaticLoadObject(ABP_MyCharacter::StaticClass(), NULL, *PathToBP);
if(BPACTORCLASS != nullptr){
AActor* SpawnedActor = GetWorld()->SpawnActorDeferred<BPACTORCLASS>(*BPACTORCLASS,FTransform());
}
```
这里展示了一个例子,在其中尝试从文件路径中读取蓝图资源,并将其转换成可被用于实例化的子类描述符;接着以延迟的方式在这个世界里放置一个此类的新实体[^1].
#### 注意事项
当涉及到多线程环境下的对象创建时,请务必遵循最佳实践指南,比如考虑将操作安排到主线程上执行,或者采取适当措施同步访问共享数据结构。另外需要注意的是,某些情况下可能还需要手动触发更新事件以便让新增加的内容能够及时反映出来。
阅读全文
相关推荐











