UE引擎的UWorld是什么,UWorld与GWorld的关系

本文介绍了UE引擎中UWorld的概念及其重要组成部分,如PersistentLevel、NetDriver和GameState等,并解释了UWorld与GWorld之间的关系。

UE引擎的UWorld是什么,UWorld与GWorld的关系

UWorld有一些关于游戏的重要信息,比如(PersistentLevelNetDriverGameState),没有它,你不能做你想做的大部分事情。

GWorld是个全局指针变量,指向UWorld的指针(Global UWorld pointer)。

定义在文件:Engine\Source\Runtime\Engine\Classes\Engine\World.h

/** Global UWorld pointer. Use of this pointer should be avoided whenever possible. */
extern ENGINE_API class UWorldProxy GWorld;

   World 是代表地图或沙箱的顶级对象,Actor 和组件将存在于其中并进行渲染。
  一个世界可以是一个单一的持久关卡,带有一个可选的流式关卡列表,这些关卡通过卷和蓝图函数加载和卸载或者它可以是使用 World Composition 组织的关卡集合。
  在独立游戏中,通常只有一个世界存在,除非在无缝区域转换期间同时存在目的地和当前世界。
  在编辑器中存在许多世界:正在编辑的关卡、每个 PIE 实例、每个具有交互式渲染视口的编辑器工具等等。

class UWorld : public UObject
{
public:
    // ...
    class ULevel*                                       PersistentLevel;
    class UNetDriver*                                   NetDriver;
    class AGameNetworkManager*                          NetworkManager;
    // ...
    class AGameStateBase*                               GameState;
    // ...
    class ULevel*                                       CurrentLevel;
    class UGameInstance*                                OwningGameInstance;
    // ...
};

UWorld代理类:


/** Proxy class that allows verification on GWorld accesses. */
class UWorldProxy
{
public:

	UWorldProxy() :
		World(NULL)
	{}

	inline UWorld* operator->()
	{
		// GWorld is changed often on the game thread when in PIE, accessing on any other thread is going to be a race condition
		// In general, the rendering thread should not dereference UObjects, unless there is a mechanism in place to make it safe	
		checkSlow(IsInGameThread());							
		return World;
	}

	inline const UWorld* operator->() const
	{
		checkSlow(IsInGameThread());
		return World;
	}

在内存中查看UWorld:

FirstPersonExampleMap    0x216542AEAC0    World 

 查看 UWorld偏移量:ExeModuleBase+0x5B14EB8

查看UWorld内存布局:

<think> 我们在UE5中使用C++复制一个Actor通常指的是在运行时动态创建一个现有Actor的副本。这可以通过`UWorld::SpawnActor()`函数实现,但需要特别注意模板Actor的来源和初始化设置。以下是实现步骤: 1. **获取当前World对象**:这是生成Actor的必要环境。 2. **指定要复制的Actor的Class**:通常来源于现有Actor实例的`GetClass()`方法。 3. **设置生成参数**:包括位置、旋转等,可以使用原Actor的变换(Transform)。 4. **调用SpawnActor**:生成新的Actor实例。 此外,如果需要深度复制(包括属性值),可能还需要手动复制属性或使用序列化/反序列化方法。但通常情况下,直接生成一个新Actor再设置属性即可。 下面是一个示例函数,用于复制一个给定的Actor: ```cpp #include "GameFramework/Actor.h" #include "UObject/Class.h" #include "GameFramework/WorldSettings.h" // 在某个函数中,假设我们有一个指向原Actor的指针 AActor* OriginalActor AActor* DuplicateActor(AActor* OriginalActor) { if (!OriginalActor) return nullptr; UWorld* World = OriginalActor->GetWorld(); if (!World) return nullptr; // 获取原Actor的类和变换 UClass* ActorClass = OriginalActor->GetClass(); FTransform SpawnTransform = OriginalActor->GetTransform(); // 设置生成参数 FActorSpawnParameters SpawnParams; SpawnParams.Template = OriginalActor; // 使用原Actor作为模板(复制属性值) SpawnParams.bNoFail = true; // 确保生成不会失败 // 生成新Actor AActor* NewActor = World->SpawnActor<AActor>(ActorClass, SpawnTransform, SpawnParams); return NewActor; } ``` 关键点说明: - **SpawnParams.Template**:通过设置Template为原Actor,新生成的Actor会复制原Actor的所有属性(包括蓝图编辑器中设置的默认属性)。注意:这要求原Actor生成的新Actor是同一个类(或子类)。 - 如果不需要复制运行时修改的属性(只需要类默认值),可以省略`SpawnParams.Template`。 注意事项: 1. 该方法适用于复制同一关卡中的Actor。如果要跨关卡复制,需要考虑额外的资源管理。 2. 复制Actor时,其组件(如StaticMeshComponent)也会被复制,但需要注意组件引用的资源(如材质、纹理)是否已正确加载。 3. 对于动态创建的Actor,记得在不需要时销毁,避免内存泄漏。 另外,在蓝图中也可以使用`Spawn Actor from Class`节点,但C++提供更灵活的控制。 §§相关问题§§ 1. 如何复制Actor并修改其部分属性? 2. 复制Actor时如何避免复制某些组件? 3. 怎样在复制Actor时同步网络(多玩家环境)? </think> 在虚幻引擎5(UE5)中使用C++复制一个Actor的核心方法是**通过 `UWorld::SpawnActor()` 函数动态生成新实例**,并结合模板复制属性。以下是具体步骤和代码示例: --- ### **步骤详解** #### 1. **获取当前World对象** ```cpp UWorld* World = GetWorld(); // 在Actor/PlayerController中调用 // 或通过 GWorld 全局对象(需确保线程安全) ``` #### 2. **设置生成参数(`FActorSpawnParameters`)** - **关键参数**:`Template` 指向要复制的源Actor ```cpp FActorSpawnParameters SpawnParams; SpawnParams.Template = OriginalActor; // 源Actor实例 SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; ``` #### 3. **指定生成位置旋转** ```cpp FVector Location = OriginalActor->GetActorLocation() + FVector(100, 0, 0); // 偏移位置 FRotator Rotation = OriginalActor->GetActorRotation(); ``` #### 4. **调用 `SpawnActor` 复制Actor** ```cpp AActor* NewActor = World->SpawnActor<AActor>( OriginalActor->GetClass(), // 获取源Actor的UClass Location, Rotation, SpawnParams ); ``` --- ### **完整代码示例** ```cpp // 在某个函数中(如PlayerController的输入事件) void AMyPlayerController::DuplicateActor(AActor* TargetActor) { if (!TargetActor) return; UWorld* World = GetWorld(); if (!World) return; // 设置生成参数(以TargetActor为模板) FActorSpawnParameters SpawnParams; SpawnParams.Template = TargetActor; SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; // 计算新位置(例如向右偏移1米) FVector NewLocation = TargetActor->GetActorLocation() + FVector(100, 0, 0); // 生成复制体 AActor* Clone = World->SpawnActor<AActor>( TargetActor->GetClass(), NewLocation, TargetActor->GetActorRotation(), SpawnParams ); if (Clone) { UE_LOG(LogTemp, Warning, TEXT("Actor cloned: %s"), *Clone->GetName()); } } ``` --- ### **关键说明** 1. **模板复制(`Template`)** 通过 `SpawnParams.Template` 指定源Actor,新生成的Actor会**自动复制所有属性值**(包括组件、变量状态等)[^1][^4]。 2. **碰撞处理** `ESpawnActorCollisionHandlingMethod::AlwaysSpawn` 确保即使位置重叠也能生成,避免失败。 3. **适用场景** - 动态生成预设的蓝图Actor(需先获取其 `UClass`) - 批量创建相同配置的Actor(如关卡中的敌人生成点) --- ### **注意事项** - **蓝图Actor支持**:若复制蓝图Actor,需通过 `LoadClass<T>()` 或 `StaticLoadClass()` 加载其类: ```cpp UClass* BlueprintClass = LoadClass<AActor>(nullptr, TEXT("/Game/Path/MyBlueprint.MyBlueprint_C")); ``` - **网络同步**:多玩家环境下需在服务端执行生成逻辑,并使用 `Replicates` 属性同步[^3]。 - **内存管理**:动态生成的Actor需手动销毁(`Destroy()`)或在关卡卸载时自动清理。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AppNinja

你的鼓励是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值