温故
1️⃣ 用 AssetDefinitionDefault
注册我们的资产。
2️⃣ 用 ToolMenus
扩展编辑器的菜单和工具栏。
3️⃣ 用 FSlateStyleSet
自定义了一些图标。
属性持久化
Config
Config|类内方法
大约 3 分钟
AssetDefinitionDefault
注册我们的资产。ToolMenus
扩展编辑器的菜单和工具栏。FSlateStyleSet
自定义了一些图标。一个封装了“UE 编辑器中资产编辑器所需基础功能(如菜单、工具栏、面板注册、布局、命令系统)的一套可扩展基类框架”。
virtual EAssetCommandResult OpenAssets(const FAssetOpenArgs& OpenArgs) const override;
void UExorcistGameInstance::Init()
{
Super::Init();
if(Request.IsEmpty()) return;
UAsyncMultiDataCollectionLoader* Loader = UAsyncMultiDataCollectionLoader::AsyncMultiDataCollectionLoader(this,Request,LoadBundles);
if(!Loader) return;
Loader->OnSuccess.AddDynamic(this, &UExorcistGameInstance::OnDataCollectionLoaded);
Loader->Activate();
}
void UExorcistGameInstance::OnDataCollectionLoaded(const TArray<FDataCollectionInstance>& DefinitionCollections)
{
if(DefinitionCollections.IsEmpty()) return;
UExorcistSaveGame* SaveSettings = UExorcistDataStorageLibrary::LoadSaveData(this);
if (!SaveSettings) return;
UUserDataSubsystem *UserData = GetSubsystem<UUserDataSubsystem>();
if(!UserData) return;
for(auto DataCollection : DefinitionCollections)
{
if(DataCollection.DefinitionInstance && DataCollection.PrimaryAssetType == TEXT("Inventory"))
{
UExorcistSaveDataValidatorLibrary::ValidateInventoryData(SaveSettings, DataCollection.DefinitionInstance);
}
else if(DataCollection.DefinitionInstance && DataCollection.PrimaryAssetType == TEXT("Hero"))
{
UExorcistSaveDataValidatorLibrary::ValidateHeroData(SaveSettings, DataCollection.DefinitionInstance);
}
UserData->AddDefinitionCollection(DataCollection.PrimaryAssetType, DataCollection.DefinitionInstance);
}
UExorcistDataStorageLibrary::SaveGameData(this, SaveSettings);
UserData->MarkDataReady();
}
经过前面几章的讨论我们对UE的网络复制用法有了些许了解,本章将对网络控制权限方面进行进一步深入。
bool AActor::HasAuthority() const
{
return (Role == ROLE_Authority);
}
没有开启网络预测
EDirectionType UAbilityUtility::DeterminePlayerInputDirection(const APawn* Pawn)
{
if(!Pawn ||!Pawn->InputComponent) return EDirectionType::Invalid;
// 计算相对方向向量
const FVector InputDirection = Pawn->GetLastMovementInputVector().GetSafeNormal();
if (InputDirection.IsNearlyZero())
{
return EDirectionType::Forward; // 默认向前
}
float ForwardDot = FVector::DotProduct(InputDirection, Pawn->GetActorForwardVector());
float RightDot = FVector::DotProduct(InputDirection, Pawn->GetActorRightVector());
if (ForwardDot > 0.5f)
{
return EDirectionType::Forward;
}
if (ForwardDot < -0.5f)
{
return EDirectionType::Backward;
}
if (RightDot > 0.5f)
{
return EDirectionType::Right;
}
if (RightDot < -0.5f)
{
return EDirectionType::Left;
}
return EDirectionType::Forward;
}
void UExorcistViewModelBase::Initialize()
{
Super::Initialize();
if (bInitialized) return;
bInitialized = true;
check(DataCollection);
}
FPropertyEditorModule& PropertyEditorModule = FModuleManager::GetModuleChecked<FPropertyEditorModule>(
"PropertyEditor"
);