Space Plunder
Loading...
Searching...
No Matches
UCrosshairWidget Class Reference

#include <CrosshairWidget.h>

Inheritance diagram for UCrosshairWidget:
ICrosshairInterface

Public Member Functions

void OnHitMarker (const AActor *ActorHit, const float Damage, const UDamageType *DamageType, const FName HitBone, const FVector HitLocation, const bool bKillingHit, const bool bInjuredPart)
 
virtual void HitMarker (const AActor *ActorHit, const float Damage, const UDamageType *DamageType, const FName HitBone, const FVector HitLocation, const bool bKillingHit, const bool bInjuredPart) override
 
virtual void GunRecoil (const float RecoilAmount) override
 
void SetCrosshairLocation ()
 
void SetCrosshairRadius ()
 
void SetGunRecoil (const float RecoilAmount)
 
virtual void StartedAiming () override
 
virtual void StoppedAiming () override
 
void OnStartedAiming ()
 
void OnStoppedAiming ()
 
virtual void SetHolstered (const bool bIsHolstered) override
 
void OnHolsteredSet (const bool bIsHolstered)
 
virtual void SetWeaponCrosshair (const FCrosshairData &CrosshairType, const float Spread) override
 
void OnSetWeaponCrosshair (const FCrosshairData &CrosshairType, const float Spread)
 
- Public Member Functions inherited from ICrosshairInterface
virtual void SetWeaponCrosshair (const struct FCrosshairData &CrosshairType, const float Spread)=0
 

Protected Member Functions

virtual bool Initialize () override
 
virtual void NativeConstruct () override
 
void VisibilityChangedEvent (ESlateVisibility InVisibility)
 

Protected Attributes

float InterpSpeed = 12.0f
 
float UpperBound = -80.0f
 
float LowerBound = 25.0f
 
float RecoilMultiplier = 20.0f
 
float PlayerSpeedMultiplier = 0.15f
 
float WeaponSpreadMultiplier = 0.15f
 
float UpdateSpeed = 0.03f
 
float CrosshairOpacityLow = 0.2f
 
bool bShowDamageNumbers = false
 
bool bShowDamageHitDot = false
 
UWidget * DamageVerticalBox = nullptr
 
UWidget * HitMarkerWidget = nullptr
 
UTextBlock * DamageAmount = nullptr
 
class UCircumferenceMarkerWidgetCrosshairs = nullptr
 
class UWidget * HitMarkers = nullptr
 
UWidget * CrosshairOverlay = nullptr
 
class USizeBox * ReticleSizeBox = nullptr
 
class UImage * OuterImage = nullptr
 
class UImage * OuterImageHorizontal = nullptr
 
bool bHolstered = true
 
bool bAiming = false
 
int32 CrosshairStyle = 0
 
FCrosshairData CrosshairData
 
float WeaponSpread = 0.0f
 

Private Member Functions

void SetDamagePosition (const FVector &Location) const
 
void SetCrosshairOpacity () const
 
void SetReticleSize (const float Radius) const
 
void SetHitMarkerVisibility (const float Alpha) const
 
float ProcessNumbers (const class UCanvasPanelSlot *CanvasSlot, const bool bVertical) const
 
float ComputeMaxScreenspaceSpreadRadius () const
 

Private Attributes

FTimerHandle HitMarkerTimerHandle
 
FTimerHandle CrosshairUpdateTimerHandle
 
float Recoil
 
bool bRecoilFire = false
 

Detailed Description

UCrosshairWidget is a user widget that represents a weapon crosshair in the UI.

Member Function Documentation

◆ ComputeMaxScreenspaceSpreadRadius()

float UCrosshairWidget::ComputeMaxScreenspaceSpreadRadius ( ) const
private
318{
319 const float LongShotDistance = 10000.0f;
320 APlayerController* PlayerController = GetOwningPlayer();
321 if(PlayerController != nullptr && PlayerController->PlayerCameraManager != nullptr)
322 {
323 const FVector PlayerVelocity = GetOwningPlayerPawn()->GetVelocity();
324 const float PlayerSpeed = ((PlayerVelocity.Size() * -1.0f) * PlayerSpeedMultiplier);
325 const float DeltaSeconds = GetWorld()->GetDeltaSeconds();
326
327 float Target = PlayerSpeed;
328 if(bRecoilFire)
329 {
330 Target = PlayerSpeed + (Recoil * -1.0f);
331 }
332 // const float Current = Crosshairs->Radius;
333 // const float ClampValue = UKismetMathLibrary::FInterpTo(Current, Target, DeltaSeconds, InterpSpeed);
334 // const float ClampedRadius = UKismetMathLibrary::FClamp(ClampValue, CrosshairData.ReticleSize.RadiusUpperBounds, CrosshairData.ReticleSize.RadiusLowerBounds);
335
336
337 const float SpreadRadiusRads = FMath::DegreesToRadians(WeaponSpread * WeaponSpreadMultiplier - Target);
338 const float SpreadRadiusAtDistance = FMath::Tan(SpreadRadiusRads) * LongShotDistance;
339 FVector CamPos;
340 FRotator CamOrient;
341 PlayerController->PlayerCameraManager->GetCameraViewPoint(CamPos, CamOrient);
342 FVector CamForwDir = CamOrient.RotateVector(FVector::ForwardVector);
343 FVector CamUpDir = CamOrient.RotateVector(FVector::UpVector);
344
345 FVector OffsetTargetAtDistance = CamPos + (CamForwDir * LongShotDistance) + (CamUpDir * SpreadRadiusAtDistance);
346
347 FVector2D OffsetTargetInScreenspace;
348
349 if (PlayerController->ProjectWorldLocationToScreen(OffsetTargetAtDistance, OffsetTargetInScreenspace, true))
350 {
351 int32 ViewportSizeX(0), ViewportSizeY(0);
352 PlayerController->GetViewportSize(ViewportSizeX, ViewportSizeY);
353
354 const FVector2D ScreenSpaceCenter(FVector::FReal(ViewportSizeX) * 0.5f, FVector::FReal(ViewportSizeY) * 0.5f);
355
356 return (OffsetTargetInScreenspace - ScreenSpaceCenter).Length();
357 }
358 }
359 return 0.0f;
360}
float Recoil
Definition CrosshairWidget.h:136
float PlayerSpeedMultiplier
Definition CrosshairWidget.h:75
float WeaponSpreadMultiplier
Definition CrosshairWidget.h:77
float WeaponSpread
Definition CrosshairWidget.h:121
bool bRecoilFire
Definition CrosshairWidget.h:137

◆ GunRecoil()

void UCrosshairWidget::GunRecoil ( const float RecoilAmount)
overridevirtual

Implements ICrosshairInterface.

154{
155 SetGunRecoil(RecoilAmount);
156}
void SetGunRecoil(const float RecoilAmount)
Definition CrosshairWidget.cpp:289

◆ HitMarker()

void UCrosshairWidget::HitMarker ( const AActor * ActorHit,
const float Damage,
const UDamageType * DamageType,
const FName HitBone,
const FVector HitLocation,
const bool bKillingHit,
const bool bInjuredPart )
overridevirtual

Implements ICrosshairInterface.

112{
113 OnHitMarker(ActorHit, Damage, DamageType, HitBone, HitLocation, bKillingHit, bInjuredPart);
114 if(HitMarkers != nullptr)
115 {
116 IHitMarkerInterface* HitMarkerInterface = Cast<IHitMarkerInterface>(HitMarkers);
117 if(HitMarkerInterface != nullptr)
118 {
119 HitMarkerInterface->HitMarker(ActorHit, Damage, DamageType, HitBone, HitLocation, bKillingHit, bInjuredPart);
120 }
121 }
122 SetDamagePosition(HitLocation);
123 if(DamageAmount != nullptr)
124 {
125 DamageAmount->SetRenderOpacity(1.0f);
126 DamageAmount->SetText(FText::FromString(FString::Printf(TEXT("%.0f"), Damage)));
127 }
128 if(HitMarkerWidget != nullptr)
129 {
130 HitMarkerWidget->SetRenderOpacity(1.0f);
131 }
132 if(DamageVerticalBox != nullptr)
133 {
134 DamageVerticalBox->SetRenderOpacity(1.0f);
135 }
136}
Definition HitMarkerInterface.h:16
virtual void HitMarker(const AActor *ActorHit, const float Damage, const UDamageType *DamageType, const FName HitBone, const FVector HitLocation, const bool bKillingHit=false, const bool bInjuredPart=false)=0
void OnHitMarker(const AActor *ActorHit, const float Damage, const UDamageType *DamageType, const FName HitBone, const FVector HitLocation, const bool bKillingHit, const bool bInjuredPart)
class UWidget * HitMarkers
Definition CrosshairWidget.h:99
UWidget * DamageVerticalBox
Definition CrosshairWidget.h:90
UWidget * HitMarkerWidget
Definition CrosshairWidget.h:92
UTextBlock * DamageAmount
Definition CrosshairWidget.h:94
void SetDamagePosition(const FVector &Location) const
Definition CrosshairWidget.cpp:138

◆ Initialize()

bool UCrosshairWidget::Initialize ( )
overrideprotectedvirtual
16{
17 const bool bSuccess = Super::Initialize();
18 if (!ensure(OuterImage != nullptr)) return false;
19 if (!ensure(OuterImageHorizontal != nullptr)) return false;
20 if (!ensure(HitMarkerWidget != nullptr)) return false;
21 if (!ensure(Crosshairs != nullptr)) return false;
22 if (!ensure(DamageAmount != nullptr)) return false;
23 if (!ensure(CrosshairOverlay != nullptr)) return false;
24 if (!ensure(DamageVerticalBox != nullptr)) return false;
25 if (!ensure(ReticleSizeBox != nullptr)) return false;
26
27 OnVisibilityChanged.AddUniqueDynamic(this, &UCrosshairWidget::VisibilityChangedEvent);
28 if(!bSuccess) return false;
29 return true;
30}
class UCircumferenceMarkerWidget * Crosshairs
Definition CrosshairWidget.h:97
UWidget * CrosshairOverlay
Definition CrosshairWidget.h:101
class UImage * OuterImageHorizontal
Definition CrosshairWidget.h:110
void VisibilityChangedEvent(ESlateVisibility InVisibility)
Definition CrosshairWidget.cpp:80
class UImage * OuterImage
Definition CrosshairWidget.h:108
class USizeBox * ReticleSizeBox
Definition CrosshairWidget.h:105

◆ NativeConstruct()

void UCrosshairWidget::NativeConstruct ( )
overrideprotectedvirtual
33{
34 Super::NativeConstruct();
35 if(HitMarkerWidget != nullptr)
36 {
37 HitMarkerWidget->SetRenderOpacity(0.0f);
38 }
39 if(DamageAmount != nullptr)
40 {
41 DamageAmount->SetRenderOpacity(0.0f);
42 }
43 if(CrosshairOverlay != nullptr)
44 {
45 CrosshairOverlay->SetRenderOpacity(0.0f);
46 }
47 if(HitMarkers != nullptr)
48 {
49 HitMarkers->SetVisibility(ESlateVisibility::HitTestInvisible);
50 }
51 if(GetOwningPlayer() != nullptr)
52 {
53 GetOwningPlayer()->GetWorldTimerManager().SetTimer(CrosshairUpdateTimerHandle, this, &UCrosshairWidget::SetCrosshairLocation, UpdateSpeed, true);
54 }
55 if(DamageVerticalBox != nullptr)
56 {
58 {
59 DamageVerticalBox->SetVisibility(ESlateVisibility::HitTestInvisible);
60 }
61 else
62 {
63 DamageVerticalBox->SetVisibility(ESlateVisibility::Collapsed);
64 }
65 }
66 if(DamageAmount != nullptr)
67 {
69 {
70 DamageAmount->SetVisibility(ESlateVisibility::HitTestInvisible);
71 }
72 else
73 {
74 DamageAmount->SetVisibility(ESlateVisibility::Collapsed);
75 }
76 }
77}
bool bShowDamageHitDot
Definition CrosshairWidget.h:87
FTimerHandle CrosshairUpdateTimerHandle
Definition CrosshairWidget.h:134
float UpdateSpeed
Definition CrosshairWidget.h:80
void SetCrosshairLocation()
Definition CrosshairWidget.cpp:226
bool bShowDamageNumbers
Definition CrosshairWidget.h:85

◆ OnHitMarker()

void UCrosshairWidget::OnHitMarker ( const AActor * ActorHit,
const float Damage,
const UDamageType * DamageType,
const FName HitBone,
const FVector HitLocation,
const bool bKillingHit,
const bool bInjuredPart )

◆ OnHolsteredSet()

void UCrosshairWidget::OnHolsteredSet ( const bool bIsHolstered)

◆ OnSetWeaponCrosshair()

void UCrosshairWidget::OnSetWeaponCrosshair ( const FCrosshairData & CrosshairType,
const float Spread )

◆ OnStartedAiming()

void UCrosshairWidget::OnStartedAiming ( )

◆ OnStoppedAiming()

void UCrosshairWidget::OnStoppedAiming ( )

◆ ProcessNumbers()

float UCrosshairWidget::ProcessNumbers ( const class UCanvasPanelSlot * CanvasSlot,
const bool bVertical ) const
private
298{
299 const FVector PlayerVelocity = GetOwningPlayerPawn()->GetVelocity();
300 const float PlayerSpeed = ((PlayerVelocity.Size() * -1.0f) * PlayerSpeedMultiplier);
301 const float DeltaSeconds = GetWorld()->GetDeltaSeconds();
302
303 float Target = PlayerSpeed;
304 if(bRecoilFire)
305 {
306 Target = PlayerSpeed + (Recoil * -1.0f);
307 }
308 float Current = CanvasSlot->GetPosition().X;
309 if(bVertical)
310 {
311 Current = CanvasSlot->GetPosition().Y;
312 }
313 const float ClampValue = UKismetMathLibrary::FInterpTo(Current, Target, DeltaSeconds, InterpSpeed);
314 return UKismetMathLibrary::FClamp(ClampValue, UpperBound, LowerBound);
315}
float UpperBound
Definition CrosshairWidget.h:68
float LowerBound
Definition CrosshairWidget.h:70
float InterpSpeed
Definition CrosshairWidget.h:66

◆ SetCrosshairLocation()

void UCrosshairWidget::SetCrosshairLocation ( )
227{
228 if(!GetOwningPlayer()->IsLocalController()){return;}
229 if(GetOwningPlayerPawn() == nullptr){/*UE_LOG(LogTemp,Warning,TEXT("Error getting Player Pawn - CrosshairWidget"));*/return;}
231 Recoil = 0;
232 bRecoilFire = false;
233}
void SetCrosshairRadius()
Definition CrosshairWidget.cpp:235

◆ SetCrosshairOpacity()

void UCrosshairWidget::SetCrosshairOpacity ( ) const
private
182{
183 if(CrosshairOverlay == nullptr){return;}
184 if(bHolstered)
185 {
186 CrosshairOverlay->SetRenderOpacity(0.0f);
187 }
188 else
189 {
190 if(bAiming)
191 {
192 CrosshairOverlay->SetRenderOpacity(1.0f);
193 }
194 else
195 {
196 CrosshairOverlay->SetRenderOpacity(CrosshairOpacityLow);
197 }
198 }
199}
float CrosshairOpacityLow
Definition CrosshairWidget.h:83
bool bHolstered
Definition CrosshairWidget.h:113
bool bAiming
Definition CrosshairWidget.h:115

◆ SetCrosshairRadius()

void UCrosshairWidget::SetCrosshairRadius ( )

Old Way of Calculating //

/// / / / / / /

236{
238 // const FVector PlayerVelocity = GetOwningPlayerPawn()->GetVelocity();
239 // const float PlayerSpeed = ((PlayerVelocity.Size() * -1.0f) * PlayerSpeedMultiplier);
240 const float DeltaSeconds = GetWorld()->GetDeltaSeconds();
241 //
242 // float Target = PlayerSpeed;
243 // if(bRecoilFire)
244 // {
245 // Target = PlayerSpeed + (Recoil * -1.0f);
246 // }
247 // const float Current = Crosshairs->Radius;
248 // const float ClampValue = UKismetMathLibrary::FInterpTo(Current, Target, DeltaSeconds, InterpSpeed);
249 // const float ClampedRadius = UKismetMathLibrary::FClamp(ClampValue, UpperBound, LowerBound);
251
252 const float NewRadius = ComputeMaxScreenspaceSpreadRadius();
253 const float Current = Crosshairs->Radius;
254 const float ClampValue = UKismetMathLibrary::FInterpTo(Current, NewRadius, DeltaSeconds, InterpSpeed);
255 //- New Method //
257 {
259 }
260 else
261 {
262 Crosshairs->SetRadius(ClampValue);
263 // Crosshairs->SetRadius(ClampedRadius);
264 }
265 SetReticleSize(ClampValue);
266
267
268 Recoil = 0;
269 bRecoilFire = false;
270}
void SetRadius(float InRadius)
Definition CircumferenceMarkerWidget.cpp:43
float Radius
Definition CircumferenceMarkerWidget.h:41
float ComputeMaxScreenspaceSpreadRadius() const
Definition CrosshairWidget.cpp:317
FCrosshairData CrosshairData
Definition CrosshairWidget.h:119
void SetReticleSize(const float Radius) const
Definition CrosshairWidget.cpp:273
float MaxCrosshairRadius
Definition WeaponStructs.h:231
bool bHasMaxCrosshairRadius
Definition WeaponStructs.h:229

◆ SetDamagePosition()

void UCrosshairWidget::SetDamagePosition ( const FVector & Location) const
private
139{
140 if(GetOwningPlayer() == nullptr){return;}
141 if(DamageVerticalBox == nullptr){return;}
142 UCanvasPanelSlot* CanvasPanelSlot = Cast<UCanvasPanelSlot>(DamageVerticalBox->Slot);
143 if(CanvasPanelSlot == nullptr){return;}
144
145 FVector2D ScreenLocation;
146 if(UWidgetLayoutLibrary::ProjectWorldLocationToWidgetPosition(GetOwningPlayer(), Location, ScreenLocation, true))
147 {
148 CanvasPanelSlot->SetPosition(ScreenLocation);
149 }
150}

◆ SetGunRecoil()

void UCrosshairWidget::SetGunRecoil ( const float RecoilAmount)
290{
291 Recoil = (RecoilAmount * RecoilMultiplier);
292 bRecoilFire = true;
293}
float RecoilMultiplier
Definition CrosshairWidget.h:73

◆ SetHitMarkerVisibility()

void UCrosshairWidget::SetHitMarkerVisibility ( const float Alpha) const
private
284{
285 const float Opacity = UKismetMathLibrary::Lerp(0, 1, Alpha);
286 HitMarkerWidget->SetRenderOpacity(Opacity);
287}

◆ SetHolstered()

void UCrosshairWidget::SetHolstered ( const bool bIsHolstered)
overridevirtual

Implements ICrosshairInterface.

159{
160 bHolstered = bIsHolstered;
163}
void OnHolsteredSet(const bool bIsHolstered)
void SetCrosshairOpacity() const
Definition CrosshairWidget.cpp:181

◆ SetReticleSize()

void UCrosshairWidget::SetReticleSize ( const float Radius) const
private
274{
275 ReticleSizeBox->SetHeightOverride(CrosshairData.ReticleSize.GetCrosshairSize(Radius));
276 ReticleSizeBox->SetWidthOverride(CrosshairData.ReticleSize.GetCrosshairSize(Radius));
278 {
280 }
281}
bool bUseSeparateHorizontal
Definition WeaponStructs.h:238
FReticleSizeData ReticleHorizontalSize
Definition WeaponStructs.h:240
FReticleSizeData ReticleSize
Definition WeaponStructs.h:235
float GetCrosshairSize(const float Radius) const
Definition WeaponStructs.h:192

◆ SetWeaponCrosshair()

void UCrosshairWidget::SetWeaponCrosshair ( const FCrosshairData & CrosshairType,
const float Spread )
overridevirtual
204{
205 CrosshairData = CrosshairType;
206 WeaponSpread = Spread;
207 OnSetWeaponCrosshair(CrosshairType, Spread);
208
209 if(CrosshairData.ReticleMaterial != nullptr)
210 {
211 OuterImage->SetBrushFromMaterial(CrosshairData.ReticleMaterial);
213 }
215 {
216 OuterImageHorizontal->SetVisibility(ESlateVisibility::HitTestInvisible);
217 }
218 else
219 {
220 OuterImageHorizontal->SetVisibility(ESlateVisibility::Collapsed);
221 }
222}
void OnSetWeaponCrosshair(const FCrosshairData &CrosshairType, const float Spread)
UMaterialInterface * ReticleMaterial
Definition WeaponStructs.h:244
bool bUseSeparateHorizontalImage
Definition WeaponStructs.h:246

◆ StartedAiming()

void UCrosshairWidget::StartedAiming ( )
overridevirtual

Implements ICrosshairInterface.

166{
167 bAiming = true;
170}
void OnStartedAiming()

◆ StoppedAiming()

void UCrosshairWidget::StoppedAiming ( )
overridevirtual

Implements ICrosshairInterface.

173{
174 bAiming = false;
177}
void OnStoppedAiming()

◆ VisibilityChangedEvent()

void UCrosshairWidget::VisibilityChangedEvent ( ESlateVisibility InVisibility)
protected
81{
82 switch (InVisibility)
83 {
84 case ESlateVisibility::Visible:
85 case ESlateVisibility::HitTestInvisible:
86 case ESlateVisibility::SelfHitTestInvisible:
87 if(GetOwningPlayer() != nullptr)
88 {
89 if(!GetOwningPlayer()->GetWorldTimerManager().IsTimerActive(CrosshairUpdateTimerHandle))
90 {
91 GetOwningPlayer()->GetWorldTimerManager().SetTimer(CrosshairUpdateTimerHandle, this, &UCrosshairWidget::SetCrosshairLocation, UpdateSpeed, true);
92 }
93 }
94 break;
95 case ESlateVisibility::Collapsed:
96 case ESlateVisibility::Hidden:
97 if(GetOwningPlayer() != nullptr)
98 {
99 if(!GetOwningPlayer()->GetWorldTimerManager().IsTimerActive(CrosshairUpdateTimerHandle))
100 {
101 GetOwningPlayer()->GetWorldTimerManager().ClearTimer(CrosshairUpdateTimerHandle);
102 }
103 }
104 break;
105 default:
106 break;
107 }
108}

Member Data Documentation

◆ bAiming

bool UCrosshairWidget::bAiming = false
protected

◆ bHolstered

bool UCrosshairWidget::bHolstered = true
protected

◆ bRecoilFire

bool UCrosshairWidget::bRecoilFire = false
private

◆ bShowDamageHitDot

bool UCrosshairWidget::bShowDamageHitDot = false
protected

◆ bShowDamageNumbers

bool UCrosshairWidget::bShowDamageNumbers = false
protected

◆ CrosshairData

FCrosshairData UCrosshairWidget::CrosshairData
protected

◆ CrosshairOpacityLow

float UCrosshairWidget::CrosshairOpacityLow = 0.2f
protected

◆ CrosshairOverlay

UWidget* UCrosshairWidget::CrosshairOverlay = nullptr
protected

◆ Crosshairs

class UCircumferenceMarkerWidget* UCrosshairWidget::Crosshairs = nullptr
protected

◆ CrosshairStyle

int32 UCrosshairWidget::CrosshairStyle = 0
protected

◆ CrosshairUpdateTimerHandle

FTimerHandle UCrosshairWidget::CrosshairUpdateTimerHandle
private

◆ DamageAmount

UTextBlock* UCrosshairWidget::DamageAmount = nullptr
protected

◆ DamageVerticalBox

UWidget* UCrosshairWidget::DamageVerticalBox = nullptr
protected

◆ HitMarkers

class UWidget* UCrosshairWidget::HitMarkers = nullptr
protected

◆ HitMarkerTimerHandle

FTimerHandle UCrosshairWidget::HitMarkerTimerHandle
private

◆ HitMarkerWidget

UWidget* UCrosshairWidget::HitMarkerWidget = nullptr
protected

◆ InterpSpeed

float UCrosshairWidget::InterpSpeed = 12.0f
protected

◆ LowerBound

float UCrosshairWidget::LowerBound = 25.0f
protected

◆ OuterImage

class UImage* UCrosshairWidget::OuterImage = nullptr
protected

◆ OuterImageHorizontal

class UImage* UCrosshairWidget::OuterImageHorizontal = nullptr
protected

◆ PlayerSpeedMultiplier

float UCrosshairWidget::PlayerSpeedMultiplier = 0.15f
protected

◆ Recoil

float UCrosshairWidget::Recoil
private

◆ RecoilMultiplier

float UCrosshairWidget::RecoilMultiplier = 20.0f
protected

◆ ReticleSizeBox

class USizeBox* UCrosshairWidget::ReticleSizeBox = nullptr
protected

◆ UpdateSpeed

float UCrosshairWidget::UpdateSpeed = 0.03f
protected

◆ UpperBound

float UCrosshairWidget::UpperBound = -80.0f
protected

◆ WeaponSpread

float UCrosshairWidget::WeaponSpread = 0.0f
protected

◆ WeaponSpreadMultiplier

float UCrosshairWidget::WeaponSpreadMultiplier = 0.15f
protected

The documentation for this class was generated from the following files: