跳至主要內容
ED06.Config|属性持久化

温故

1️⃣ 用 AssetDefinitionDefault注册我们的资产。

2️⃣ 用 ToolMenus扩展编辑器的菜单和工具栏。

3️⃣ 用 FSlateStyleSet自定义了一些图标。

属性持久化

Config

Config|类内方法


Mr.Si大约 3 分钟u++
ED08.FAssetEditorToolkit|自定义资源编辑器

FAssetEditorToolkit

一个封装了“UE 编辑器中资产编辑器所需基础功能(如菜单、工具栏、面板注册、布局、命令系统)的一套可扩展基类框架”。

	virtual EAssetCommandResult OpenAssets(const FAssetOpenArgs& OpenArgs) const override;

Mr.Si大约 5 分钟u++
Error17. GameInstanceInit阶段过早触发异步加载导致崩溃

问题描述

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();
}

Mr.Si小于 1 分钟u++
NT-2.2.2|控制权限

前言

经过前面几章的讨论我们对UE的网络复制用法有了些许了解,本章将对网络控制权限方面进行进一步深入。

HasAuthority

bool AActor::HasAuthority() const
{
    return (Role == ROLE_Authority);
}

Mr.Si大约 3 分钟u++
c8.3GAS|GameplayAbility|实践闪避|翻滚

1.AbilityTask_WaitGameplayEvent

2.SendGameplayEventToActor

方向计算

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; 
}

Mr.Si大约 4 分钟u++
ED07.DetailView|细节面板初稿

DetailView

使用方法

1. 获取 PropertyEditor 模块的实例

FPropertyEditorModule& PropertyEditorModule = FModuleManager::GetModuleChecked<FPropertyEditorModule>(
    "PropertyEditor"
);


Mr.Si大约 3 分钟u++