Files
ProjectEleri/Source/ProjectEleri/DialogueSystem/DialogueSubsystem.cpp

82 lines
2.1 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#include "DialogueSubsystem.h"
#include "SpeechDataAsset.h"
#include "Engine/AssetManager.h"
#include "Kismet/GameplayStatics.h"
UDialogueSubsystem* UDialogueSubsystem::Get(const UObject* WorldContext)
{
if(const UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(WorldContext))
{
return GameInstance->GetSubsystem<UDialogueSubsystem>();
}
return nullptr;
}
void UDialogueSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
Super::Initialize(Collection);
bDialogueLoaded = false;
//Fetch dialogues
if(UAssetManager* AssetManager = UAssetManager::GetIfInitialized())
{
FStreamableManager& StreamableManager = AssetManager->GetStreamableManager();
AssetManager->GetAssetRegistry().GetAssetsByClass(FTopLevelAssetPath(USpeechDataAsset::StaticClass()->GetPathName()), AllAssetPaths, false);
TArray<FSoftObjectPath> AssetPaths;
for(int32 i = 0; i < AllAssetPaths.Num(); i++)
{
AssetPaths.AddUnique(AllAssetPaths[i].GetSoftObjectPath());
}
StreamableManager.RequestAsyncLoad(AssetPaths, FStreamableDelegate::CreateUObject(this, &UDialogueSubsystem::DialogueAssetsLoaded));
}
}
TArray<TObjectPtr<USpeechDataAsset>> UDialogueSubsystem::GetDialogueForActor(const AActor* Actor)
{
TArray<TObjectPtr<USpeechDataAsset>> ActorDialogue;
if(!bDialogueLoaded) return ActorDialogue;
for(int32 i = 0; i < AllSpeechData.Num(); i++)
{
if(AllSpeechData[i] && AllSpeechData[i].Get()->Npc.IsValid())
{
if(AllSpeechData[i].Get()->Npc->GetClassPathName() == Actor->GetClass()->GetClassPathName())
{
ActorDialogue.Add(AllSpeechData[i]);
}
}
}
return ActorDialogue;
}
bool UDialogueSubsystem::StartDialogue()
{
if(bDialogueStarted) return false;
bDialogueStarted = true;
return true;
}
void UDialogueSubsystem::EndDialogue()
{
bDialogueStarted = false;
}
void UDialogueSubsystem::DialogueAssetsLoaded()
{
for(int32 i = 0; i < AllAssetPaths.Num(); i++)
{
AllSpeechData.Add(Cast<USpeechDataAsset>(AllAssetPaths[i].GetAsset()));
}
bDialogueLoaded = true;
OnDialogueAssetsLoaded.Broadcast();
UE_LOG(LogTemp, Warning, TEXT("Loaded assets"));
}