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)的初始化。我来分析关键点:
继承调用:
Super::PossessedBy(NewController)
确保父类的标准控制逻辑先执行,这是UE的标准做法资源验证:
CharacterStartUpData.IsNull()
检查数据资产是否有效,避免空指针异常同步加载:
LoadSynchronous()
同步加载数据资产,适合在游戏初始化阶段使用,但要注意可能造成卡顿能力系统初始化:
GiveToAbilitySystemComponent
将加载的启动数据应用到角色的能力系统组件(ASC)中
改进建议:
- 可考虑改为异步加载避免卡顿
- 建议添加日志输出便于调试
- 可扩展Controller类型判断逻辑,区分玩家和AI的不同初始化需求
这段代码展示了UE中角色控制权转移时的标准处理模式,特别适合使用Gameplay Ability System的项目架构
4.角色蓝图加载数据资产:
效果:
只能单机游戏,别的客户端没有复制啊!