Implemented Walker NPCs
This commit is contained in:
parent
9c12ecce85
commit
528e317961
BIN
EndlessVendetta/Content/StarterContent/Blueprints/Blueprint_CeilingLight.uasset
(Stored with Git LFS)
BIN
EndlessVendetta/Content/StarterContent/Blueprints/Blueprint_CeilingLight.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
EndlessVendetta/Content/StarterContent/Particles/P_Ambient_Dust.uasset
(Stored with Git LFS)
BIN
EndlessVendetta/Content/StarterContent/Particles/P_Ambient_Dust.uasset
(Stored with Git LFS)
Binary file not shown.
2
EndlessVendetta/EndlessVendetta.sln.DotSettings.user
Normal file
2
EndlessVendetta/EndlessVendetta.sln.DotSettings.user
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||||
|
<s:String x:Key="/Default/Environment/Highlighting/HighlightingSourceSnapshotLocation/@EntryValue">C:\Users\Rafal\AppData\Local\JetBrains\Rider2023.3\resharper-host\temp\Rider\vAny\CoverageData\_EndlessVendetta.-1253833435\Snapshot\snapshot.utdcvr</s:String></wpf:ResourceDictionary>
|
@ -13,14 +13,58 @@ ANPC_Manager::ANPC_Manager()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ANPC_Manager::SpawnNPC_Stations()
|
||||||
|
{
|
||||||
|
if (NPC_StationClasses.IsEmpty()) return;
|
||||||
|
|
||||||
|
FRotator DefaultRot = FRotator(0, 0, 0);
|
||||||
|
int StationClassIndex = 0;
|
||||||
|
for (FVector StationPoint : StationPoints)
|
||||||
|
{
|
||||||
|
FVector StationPointWorldLocation = StationPoint + GetActorLocation();
|
||||||
|
ANPC_Station* NPC_Station = GetWorld()->SpawnActor<ANPC_Station>(NPC_StationClasses[StationClassIndex], StationPointWorldLocation, DefaultRot);
|
||||||
|
if (IsValid(NPC_Station)) NPC_Stations.Add(NPC_Station);
|
||||||
|
StationClassIndex++;
|
||||||
|
if (StationClassIndex >= NPC_StationClasses.Num())
|
||||||
|
{
|
||||||
|
StationClassIndex = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ANPC_Manager::SpawnNPC_Walkers()
|
||||||
|
{
|
||||||
|
if (NPC_WalkerClasses.IsEmpty()) return;
|
||||||
|
|
||||||
|
for (TSubclassOf<ANPC_WalkerClass> NPC_Walker : NPC_WalkerClasses)
|
||||||
|
{
|
||||||
|
FTransform WalkersSpawnTransform = NPC_Walker->GetDefaultObject<ANPC_WalkerClass>()->SpawnTransform;
|
||||||
|
FVector Loc = WalkersSpawnTransform.GetLocation();
|
||||||
|
FRotator Rot = WalkersSpawnTransform.GetRotation().Rotator();
|
||||||
|
ANPC_WalkerClass* SpawnedWalker = GetWorld()->SpawnActor<ANPC_WalkerClass>(NPC_Walker, Loc, Rot);
|
||||||
|
NPC_Walkers.Add(SpawnedWalker);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ANPC_Manager::UpdateNPC_Stations()
|
void ANPC_Manager::UpdateNPC_Stations()
|
||||||
{
|
{
|
||||||
for (ANPC_Station* NPC_Station : NPC_Stations)
|
for (ANPC_Station* NPC_Station : NPC_Stations)
|
||||||
{
|
{
|
||||||
|
if (!IsValid(NPC_Station)) continue;
|
||||||
FVector PlayersLoc = PlayersActor->GetActorLocation();
|
FVector PlayersLoc = PlayersActor->GetActorLocation();
|
||||||
FVector StationLoc = NPC_Station->GetActorLocation();
|
FVector StationLoc = NPC_Station->GetActorLocation();
|
||||||
float Distance = FVector::Distance(PlayersLoc, StationLoc);
|
float Distance = FVector::Distance(PlayersLoc, StationLoc);
|
||||||
Distance > NPC_StationRenderDistance ? NPC_Station->DisableStation() : NPC_Station->EnableStation();
|
Distance > NPC_RenderDistance ? NPC_Station->DisableStation() : NPC_Station->EnableStation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ANPC_Manager::UpdateNPC_Walkers()
|
||||||
|
{
|
||||||
|
for (ANPC_WalkerClass* Walker : NPC_Walkers)
|
||||||
|
{
|
||||||
|
if (!IsValid(Walker)) continue;
|
||||||
|
float Distance = FVector::Distance(PlayersActor->GetActorLocation(), Walker->GetActorLocation());
|
||||||
|
Distance <= NPC_RenderDistance ? Walker->EnableNPC() : Walker->DisableNPC();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,22 +79,8 @@ void ANPC_Manager::BeginPlay()
|
|||||||
SetActorTickEnabled(false);
|
SetActorTickEnabled(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
SpawnNPC_Stations();
|
||||||
if (NPC_StationClasses.IsEmpty()) return;
|
SpawnNPC_Walkers();
|
||||||
|
|
||||||
FRotator DefaultRot = FRotator(0, 0, 0);
|
|
||||||
int StationClassIndex = 0;
|
|
||||||
for (FVector StationPoint : StationPoints)
|
|
||||||
{
|
|
||||||
FVector StationPointWorldLocation = StationPoint + GetActorLocation();
|
|
||||||
ANPC_Station* NPC_Station = GetWorld()->SpawnActor<ANPC_Station>(NPC_StationClasses[StationClassIndex], StationPointWorldLocation, DefaultRot);
|
|
||||||
if (IsValid(NPC_Station)) NPC_Stations.Add(NPC_Station);
|
|
||||||
StationClassIndex++;
|
|
||||||
if (StationClassIndex >= NPC_StationClasses.Num())
|
|
||||||
{
|
|
||||||
StationClassIndex = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SetActorTickInterval(1);
|
SetActorTickInterval(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,5 +89,6 @@ void ANPC_Manager::Tick(float DeltaTime)
|
|||||||
{
|
{
|
||||||
Super::Tick(DeltaTime);
|
Super::Tick(DeltaTime);
|
||||||
UpdateNPC_Stations();
|
UpdateNPC_Stations();
|
||||||
|
UpdateNPC_Walkers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#include "CoreMinimal.h"
|
#include "CoreMinimal.h"
|
||||||
#include "NPC_Station.h"
|
#include "NPC_Station.h"
|
||||||
|
#include "NPC_WalkerClass.h"
|
||||||
#include "GameFramework/Actor.h"
|
#include "GameFramework/Actor.h"
|
||||||
#include "NPC_Manager.generated.h"
|
#include "NPC_Manager.generated.h"
|
||||||
|
|
||||||
@ -20,13 +21,29 @@ class ENDLESSVENDETTA_API ANPC_Manager : public AActor
|
|||||||
|
|
||||||
// How far can the station be from the player before it's diabled
|
// How far can the station be from the player before it's diabled
|
||||||
UPROPERTY(EditDefaultsOnly, Category = "NPC")
|
UPROPERTY(EditDefaultsOnly, Category = "NPC")
|
||||||
float NPC_StationRenderDistance = 5000;
|
float NPC_RenderDistance = 6000;
|
||||||
|
|
||||||
// references to All Spawned NPC Stations
|
// references to All Spawned NPC Stations
|
||||||
TArray<ANPC_Station*> NPC_Stations;
|
TArray<ANPC_Station*> NPC_Stations;
|
||||||
|
|
||||||
|
// Used for Spawning walking NPCs
|
||||||
|
UPROPERTY(EditDefaultsOnly, Category = "NPC")
|
||||||
|
TArray<TSubclassOf<ANPC_WalkerClass>> NPC_WalkerClasses;
|
||||||
|
|
||||||
|
// Reference to Walking NPCs
|
||||||
|
TArray<ANPC_WalkerClass*> NPC_Walkers;
|
||||||
|
|
||||||
|
// Spawn NPC Stations
|
||||||
|
void SpawnNPC_Stations();
|
||||||
|
|
||||||
|
// Spawn NPC Walkers
|
||||||
|
void SpawnNPC_Walkers();
|
||||||
|
|
||||||
// Dynamically Enables/Disables Stations based on distance to player
|
// Dynamically Enables/Disables Stations based on distance to player
|
||||||
void UpdateNPC_Stations();
|
void UpdateNPC_Stations();
|
||||||
|
|
||||||
|
// Dynamically Enables/Disables Walking NPCs based on distance to player
|
||||||
|
void UpdateNPC_Walkers();
|
||||||
protected:
|
protected:
|
||||||
// Spawn points for NPC Stations
|
// Spawn points for NPC Stations
|
||||||
UPROPERTY(EditAnywhere, Category = "NPC", meta = (MakeEditWidget = "true"))
|
UPROPERTY(EditAnywhere, Category = "NPC", meta = (MakeEditWidget = "true"))
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "NPC_WalkerClass.h"
|
||||||
|
|
||||||
|
// Sets default values
|
||||||
|
ANPC_WalkerClass::ANPC_WalkerClass()
|
||||||
|
{
|
||||||
|
// Set this character to call Tick() every frame. You can turn this off to improve performance if you don't need it.
|
||||||
|
PrimaryActorTick.bCanEverTick = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
FVector ANPC_WalkerClass::UpdateWalkingTarget()
|
||||||
|
{
|
||||||
|
int BoundsCheck = WalkingSpotIndex + Polarity;
|
||||||
|
if (BoundsCheck < 0 || BoundsCheck >= WalkingSpots.Num()) Polarity *= -1;
|
||||||
|
WalkingSpotIndex += Polarity;
|
||||||
|
return WalkingSpots[WalkingSpotIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
void ANPC_WalkerClass::EnableNPC()
|
||||||
|
{
|
||||||
|
if (bIsEnabled) return;
|
||||||
|
GetRootComponent()->SetVisibility(true, true);
|
||||||
|
bIsEnabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ANPC_WalkerClass::DisableNPC()
|
||||||
|
{
|
||||||
|
if (!bIsEnabled) return;
|
||||||
|
GetRootComponent()->SetVisibility(false, true);
|
||||||
|
bIsEnabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
36
EndlessVendetta/Source/EndlessVendetta/NPC/NPC_WalkerClass.h
Normal file
36
EndlessVendetta/Source/EndlessVendetta/NPC/NPC_WalkerClass.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "GameFramework/Character.h"
|
||||||
|
#include "NPC_WalkerClass.generated.h"
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class ENDLESSVENDETTA_API ANPC_WalkerClass : public ACharacter
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
int WalkingSpotIndex = 0;
|
||||||
|
int Polarity = 1;
|
||||||
|
bool bIsEnabled = true;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
UPROPERTY(VisibleAnywhere, Category = "NPC", meta = (MakeEditWidget = "true"))
|
||||||
|
TArray<FVector> WalkingSpots;
|
||||||
|
|
||||||
|
public:
|
||||||
|
UPROPERTY(EditDefaultsOnly, Category = "NPC")
|
||||||
|
const FTransform SpawnTransform;
|
||||||
|
|
||||||
|
// Sets default values for this character's properties
|
||||||
|
ANPC_WalkerClass();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
FVector UpdateWalkingTarget();
|
||||||
|
|
||||||
|
void EnableNPC();
|
||||||
|
|
||||||
|
void DisableNPC();
|
||||||
|
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user