虚幻引擎UE5 GAS开发RPG游戏-02 设置英雄角色-17 同步加载

发布于:2025-07-08 ⋅ 阅读:(18) ⋅ 点赞:(0)

1.目标:

在角色类,软引用我们创建的数据资产

2.创建角色启动资产

Source/Warrior/Public/Characters/WarriorBaseCharacter.h

#pragma region CharacterData
	//角色启动资产
	UPROPERTY(EditDefaultsOnly,BlueprintReadonly,Category ="CharacterData|StartUp")
	TSoftObjectPtr<UDataAsset_StartUpDataBase> CharacterStartUpData;
#pragma endregion

3.怎么将软引用资产加载到内存中呢?

同步加载:武器

异步加载:敌人

在Source/Warrior/Private/Characters/WarriorBaseCharacter.cpp的PossessedBy()方法里:

//当Controller(玩家或AI)获得该Pawn控制权时触发
void AWarriorBaseCharacter::PossessedBy(AController* NewController)
{
	Super::PossessedBy(NewController);
	if (WarriorAbilitySystemComponent == nullptr) return;
	
	//初始化能力系统与角色的关联关系
	WarriorAbilitySystemComponent->InitAbilityActorInfo(this, this);

	//确保角色启动资产不为空
	// ensure(!CharacterStartUpData.IsNull());
	ensureMsgf(!CharacterStartUpData.IsNull(),TEXT("忘记给角色 %s 分配启动资产了!"),*GetName());
	
}

转到英雄类实现:

Source/Warrior/Private/Characters/WarriorHeroCharacter.cpp

//当Controller(玩家或AI)获得该Pawn控制权时触发
void AWarriorHeroCharacter::PossessedBy(AController* NewController)
{
	Super::PossessedBy(NewController);

	if (CharacterStartUpData.IsNull()) return;
	UDataAsset_StartUpDataBase* LoadedData = CharacterStartUpData.LoadSynchronous();
	if (LoadedData == nullptr) return;
	LoadedData->GiveToAbilitySystemComponent(WarriorAbilitySystemComponent);
}

这段代码是Unreal Engine中处理角色被Controller控制时的初始化逻辑,主要涉及游戏能力系统(GAS)的初始化。我来分析关键点:

  1. 继承调用:
    Super::PossessedBy(NewController)确保父类的标准控制逻辑先执行,这是UE的标准做法

  2. 资源验证:
    CharacterStartUpData.IsNull()检查数据资产是否有效,避免空指针异常

  3. 同步加载:
    LoadSynchronous()同步加载数据资产,适合在游戏初始化阶段使用,但要注意可能造成卡顿

  4. 能力系统初始化:
    GiveToAbilitySystemComponent将加载的启动数据应用到角色的能力系统组件(ASC)中

改进建议:

  1. 可考虑改为异步加载避免卡顿
  2. 建议添加日志输出便于调试
  3. 可扩展Controller类型判断逻辑,区分玩家和AI的不同初始化需求

这段代码展示了UE中角色控制权转移时的标准处理模式,特别适合使用Gameplay Ability System的项目架构

4.角色蓝图加载数据资产:

效果:

只能单机游戏,别的客户端没有复制啊!


网站公告

今日签到

点亮在社区的每一天
去签到