implementation
This commit is contained in:
@@ -21,10 +21,10 @@ avec le projet).
|
|||||||
|
|
||||||
| Classe | Rôle |
|
| Classe | Rôle |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `UPSVisionConeComponent` | Component à poser sur un personnage : affiche son cône de vision (mesh procédural, bloqué par les murs). |
|
| `UPS_VisionConeComponent` | Component à poser sur un personnage : affiche son cône de vision (mesh procédural, bloqué par les murs). |
|
||||||
| `UPSStrategicDisplayComponent` | Classe de base commune à tous les affichages stratégiques (camp, activation, couleur). Les futurs components en hériteront. |
|
| `UPS_StrategicDisplayComponent` | Classe de base commune à tous les affichages stratégiques (camp, activation, couleur). Les futurs components en hériteront. |
|
||||||
| `UPSStrategicVisionSubsystem` | Subsystem monde : interrupteurs globaux (tout, par catégorie, par camp). |
|
| `UPS_StrategicVisionSubsystem` | Subsystem monde : interrupteurs globaux (tout, par catégorie, par camp). |
|
||||||
| `UPSStrategicVisionSettings` | Réglages projet : couleurs des camps, matériau par défaut. |
|
| `UPS_StrategicVisionSettings` | Réglages projet : couleurs des camps, matériau par défaut. |
|
||||||
|
|
||||||
## Utilisation
|
## Utilisation
|
||||||
|
|
||||||
@@ -50,14 +50,14 @@ Par component :
|
|||||||
|
|
||||||
- `SetDisplayEnabled(bool)` — interrupteur local du component.
|
- `SetDisplayEnabled(bool)` — interrupteur local du component.
|
||||||
|
|
||||||
Globalement, via le subsystem (Blueprint : nœud `Get PSStrategicVisionSubsystem`,
|
Globalement, via le subsystem (Blueprint : nœud `Get PS_StrategicVisionSubsystem`,
|
||||||
ou `UPSStrategicVisionSubsystem::Get(WorldContext)` en C++) :
|
ou `UPS_StrategicVisionSubsystem::Get(WorldContext)` en C++) :
|
||||||
|
|
||||||
- `SetGlobalDisplayEnabled(bool)` — tout l'affichage stratégique (ex : entrée/sortie
|
- `SetGlobalDisplayEnabled(bool)` — tout l'affichage stratégique (ex : entrée/sortie
|
||||||
du mode spectateur ou replay).
|
du mode spectateur ou replay).
|
||||||
- `SetVisionConesEnabled(bool)` — uniquement les cônes de vision.
|
- `SetVisionConesEnabled(bool)` — uniquement les cônes de vision.
|
||||||
- `SetCategoryEnabled(FName, bool)` — par catégorie (pour les futurs components).
|
- `SetCategoryEnabled(FName, bool)` — par catégorie (pour les futurs components).
|
||||||
- `SetTeamEnabled(EPSStrategicTeam, bool)` — par camp (ex : ne montrer que les ennemis).
|
- `SetTeamEnabled(EPS_StrategicTeam, bool)` — par camp (ex : ne montrer que les ennemis).
|
||||||
|
|
||||||
Un component n'est visible que si son interrupteur local ET les interrupteurs
|
Un component n'est visible que si son interrupteur local ET les interrupteurs
|
||||||
globaux le permettent. Quand un cône est masqué, il ne fait plus aucune trace
|
globaux le permettent. Quand un cône est masqué, il ne fait plus aucune trace
|
||||||
@@ -98,4 +98,4 @@ déjà double face).
|
|||||||
|
|
||||||
- [x] Cône de vision bloqué par les obstacles
|
- [x] Cône de vision bloqué par les obstacles
|
||||||
- [ ] Autres affichages stratégiques (trajectoires, zones d'alerte, ...) sous forme
|
- [ ] Autres affichages stratégiques (trajectoires, zones d'alerte, ...) sous forme
|
||||||
de components héritant de `UPSStrategicDisplayComponent`
|
de components héritant de `UPS_StrategicDisplayComponent`
|
||||||
|
|||||||
@@ -1,97 +0,0 @@
|
|||||||
// Copyright (c) 2026 j.foucher. All rights reserved.
|
|
||||||
|
|
||||||
#include "PSStrategicDisplayComponent.h"
|
|
||||||
|
|
||||||
#include "Engine/World.h"
|
|
||||||
#include "PSStrategicVisionSettings.h"
|
|
||||||
#include "PSStrategicVisionSubsystem.h"
|
|
||||||
|
|
||||||
UPSStrategicDisplayComponent::UPSStrategicDisplayComponent()
|
|
||||||
{
|
|
||||||
PrimaryComponentTick.bCanEverTick = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UPSStrategicDisplayComponent::SetTeam(EPSStrategicTeam NewTeam)
|
|
||||||
{
|
|
||||||
if (Team != NewTeam)
|
|
||||||
{
|
|
||||||
Team = NewTeam;
|
|
||||||
RefreshDisplayState();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void UPSStrategicDisplayComponent::SetDisplayEnabled(bool bEnabled)
|
|
||||||
{
|
|
||||||
if (bDisplayEnabled != bEnabled)
|
|
||||||
{
|
|
||||||
bDisplayEnabled = bEnabled;
|
|
||||||
RefreshDisplayState();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UPSStrategicDisplayComponent::IsDisplayVisible() const
|
|
||||||
{
|
|
||||||
if (!bDisplayEnabled)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (const UWorld* World = GetWorld())
|
|
||||||
{
|
|
||||||
if (World->IsGameWorld())
|
|
||||||
{
|
|
||||||
if (const UPSStrategicVisionSubsystem* Subsystem = World->GetSubsystem<UPSStrategicVisionSubsystem>())
|
|
||||||
{
|
|
||||||
return Subsystem->ShouldDisplay(GetDisplayCategory(), Team);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Monde editeur (preview) : on suit uniquement l'activation locale.
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
FLinearColor UPSStrategicDisplayComponent::GetTeamColor() const
|
|
||||||
{
|
|
||||||
return GetDefault<UPSStrategicVisionSettings>()->GetTeamColor(Team);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UPSStrategicDisplayComponent::BeginPlay()
|
|
||||||
{
|
|
||||||
Super::BeginPlay();
|
|
||||||
|
|
||||||
if (UPSStrategicVisionSubsystem* Subsystem = UPSStrategicVisionSubsystem::Get(this))
|
|
||||||
{
|
|
||||||
Subsystem->OnDisplayStateChanged.AddUniqueDynamic(this, &UPSStrategicDisplayComponent::HandleGlobalDisplayStateChanged);
|
|
||||||
}
|
|
||||||
|
|
||||||
RefreshDisplayState();
|
|
||||||
}
|
|
||||||
|
|
||||||
void UPSStrategicDisplayComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)
|
|
||||||
{
|
|
||||||
if (UPSStrategicVisionSubsystem* Subsystem = UPSStrategicVisionSubsystem::Get(this))
|
|
||||||
{
|
|
||||||
Subsystem->OnDisplayStateChanged.RemoveDynamic(this, &UPSStrategicDisplayComponent::HandleGlobalDisplayStateChanged);
|
|
||||||
}
|
|
||||||
|
|
||||||
Super::EndPlay(EndPlayReason);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if WITH_EDITOR
|
|
||||||
void UPSStrategicDisplayComponent::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
|
|
||||||
{
|
|
||||||
Super::PostEditChangeProperty(PropertyChangedEvent);
|
|
||||||
RefreshDisplayState();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void UPSStrategicDisplayComponent::RefreshDisplayState()
|
|
||||||
{
|
|
||||||
OnDisplayStateChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
void UPSStrategicDisplayComponent::HandleGlobalDisplayStateChanged()
|
|
||||||
{
|
|
||||||
RefreshDisplayState();
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
// Copyright (c) 2026 j.foucher. All rights reserved.
|
|
||||||
|
|
||||||
#include "PSStrategicVisionSettings.h"
|
|
||||||
|
|
||||||
#include "Materials/MaterialInterface.h"
|
|
||||||
|
|
||||||
UPSStrategicVisionSettings::UPSStrategicVisionSettings()
|
|
||||||
{
|
|
||||||
TeamColors.Add(EPSStrategicTeam::Player, FLinearColor(0.05f, 0.45f, 1.0f));
|
|
||||||
TeamColors.Add(EPSStrategicTeam::Ally, FLinearColor(0.1f, 0.9f, 0.5f));
|
|
||||||
TeamColors.Add(EPSStrategicTeam::Enemy, FLinearColor(1.0f, 0.12f, 0.08f));
|
|
||||||
TeamColors.Add(EPSStrategicTeam::Neutral, FLinearColor(0.75f, 0.75f, 0.75f));
|
|
||||||
|
|
||||||
// Materiau optionnel a creer dans le Content du plugin (voir README).
|
|
||||||
DefaultConeMaterial = TSoftObjectPtr<UMaterialInterface>(
|
|
||||||
FSoftObjectPath(TEXT("/PS_StrategicVision/Materials/M_VisionCone.M_VisionCone")));
|
|
||||||
}
|
|
||||||
|
|
||||||
FLinearColor UPSStrategicVisionSettings::GetTeamColor(EPSStrategicTeam Team) const
|
|
||||||
{
|
|
||||||
if (const FLinearColor* Color = TeamColors.Find(Team))
|
|
||||||
{
|
|
||||||
return *Color;
|
|
||||||
}
|
|
||||||
return FLinearColor::White;
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
// Copyright (c) 2026 j.foucher. All rights reserved.
|
|
||||||
|
|
||||||
#include "PSStrategicVisionTypes.h"
|
|
||||||
|
|
||||||
const FName FPSStrategicDisplayCategories::VisionCone(TEXT("VisionCone"));
|
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
// Copyright (c) 2026 j.foucher. All rights reserved.
|
||||||
|
|
||||||
|
#include "PS_StrategicDisplayComponent.h"
|
||||||
|
|
||||||
|
#include "Engine/World.h"
|
||||||
|
#include "PS_StrategicVisionSettings.h"
|
||||||
|
#include "PS_StrategicVisionSubsystem.h"
|
||||||
|
|
||||||
|
UPS_StrategicDisplayComponent::UPS_StrategicDisplayComponent()
|
||||||
|
{
|
||||||
|
PrimaryComponentTick.bCanEverTick = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UPS_StrategicDisplayComponent::SetTeam(EPS_StrategicTeam NewTeam)
|
||||||
|
{
|
||||||
|
if (Team != NewTeam)
|
||||||
|
{
|
||||||
|
Team = NewTeam;
|
||||||
|
RefreshDisplayState();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UPS_StrategicDisplayComponent::SetDisplayEnabled(bool bEnabled)
|
||||||
|
{
|
||||||
|
if (bDisplayEnabled != bEnabled)
|
||||||
|
{
|
||||||
|
bDisplayEnabled = bEnabled;
|
||||||
|
RefreshDisplayState();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UPS_StrategicDisplayComponent::IsDisplayVisible() const
|
||||||
|
{
|
||||||
|
if (!bDisplayEnabled)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (const UWorld* World = GetWorld())
|
||||||
|
{
|
||||||
|
if (World->IsGameWorld())
|
||||||
|
{
|
||||||
|
if (const UPS_StrategicVisionSubsystem* Subsystem = World->GetSubsystem<UPS_StrategicVisionSubsystem>())
|
||||||
|
{
|
||||||
|
return Subsystem->ShouldDisplay(GetDisplayCategory(), Team);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Monde editeur (preview) : on suit uniquement l'activation locale.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
FLinearColor UPS_StrategicDisplayComponent::GetTeamColor() const
|
||||||
|
{
|
||||||
|
return GetDefault<UPS_StrategicVisionSettings>()->GetTeamColor(Team);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UPS_StrategicDisplayComponent::BeginPlay()
|
||||||
|
{
|
||||||
|
Super::BeginPlay();
|
||||||
|
|
||||||
|
if (UPS_StrategicVisionSubsystem* Subsystem = UPS_StrategicVisionSubsystem::Get(this))
|
||||||
|
{
|
||||||
|
Subsystem->OnDisplayStateChanged.AddUniqueDynamic(this, &UPS_StrategicDisplayComponent::HandleGlobalDisplayStateChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
RefreshDisplayState();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UPS_StrategicDisplayComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)
|
||||||
|
{
|
||||||
|
if (UPS_StrategicVisionSubsystem* Subsystem = UPS_StrategicVisionSubsystem::Get(this))
|
||||||
|
{
|
||||||
|
Subsystem->OnDisplayStateChanged.RemoveDynamic(this, &UPS_StrategicDisplayComponent::HandleGlobalDisplayStateChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
Super::EndPlay(EndPlayReason);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if WITH_EDITOR
|
||||||
|
void UPS_StrategicDisplayComponent::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
|
||||||
|
{
|
||||||
|
Super::PostEditChangeProperty(PropertyChangedEvent);
|
||||||
|
RefreshDisplayState();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void UPS_StrategicDisplayComponent::RefreshDisplayState()
|
||||||
|
{
|
||||||
|
OnDisplayStateChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UPS_StrategicDisplayComponent::HandleGlobalDisplayStateChanged()
|
||||||
|
{
|
||||||
|
RefreshDisplayState();
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
// Copyright (c) 2026 j.foucher. All rights reserved.
|
||||||
|
|
||||||
|
#include "PS_StrategicVisionSettings.h"
|
||||||
|
|
||||||
|
#include "Materials/MaterialInterface.h"
|
||||||
|
|
||||||
|
UPS_StrategicVisionSettings::UPS_StrategicVisionSettings()
|
||||||
|
{
|
||||||
|
TeamColors.Add(EPS_StrategicTeam::Player, FLinearColor(0.05f, 0.45f, 1.0f));
|
||||||
|
TeamColors.Add(EPS_StrategicTeam::Ally, FLinearColor(0.1f, 0.9f, 0.5f));
|
||||||
|
TeamColors.Add(EPS_StrategicTeam::Enemy, FLinearColor(1.0f, 0.12f, 0.08f));
|
||||||
|
TeamColors.Add(EPS_StrategicTeam::Neutral, FLinearColor(0.75f, 0.75f, 0.75f));
|
||||||
|
|
||||||
|
// Materiau optionnel a creer dans le Content du plugin (voir README).
|
||||||
|
DefaultConeMaterial = TSoftObjectPtr<UMaterialInterface>(
|
||||||
|
FSoftObjectPath(TEXT("/PS_StrategicVision/Materials/M_VisionCone.M_VisionCone")));
|
||||||
|
}
|
||||||
|
|
||||||
|
FLinearColor UPS_StrategicVisionSettings::GetTeamColor(EPS_StrategicTeam Team) const
|
||||||
|
{
|
||||||
|
if (const FLinearColor* Color = TeamColors.Find(Team))
|
||||||
|
{
|
||||||
|
return *Color;
|
||||||
|
}
|
||||||
|
return FLinearColor::White;
|
||||||
|
}
|
||||||
@@ -1,23 +1,23 @@
|
|||||||
// Copyright (c) 2026 j.foucher. All rights reserved.
|
// Copyright (c) 2026 j.foucher. All rights reserved.
|
||||||
|
|
||||||
#include "PSStrategicVisionSubsystem.h"
|
#include "PS_StrategicVisionSubsystem.h"
|
||||||
|
|
||||||
#include "Engine/Engine.h"
|
#include "Engine/Engine.h"
|
||||||
#include "Engine/World.h"
|
#include "Engine/World.h"
|
||||||
|
|
||||||
UPSStrategicVisionSubsystem* UPSStrategicVisionSubsystem::Get(const UObject* WorldContextObject)
|
UPS_StrategicVisionSubsystem* UPS_StrategicVisionSubsystem::Get(const UObject* WorldContextObject)
|
||||||
{
|
{
|
||||||
if (GEngine)
|
if (GEngine)
|
||||||
{
|
{
|
||||||
if (const UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::ReturnNull))
|
if (const UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::ReturnNull))
|
||||||
{
|
{
|
||||||
return World->GetSubsystem<UPSStrategicVisionSubsystem>();
|
return World->GetSubsystem<UPS_StrategicVisionSubsystem>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UPSStrategicVisionSubsystem::SetGlobalDisplayEnabled(bool bEnabled)
|
void UPS_StrategicVisionSubsystem::SetGlobalDisplayEnabled(bool bEnabled)
|
||||||
{
|
{
|
||||||
if (bGlobalEnabled != bEnabled)
|
if (bGlobalEnabled != bEnabled)
|
||||||
{
|
{
|
||||||
@@ -26,7 +26,7 @@ void UPSStrategicVisionSubsystem::SetGlobalDisplayEnabled(bool bEnabled)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UPSStrategicVisionSubsystem::SetCategoryEnabled(FName Category, bool bEnabled)
|
void UPS_StrategicVisionSubsystem::SetCategoryEnabled(FName Category, bool bEnabled)
|
||||||
{
|
{
|
||||||
const bool bChanged = bEnabled ? (DisabledCategories.Remove(Category) > 0) : !DisabledCategories.Contains(Category);
|
const bool bChanged = bEnabled ? (DisabledCategories.Remove(Category) > 0) : !DisabledCategories.Contains(Category);
|
||||||
if (!bEnabled)
|
if (!bEnabled)
|
||||||
@@ -39,7 +39,7 @@ void UPSStrategicVisionSubsystem::SetCategoryEnabled(FName Category, bool bEnabl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UPSStrategicVisionSubsystem::SetTeamEnabled(EPSStrategicTeam Team, bool bEnabled)
|
void UPS_StrategicVisionSubsystem::SetTeamEnabled(EPS_StrategicTeam Team, bool bEnabled)
|
||||||
{
|
{
|
||||||
const bool bChanged = bEnabled ? (DisabledTeams.Remove(Team) > 0) : !DisabledTeams.Contains(Team);
|
const bool bChanged = bEnabled ? (DisabledTeams.Remove(Team) > 0) : !DisabledTeams.Contains(Team);
|
||||||
if (!bEnabled)
|
if (!bEnabled)
|
||||||
@@ -52,7 +52,7 @@ void UPSStrategicVisionSubsystem::SetTeamEnabled(EPSStrategicTeam Team, bool bEn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UPSStrategicVisionSubsystem::NotifyStateChanged()
|
void UPS_StrategicVisionSubsystem::NotifyStateChanged()
|
||||||
{
|
{
|
||||||
OnDisplayStateChanged.Broadcast();
|
OnDisplayStateChanged.Broadcast();
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
// Copyright (c) 2026 j.foucher. All rights reserved.
|
||||||
|
|
||||||
|
#include "PS_StrategicVisionTypes.h"
|
||||||
|
|
||||||
|
const FName FPS_StrategicDisplayCategories::VisionCone(TEXT("VisionCone"));
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
// Copyright (c) 2026 j.foucher. All rights reserved.
|
// Copyright (c) 2026 j.foucher. All rights reserved.
|
||||||
|
|
||||||
#include "PSVisionConeComponent.h"
|
#include "PS_VisionConeComponent.h"
|
||||||
|
|
||||||
#include "CollisionQueryParams.h"
|
#include "CollisionQueryParams.h"
|
||||||
#include "Engine/HitResult.h"
|
#include "Engine/HitResult.h"
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
#include "Materials/MaterialInstanceDynamic.h"
|
#include "Materials/MaterialInstanceDynamic.h"
|
||||||
#include "Materials/MaterialInterface.h"
|
#include "Materials/MaterialInterface.h"
|
||||||
#include "ProceduralMeshComponent.h"
|
#include "ProceduralMeshComponent.h"
|
||||||
#include "PSStrategicVisionSettings.h"
|
#include "PS_StrategicVisionSettings.h"
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
@@ -22,7 +22,7 @@ namespace
|
|||||||
const FName GOpacityParamName(TEXT("Opacity"));
|
const FName GOpacityParamName(TEXT("Opacity"));
|
||||||
}
|
}
|
||||||
|
|
||||||
UPSVisionConeComponent::UPSVisionConeComponent()
|
UPS_VisionConeComponent::UPS_VisionConeComponent()
|
||||||
{
|
{
|
||||||
PrimaryComponentTick.bCanEverTick = true;
|
PrimaryComponentTick.bCanEverTick = true;
|
||||||
PrimaryComponentTick.bStartWithTickEnabled = true;
|
PrimaryComponentTick.bStartWithTickEnabled = true;
|
||||||
@@ -31,7 +31,7 @@ UPSVisionConeComponent::UPSVisionConeComponent()
|
|||||||
bTickInEditor = true;
|
bTickInEditor = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UPSVisionConeComponent::OnRegister()
|
void UPS_VisionConeComponent::OnRegister()
|
||||||
{
|
{
|
||||||
Super::OnRegister();
|
Super::OnRegister();
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ void UPSVisionConeComponent::OnRegister()
|
|||||||
ApplyTeamColor();
|
ApplyTeamColor();
|
||||||
}
|
}
|
||||||
|
|
||||||
void UPSVisionConeComponent::OnComponentDestroyed(bool bDestroyingHierarchy)
|
void UPS_VisionConeComponent::OnComponentDestroyed(bool bDestroyingHierarchy)
|
||||||
{
|
{
|
||||||
if (ConeMesh)
|
if (ConeMesh)
|
||||||
{
|
{
|
||||||
@@ -51,13 +51,13 @@ void UPSVisionConeComponent::OnComponentDestroyed(bool bDestroyingHierarchy)
|
|||||||
Super::OnComponentDestroyed(bDestroyingHierarchy);
|
Super::OnComponentDestroyed(bDestroyingHierarchy);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UPSVisionConeComponent::BeginPlay()
|
void UPS_VisionConeComponent::BeginPlay()
|
||||||
{
|
{
|
||||||
Super::BeginPlay();
|
Super::BeginPlay();
|
||||||
SetComponentTickInterval(UpdateInterval);
|
SetComponentTickInterval(UpdateInterval);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UPSVisionConeComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
|
void UPS_VisionConeComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
|
||||||
{
|
{
|
||||||
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
|
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ void UPSVisionConeComponent::TickComponent(float DeltaTime, ELevelTick TickType,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UPSVisionConeComponent::OnDisplayStateChanged()
|
void UPS_VisionConeComponent::OnDisplayStateChanged()
|
||||||
{
|
{
|
||||||
const bool bShouldDisplay = IsDisplayVisible();
|
const bool bShouldDisplay = IsDisplayVisible();
|
||||||
|
|
||||||
@@ -88,7 +88,7 @@ void UPSVisionConeComponent::OnDisplayStateChanged()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UPSVisionConeComponent::EnsureConeMesh()
|
void UPS_VisionConeComponent::EnsureConeMesh()
|
||||||
{
|
{
|
||||||
if (ConeMesh || !GetWorld())
|
if (ConeMesh || !GetWorld())
|
||||||
{
|
{
|
||||||
@@ -109,7 +109,7 @@ void UPSVisionConeComponent::EnsureConeMesh()
|
|||||||
ConeMesh->SetWorldRotation(FQuat::Identity);
|
ConeMesh->SetWorldRotation(FQuat::Identity);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UPSVisionConeComponent::EnsureMaterial()
|
void UPS_VisionConeComponent::EnsureMaterial()
|
||||||
{
|
{
|
||||||
if (!ConeMesh)
|
if (!ConeMesh)
|
||||||
{
|
{
|
||||||
@@ -120,7 +120,7 @@ void UPSVisionConeComponent::EnsureMaterial()
|
|||||||
|
|
||||||
if (!BaseMaterial)
|
if (!BaseMaterial)
|
||||||
{
|
{
|
||||||
BaseMaterial = GetDefault<UPSStrategicVisionSettings>()->DefaultConeMaterial.LoadSynchronous();
|
BaseMaterial = GetDefault<UPS_StrategicVisionSettings>()->DefaultConeMaterial.LoadSynchronous();
|
||||||
}
|
}
|
||||||
if (!BaseMaterial)
|
if (!BaseMaterial)
|
||||||
{
|
{
|
||||||
@@ -142,7 +142,7 @@ void UPSVisionConeComponent::EnsureMaterial()
|
|||||||
ConeMesh->SetMaterial(0, ConeMID);
|
ConeMesh->SetMaterial(0, ConeMID);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UPSVisionConeComponent::ApplyTeamColor()
|
void UPS_VisionConeComponent::ApplyTeamColor()
|
||||||
{
|
{
|
||||||
if (!ConeMID)
|
if (!ConeMID)
|
||||||
{
|
{
|
||||||
@@ -155,7 +155,7 @@ void UPSVisionConeComponent::ApplyTeamColor()
|
|||||||
ConeMID->SetScalarParameterValue(GOpacityParamName, Opacity);
|
ConeMID->SetScalarParameterValue(GOpacityParamName, Opacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UPSVisionConeComponent::RebuildCone()
|
void UPS_VisionConeComponent::RebuildCone()
|
||||||
{
|
{
|
||||||
UWorld* World = GetWorld();
|
UWorld* World = GetWorld();
|
||||||
if (!World || !ConeMesh)
|
if (!World || !ConeMesh)
|
||||||
@@ -171,7 +171,7 @@ void UPSVisionConeComponent::RebuildCone()
|
|||||||
: GetForwardVector();
|
: GetForwardVector();
|
||||||
const FVector Up = bFlattenOnGround ? FVector::UpVector : GetUpVector();
|
const FVector Up = bFlattenOnGround ? FVector::UpVector : GetUpVector();
|
||||||
|
|
||||||
FCollisionQueryParams QueryParams(TEXT("PSVisionCone"), bTraceComplex);
|
FCollisionQueryParams QueryParams(TEXT("PS_VisionCone"), bTraceComplex);
|
||||||
if (const AActor* Owner = GetOwner())
|
if (const AActor* Owner = GetOwner())
|
||||||
{
|
{
|
||||||
QueryParams.AddIgnoredActor(Owner);
|
QueryParams.AddIgnoredActor(Owner);
|
||||||
@@ -4,30 +4,30 @@
|
|||||||
|
|
||||||
#include "CoreMinimal.h"
|
#include "CoreMinimal.h"
|
||||||
#include "Components/SceneComponent.h"
|
#include "Components/SceneComponent.h"
|
||||||
#include "PSStrategicVisionTypes.h"
|
#include "PS_StrategicVisionTypes.h"
|
||||||
#include "PSStrategicDisplayComponent.generated.h"
|
#include "PS_StrategicDisplayComponent.generated.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Classe de base des affichages strategiques poses sur les personnages
|
* Classe de base des affichages strategiques poses sur les personnages
|
||||||
* (cone de vision, et autres visualisations a venir).
|
* (cone de vision, et autres visualisations a venir).
|
||||||
*
|
*
|
||||||
* Gere le camp (couleur), l'activation locale du component et la
|
* Gere le camp (couleur), l'activation locale du component et la
|
||||||
* synchronisation avec l'etat global du UPSStrategicVisionSubsystem.
|
* synchronisation avec l'etat global du UPS_StrategicVisionSubsystem.
|
||||||
*/
|
*/
|
||||||
UCLASS(Abstract, ClassGroup = (PSStrategicVision), HideCategories = (Physics, Collision, Mobility))
|
UCLASS(Abstract, ClassGroup = (PS_StrategicVision), HideCategories = (Physics, Collision, Mobility))
|
||||||
class PS_STRATEGICVISION_API UPSStrategicDisplayComponent : public USceneComponent
|
class PS_STRATEGICVISION_API UPS_StrategicDisplayComponent : public USceneComponent
|
||||||
{
|
{
|
||||||
GENERATED_BODY()
|
GENERATED_BODY()
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UPSStrategicDisplayComponent();
|
UPS_StrategicDisplayComponent();
|
||||||
|
|
||||||
/** Change le camp (met a jour la couleur de l'affichage). */
|
/** Change le camp (met a jour la couleur de l'affichage). */
|
||||||
UFUNCTION(BlueprintCallable, Category = "Strategic Display")
|
UFUNCTION(BlueprintCallable, Category = "Strategic Display")
|
||||||
void SetTeam(EPSStrategicTeam NewTeam);
|
void SetTeam(EPS_StrategicTeam NewTeam);
|
||||||
|
|
||||||
UFUNCTION(BlueprintPure, Category = "Strategic Display")
|
UFUNCTION(BlueprintPure, Category = "Strategic Display")
|
||||||
EPSStrategicTeam GetTeam() const { return Team; }
|
EPS_StrategicTeam GetTeam() const { return Team; }
|
||||||
|
|
||||||
/** Active / desactive cet affichage precis (independamment de l'etat global). */
|
/** Active / desactive cet affichage precis (independamment de l'etat global). */
|
||||||
UFUNCTION(BlueprintCallable, Category = "Strategic Display")
|
UFUNCTION(BlueprintCallable, Category = "Strategic Display")
|
||||||
@@ -44,7 +44,7 @@ public:
|
|||||||
UFUNCTION(BlueprintPure, Category = "Strategic Display")
|
UFUNCTION(BlueprintPure, Category = "Strategic Display")
|
||||||
FLinearColor GetTeamColor() const;
|
FLinearColor GetTeamColor() const;
|
||||||
|
|
||||||
/** Categorie declaree par chaque type d'affichage (cf. FPSStrategicDisplayCategories). */
|
/** Categorie declaree par chaque type d'affichage (cf. FPS_StrategicDisplayCategories). */
|
||||||
virtual FName GetDisplayCategory() const { return NAME_None; }
|
virtual FName GetDisplayCategory() const { return NAME_None; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -63,7 +63,7 @@ protected:
|
|||||||
|
|
||||||
/** Camp du personnage porteur, determine la couleur de l'affichage. */
|
/** Camp du personnage porteur, determine la couleur de l'affichage. */
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Strategic Display")
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Strategic Display")
|
||||||
EPSStrategicTeam Team = EPSStrategicTeam::Enemy;
|
EPS_StrategicTeam Team = EPS_StrategicTeam::Enemy;
|
||||||
|
|
||||||
/** Etat d'activation local de cet affichage. */
|
/** Etat d'activation local de cet affichage. */
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Strategic Display")
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Strategic Display")
|
||||||
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
#include "CoreMinimal.h"
|
#include "CoreMinimal.h"
|
||||||
#include "Engine/DeveloperSettings.h"
|
#include "Engine/DeveloperSettings.h"
|
||||||
#include "PSStrategicVisionTypes.h"
|
#include "PS_StrategicVisionTypes.h"
|
||||||
#include "PSStrategicVisionSettings.generated.h"
|
#include "PS_StrategicVisionSettings.generated.h"
|
||||||
|
|
||||||
class UMaterialInterface;
|
class UMaterialInterface;
|
||||||
|
|
||||||
@@ -14,18 +14,18 @@ class UMaterialInterface;
|
|||||||
* Accessibles dans Project Settings > Plugins > PS Strategic Vision.
|
* Accessibles dans Project Settings > Plugins > PS Strategic Vision.
|
||||||
*/
|
*/
|
||||||
UCLASS(Config = Game, DefaultConfig, meta = (DisplayName = "PS Strategic Vision"))
|
UCLASS(Config = Game, DefaultConfig, meta = (DisplayName = "PS Strategic Vision"))
|
||||||
class PS_STRATEGICVISION_API UPSStrategicVisionSettings : public UDeveloperSettings
|
class PS_STRATEGICVISION_API UPS_StrategicVisionSettings : public UDeveloperSettings
|
||||||
{
|
{
|
||||||
GENERATED_BODY()
|
GENERATED_BODY()
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UPSStrategicVisionSettings();
|
UPS_StrategicVisionSettings();
|
||||||
|
|
||||||
virtual FName GetCategoryName() const override { return TEXT("Plugins"); }
|
virtual FName GetCategoryName() const override { return TEXT("Plugins"); }
|
||||||
|
|
||||||
/** Couleur associee a chaque camp. */
|
/** Couleur associee a chaque camp. */
|
||||||
UPROPERTY(EditAnywhere, Config, BlueprintReadOnly, Category = "Teams")
|
UPROPERTY(EditAnywhere, Config, BlueprintReadOnly, Category = "Teams")
|
||||||
TMap<EPSStrategicTeam, FLinearColor> TeamColors;
|
TMap<EPS_StrategicTeam, FLinearColor> TeamColors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Materiau par defaut des cones de vision. La couleur est appliquee via le
|
* Materiau par defaut des cones de vision. La couleur est appliquee via le
|
||||||
@@ -38,5 +38,5 @@ public:
|
|||||||
|
|
||||||
/** Couleur du camp demande (blanc si non configuree). */
|
/** Couleur du camp demande (blanc si non configuree). */
|
||||||
UFUNCTION(BlueprintPure, Category = "PS Strategic Vision")
|
UFUNCTION(BlueprintPure, Category = "PS Strategic Vision")
|
||||||
FLinearColor GetTeamColor(EPSStrategicTeam Team) const;
|
FLinearColor GetTeamColor(EPS_StrategicTeam Team) const;
|
||||||
};
|
};
|
||||||
@@ -4,26 +4,26 @@
|
|||||||
|
|
||||||
#include "CoreMinimal.h"
|
#include "CoreMinimal.h"
|
||||||
#include "Subsystems/WorldSubsystem.h"
|
#include "Subsystems/WorldSubsystem.h"
|
||||||
#include "PSStrategicVisionTypes.h"
|
#include "PS_StrategicVisionTypes.h"
|
||||||
#include "PSStrategicVisionSubsystem.generated.h"
|
#include "PS_StrategicVisionSubsystem.generated.h"
|
||||||
|
|
||||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FPSStrategicDisplayStateChanged);
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FPS_StrategicDisplayStateChanged);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Subsystem monde pilotant l'affichage strategique global.
|
* Subsystem monde pilotant l'affichage strategique global.
|
||||||
* Permet d'activer / desactiver tous les affichages, une categorie (ex : cones
|
* Permet d'activer / desactiver tous les affichages, une categorie (ex : cones
|
||||||
* de vision) ou un camp entier selon l'etat de jeu (vue spectateur, replay...).
|
* de vision) ou un camp entier selon l'etat de jeu (vue spectateur, replay...).
|
||||||
* Tous les UPSStrategicDisplayComponent s'y abonnent automatiquement.
|
* Tous les UPS_StrategicDisplayComponent s'y abonnent automatiquement.
|
||||||
*/
|
*/
|
||||||
UCLASS()
|
UCLASS()
|
||||||
class PS_STRATEGICVISION_API UPSStrategicVisionSubsystem : public UWorldSubsystem
|
class PS_STRATEGICVISION_API UPS_StrategicVisionSubsystem : public UWorldSubsystem
|
||||||
{
|
{
|
||||||
GENERATED_BODY()
|
GENERATED_BODY()
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** Raccourci d'acces au subsystem depuis n'importe quel contexte monde. */
|
/** Raccourci d'acces au subsystem depuis n'importe quel contexte monde. */
|
||||||
UFUNCTION(BlueprintPure, Category = "PS Strategic Vision", meta = (WorldContext = "WorldContextObject"))
|
UFUNCTION(BlueprintPure, Category = "PS Strategic Vision", meta = (WorldContext = "WorldContextObject"))
|
||||||
static UPSStrategicVisionSubsystem* Get(const UObject* WorldContextObject);
|
static UPS_StrategicVisionSubsystem* Get(const UObject* WorldContextObject);
|
||||||
|
|
||||||
/** Interrupteur general de tous les affichages strategiques. */
|
/** Interrupteur general de tous les affichages strategiques. */
|
||||||
UFUNCTION(BlueprintCallable, Category = "PS Strategic Vision")
|
UFUNCTION(BlueprintCallable, Category = "PS Strategic Vision")
|
||||||
@@ -41,32 +41,32 @@ public:
|
|||||||
|
|
||||||
/** Active / desactive les affichages d'un camp (ex : ne montrer que les ennemis). */
|
/** Active / desactive les affichages d'un camp (ex : ne montrer que les ennemis). */
|
||||||
UFUNCTION(BlueprintCallable, Category = "PS Strategic Vision")
|
UFUNCTION(BlueprintCallable, Category = "PS Strategic Vision")
|
||||||
void SetTeamEnabled(EPSStrategicTeam Team, bool bEnabled);
|
void SetTeamEnabled(EPS_StrategicTeam Team, bool bEnabled);
|
||||||
|
|
||||||
UFUNCTION(BlueprintPure, Category = "PS Strategic Vision")
|
UFUNCTION(BlueprintPure, Category = "PS Strategic Vision")
|
||||||
bool IsTeamEnabled(EPSStrategicTeam Team) const { return !DisabledTeams.Contains(Team); }
|
bool IsTeamEnabled(EPS_StrategicTeam Team) const { return !DisabledTeams.Contains(Team); }
|
||||||
|
|
||||||
/** Raccourci : active / desactive tous les cones de vision. */
|
/** Raccourci : active / desactive tous les cones de vision. */
|
||||||
UFUNCTION(BlueprintCallable, Category = "PS Strategic Vision|Vision Cone")
|
UFUNCTION(BlueprintCallable, Category = "PS Strategic Vision|Vision Cone")
|
||||||
void SetVisionConesEnabled(bool bEnabled) { SetCategoryEnabled(FPSStrategicDisplayCategories::VisionCone, bEnabled); }
|
void SetVisionConesEnabled(bool bEnabled) { SetCategoryEnabled(FPS_StrategicDisplayCategories::VisionCone, bEnabled); }
|
||||||
|
|
||||||
UFUNCTION(BlueprintPure, Category = "PS Strategic Vision|Vision Cone")
|
UFUNCTION(BlueprintPure, Category = "PS Strategic Vision|Vision Cone")
|
||||||
bool AreVisionConesEnabled() const { return IsCategoryEnabled(FPSStrategicDisplayCategories::VisionCone); }
|
bool AreVisionConesEnabled() const { return IsCategoryEnabled(FPS_StrategicDisplayCategories::VisionCone); }
|
||||||
|
|
||||||
/** Etat combine utilise par les components pour savoir s'ils doivent s'afficher. */
|
/** Etat combine utilise par les components pour savoir s'ils doivent s'afficher. */
|
||||||
bool ShouldDisplay(FName Category, EPSStrategicTeam Team) const
|
bool ShouldDisplay(FName Category, EPS_StrategicTeam Team) const
|
||||||
{
|
{
|
||||||
return bGlobalEnabled && IsCategoryEnabled(Category) && IsTeamEnabled(Team);
|
return bGlobalEnabled && IsCategoryEnabled(Category) && IsTeamEnabled(Team);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Notifie a chaque changement d'etat global (les components s'y abonnent). */
|
/** Notifie a chaque changement d'etat global (les components s'y abonnent). */
|
||||||
UPROPERTY(BlueprintAssignable, Category = "PS Strategic Vision")
|
UPROPERTY(BlueprintAssignable, Category = "PS Strategic Vision")
|
||||||
FPSStrategicDisplayStateChanged OnDisplayStateChanged;
|
FPS_StrategicDisplayStateChanged OnDisplayStateChanged;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void NotifyStateChanged();
|
void NotifyStateChanged();
|
||||||
|
|
||||||
bool bGlobalEnabled = true;
|
bool bGlobalEnabled = true;
|
||||||
TSet<FName> DisabledCategories;
|
TSet<FName> DisabledCategories;
|
||||||
TSet<EPSStrategicTeam> DisabledTeams;
|
TSet<EPS_StrategicTeam> DisabledTeams;
|
||||||
};
|
};
|
||||||
@@ -3,11 +3,11 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "CoreMinimal.h"
|
#include "CoreMinimal.h"
|
||||||
#include "PSStrategicVisionTypes.generated.h"
|
#include "PS_StrategicVisionTypes.generated.h"
|
||||||
|
|
||||||
/** Camp d'un personnage, utilise pour colorer / filtrer les affichages strategiques. */
|
/** Camp d'un personnage, utilise pour colorer / filtrer les affichages strategiques. */
|
||||||
UENUM(BlueprintType)
|
UENUM(BlueprintType)
|
||||||
enum class EPSStrategicTeam : uint8
|
enum class EPS_StrategicTeam : uint8
|
||||||
{
|
{
|
||||||
Player,
|
Player,
|
||||||
Ally,
|
Ally,
|
||||||
@@ -19,7 +19,7 @@ enum class EPSStrategicTeam : uint8
|
|||||||
* Categories d'affichage strategique. Chaque type de component declare sa categorie,
|
* Categories d'affichage strategique. Chaque type de component declare sa categorie,
|
||||||
* ce qui permet de l'activer / desactiver globalement via le subsystem.
|
* ce qui permet de l'activer / desactiver globalement via le subsystem.
|
||||||
*/
|
*/
|
||||||
struct PS_STRATEGICVISION_API FPSStrategicDisplayCategories
|
struct PS_STRATEGICVISION_API FPS_StrategicDisplayCategories
|
||||||
{
|
{
|
||||||
static const FName VisionCone;
|
static const FName VisionCone;
|
||||||
};
|
};
|
||||||
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
#include "CoreMinimal.h"
|
#include "CoreMinimal.h"
|
||||||
#include "Engine/EngineTypes.h"
|
#include "Engine/EngineTypes.h"
|
||||||
#include "PSStrategicDisplayComponent.h"
|
#include "PS_StrategicDisplayComponent.h"
|
||||||
#include "PSVisionConeComponent.generated.h"
|
#include "PS_VisionConeComponent.generated.h"
|
||||||
|
|
||||||
class UMaterialInstanceDynamic;
|
class UMaterialInstanceDynamic;
|
||||||
class UMaterialInterface;
|
class UMaterialInterface;
|
||||||
@@ -15,20 +15,20 @@ class UProceduralMeshComponent;
|
|||||||
* Affiche le cone de vision d'un personnage sous forme de mesh procedural.
|
* Affiche le cone de vision d'un personnage sous forme de mesh procedural.
|
||||||
* Le cone est decoupe par les obstacles (murs) via des line traces, colore
|
* Le cone est decoupe par les obstacles (murs) via des line traces, colore
|
||||||
* selon le camp, et activable / desactivable localement ou globalement
|
* selon le camp, et activable / desactivable localement ou globalement
|
||||||
* (vue spectateur, replay) via le UPSStrategicVisionSubsystem.
|
* (vue spectateur, replay) via le UPS_StrategicVisionSubsystem.
|
||||||
*
|
*
|
||||||
* A attacher sur le personnage : le cone suit la position du component et
|
* A attacher sur le personnage : le cone suit la position du component et
|
||||||
* s'oriente selon son yaw (rotation horizontale).
|
* s'oriente selon son yaw (rotation horizontale).
|
||||||
*/
|
*/
|
||||||
UCLASS(ClassGroup = (PSStrategicVision), meta = (BlueprintSpawnableComponent, DisplayName = "PS Vision Cone"))
|
UCLASS(ClassGroup = (PS_StrategicVision), meta = (BlueprintSpawnableComponent, DisplayName = "PS Vision Cone"))
|
||||||
class PS_STRATEGICVISION_API UPSVisionConeComponent : public UPSStrategicDisplayComponent
|
class PS_STRATEGICVISION_API UPS_VisionConeComponent : public UPS_StrategicDisplayComponent
|
||||||
{
|
{
|
||||||
GENERATED_BODY()
|
GENERATED_BODY()
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UPSVisionConeComponent();
|
UPS_VisionConeComponent();
|
||||||
|
|
||||||
virtual FName GetDisplayCategory() const override { return FPSStrategicDisplayCategories::VisionCone; }
|
virtual FName GetDisplayCategory() const override { return FPS_StrategicDisplayCategories::VisionCone; }
|
||||||
|
|
||||||
/** Portee de vision, en cm. */
|
/** Portee de vision, en cm. */
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Vision Cone", meta = (ClampMin = "10.0", Units = "cm"))
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Vision Cone", meta = (ClampMin = "10.0", Units = "cm"))
|
||||||
Reference in New Issue
Block a user