Section 11: Multiple Weapon Types - Lecture 211

Drawing crosshairs fom weapon variables
This commit is contained in:
charnet3d 2024-01-13 18:04:51 +01:00
parent f7d1525e7e
commit 473271348a
52 changed files with 322 additions and 39 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
Content/_Game/Ammo/Ammo9mmBP.uasset (Stored with Git LFS)

Binary file not shown.

BIN
Content/_Game/Assets/Sounds/Rifle/AR_Equip.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/_Game/Assets/Sounds/Rifle/AR_Pickup.uasset (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

BIN
Content/_Game/Assets/Sounds/Rifle/SMG_Equip.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/_Game/Assets/Sounds/Rifle/SMG_Pickup.uasset (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
Content/_Game/DataTable/WeaponDataTable.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/_Game/HUD/PickupWidgetBP.uasset (Stored with Git LFS)

Binary file not shown.

BIN
Content/_Game/HUD/ShooterHUDBP.uasset (Stored with Git LFS)

Binary file not shown.

BIN
Content/_Game/Maps/DefaultMap.umap (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

BIN
Content/_Game/Materials/ARMaterials/F_AR_Mat.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/_Game/Materials/ARMaterials/M_AR_Mat.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/_Game/Materials/ARMaterials/M_AR_Mat_Inst.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/_Game/Weapons/BaseWeapon/ARAnimBP.uasset (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

View File

@ -316,7 +316,10 @@ public:
FORCEINLINE USkeletalMeshComponent* GetItemMesh() const { return ItemMesh; }
FORCEINLINE USoundCue* GetPickupSound() const { return PickupSound; }
FORCEINLINE void SetPickupSound(USoundCue* Sound) { PickupSound = Sound; }
FORCEINLINE USoundCue* GetEquipSound() const { return EquipSound; }
FORCEINLINE void SetEquipSound(USoundCue* Sound) { EquipSound = Sound; }
FORCEINLINE int32 GetItemCount() const { return ItemCount; }
@ -327,6 +330,22 @@ public:
FORCEINLINE void SetCharacterInventoryFull(bool bFull) { bCharacterInventoryFull = bFull; }
FORCEINLINE void SetItemName(FString Name) { ItemName = Name; }
FORCEINLINE void SetIconItem(UTexture2D* Icon) { IconItem = Icon; }
FORCEINLINE void SetIconAmmo(UTexture2D* Icon) { IconAmmo = Icon; }
FORCEINLINE UMaterialInstance* GetMaterialInstance() const { return MaterialInstance; }
FORCEINLINE void SetMaterialInstance(UMaterialInstance* Instance) { MaterialInstance = Instance; }
FORCEINLINE UMaterialInstanceDynamic* GetDynamicMaterialInstance() const { return DynamicMaterialInstance; }
FORCEINLINE void SetDynamicMaterialInstance(UMaterialInstanceDynamic* Instance) { DynamicMaterialInstance = Instance; }
FORCEINLINE FLinearColor GetGlowColor() const { return GlowColor; }
FORCEINLINE void SetMaterialIndex(int32 Index) { MaterialIndex = Index; }
FORCEINLINE int32 GetMaterialIndex() const { return MaterialIndex; }
/** Called from the AShooterCharacter class */
void StartItemCurve(AShooterCharacter* Char, bool bForcePlaySound = false);

View File

@ -6,6 +6,8 @@
#include "ShooterCharacter.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "Kismet/KismetMathLibrary.h"
#include "Weapon.h"
#include "WeaponType.h"
UShooterAnimInstance::UShooterAnimInstance() :
Speed(0.f),
@ -26,7 +28,9 @@ UShooterAnimInstance::UShooterAnimInstance() :
CharacterRotationLastFrame(FRotator(0)),
YawDelta(0.f),
RecoilWeight(1.f),
bTurningInPlace(false)
bTurningInPlace(false),
EquippedWeaponType(EWeaponType::EWT_MAX),
bShouldUseFABRIK(false)
{
}
@ -63,7 +67,9 @@ void UShooterAnimInstance::UpdateAnimationProperties(float DeltaTime)
bReloading = ShooterCharacter->GetCombatState() == ECombatState::ECS_Reloading;
bCrouching = ShooterCharacter->IsCrouching();
bEquipping = ShooterCharacter->GetCombatState() == ECombatState::ECS_Equipping;
bShouldUseFABRIK = ShooterCharacter->GetCombatState() == ECombatState::ECS_Unoccupied
|| ShooterCharacter->GetCombatState() == ECombatState::ECS_FireTimerInProgress;
if (bReloading)
{
OffsetState = EOffsetState::EOS_Reloading;
@ -80,6 +86,12 @@ void UShooterAnimInstance::UpdateAnimationProperties(float DeltaTime)
{
OffsetState = EOffsetState::EOS_Hip;
}
// Check if ShooterCharacter has a valid EquippedWeapon
if (ShooterCharacter->GetEquippedWeapon())
{
EquippedWeaponType = ShooterCharacter->GetEquippedWeapon()->GetWeaponType();
}
TurnInPlace();
Lean(DeltaTime);

View File

@ -4,6 +4,8 @@
#include "CoreMinimal.h"
#include "Animation/AnimInstance.h"
#include "WeaponType.h"
#include "ShooterAnimInstance.generated.h"
class AShooterCharacter;
@ -123,4 +125,12 @@ private:
/** True when turning in place */
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Turn In Place", meta = (AllowPrivateAccess = true))
bool bTurningInPlace;
/** Weapon type for the currently equipped weapon */
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = Combat, meta = (AllowPrivateAccess = true))
EWeaponType EquippedWeaponType;
/** True when not reloading or equipping */
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = Combat, meta = (AllowPrivateAccess = true))
bool bShouldUseFABRIK;
};

View File

@ -531,4 +531,6 @@ public:
void StartEquipSoundTimer();
void UnhighlightInventorySlot();
FORCEINLINE AWeapon* GetEquippedWeapon() const { return EquippedWeapon; }
};

View File

@ -78,3 +78,63 @@ void AWeapon::StopFalling()
SetItemState(EItemState::EIS_Pickup);
StartPulseTimer();
}
void AWeapon::OnConstruction(const FTransform& Transform)
{
Super::OnConstruction(Transform);
const FString WeaponTablePath{ TEXT("/Script/Engine.DataTable'/Game/_Game/DataTable/WeaponDataTable.WeaponDataTable'") };
UDataTable* WeaponTableObject = Cast<UDataTable>(StaticLoadObject(UDataTable::StaticClass(), nullptr, *WeaponTablePath));
if (WeaponTableObject)
{
FWeaponDataTable* WeaponDataRow = nullptr;
switch (WeaponType)
{
case EWeaponType::EWT_AssaultRifle:
WeaponDataRow = WeaponTableObject->FindRow<FWeaponDataTable>(FName("AssaultRifle"), TEXT(""));
break;
case EWeaponType::EWT_SubmachineGun:
default:
WeaponDataRow = WeaponTableObject->FindRow<FWeaponDataTable>(FName("SubmachineGun"), TEXT(""));
}
if (WeaponDataRow)
{
AmmoType = WeaponDataRow->AmmoType;
Ammo = WeaponDataRow->WeaponAmmo;
MagazineCapacity = WeaponDataRow->MagazineCapacity;
SetPickupSound(WeaponDataRow->PickupSound);
SetEquipSound(WeaponDataRow->EquipSound);
GetItemMesh()->SetSkeletalMesh(WeaponDataRow->ItemMesh);
SetItemName(WeaponDataRow->ItemName);
SetIconItem(WeaponDataRow->InventoryIcon);
SetIconAmmo(WeaponDataRow->AmmoIcon);
SetMaterialInstance(WeaponDataRow->MaterialInstance);
PreviousMaterialIndex = GetMaterialIndex();
GetItemMesh()->SetMaterial(PreviousMaterialIndex, nullptr);
SetMaterialIndex(WeaponDataRow->MaterialIndex);
ClipBoneName = WeaponDataRow->ClipBoneName;
ReloadMontageSection = WeaponDataRow->ReloadMontageSection;
GetItemMesh()->SetAnimInstanceClass(WeaponDataRow->AnimBP);
CrosshairsMiddle = WeaponDataRow->CrosshairsMiddle;
CrosshairsLeft = WeaponDataRow->CrosshairsLeft;
CrosshairsRight = WeaponDataRow->CrosshairsRight;
CrosshairsBottom = WeaponDataRow->CrosshairsBottom;
CrosshairsTop = WeaponDataRow->CrosshairsTop;
}
if (GetMaterialInstance())
{
SetDynamicMaterialInstance(UMaterialInstanceDynamic::Create(GetMaterialInstance(), this));
GetDynamicMaterialInstance()->SetVectorParameterValue(TEXT("FresnelColor"), GetGlowColor());
GetItemMesh()->SetMaterial(GetMaterialIndex(), GetDynamicMaterialInstance());
EnableGlowMaterial();
}
}
}

View File

@ -4,19 +4,76 @@
#include "CoreMinimal.h"
#include "Item.h"
#include "AmmoType.h"
#include "Engine/DataTable.h"
#include "WeaponType.h"
#include "Weapon.generated.h"
class USoundCue;
class UWidgetComponent;
UENUM(BlueprintType)
enum class EWeaponType: uint8
USTRUCT(BlueprintType)
struct FWeaponDataTable : public FTableRowBase
{
EWT_SubmachineGun UMETA(DisplayName = "SubmachineGun"),
EWT_AssaultRifle UMETA(DisplayName = "AssaultRifle"),
GENERATED_BODY()
EWT_MAX UMETA(DisplayName = "DefaultMax"),
UPROPERTY(EditAnywhere, BlueprintReadWrite)
EAmmoType AmmoType;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 WeaponAmmo;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 MagazineCapacity;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
USoundCue* PickupSound;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
USoundCue* EquipSound;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
USkeletalMesh* ItemMesh;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString ItemName;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UTexture2D* InventoryIcon;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UTexture2D* AmmoIcon;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UMaterialInstance* MaterialInstance;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 MaterialIndex;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FName ClipBoneName;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FName ReloadMontageSection;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
TSubclassOf<UAnimInstance> AnimBP;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UTexture2D* CrosshairsMiddle;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UTexture2D* CrosshairsLeft;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UTexture2D* CrosshairsRight;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UTexture2D* CrosshairsBottom;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UTexture2D* CrosshairsTop;
};
/**
@ -35,6 +92,8 @@ public:
protected:
void StopFalling();
virtual void OnConstruction(const FTransform& Transform) override;
private:
FTimerHandle ThrowWeaponTimer;
float ThrowWeaponTime;
@ -63,11 +122,32 @@ private:
/** True when moving the clip while reloading */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Weapon Properties", meta = (AllowPrivateAccess = "true"))
bool bMovingClip;
/** FName for the clip bone */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Weapon Properties", meta = (AllowPrivateAccess = "true"))
FName ClipBoneName;
/** Data table for weapon properties */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = DataTable, meta = (AllowPrivateAccess = "true"))
UDataTable* WeaponDataTable;
int32 PreviousMaterialIndex;
/** Textures for the weapon crosshairs */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = DataTable, meta = (AllowPrivateAccess = "true"))
UTexture2D* CrosshairsMiddle;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = DataTable, meta = (AllowPrivateAccess = "true"))
UTexture2D* CrosshairsLeft;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = DataTable, meta = (AllowPrivateAccess = "true"))
UTexture2D* CrosshairsRight;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = DataTable, meta = (AllowPrivateAccess = "true"))
UTexture2D* CrosshairsBottom;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = DataTable, meta = (AllowPrivateAccess = "true"))
UTexture2D* CrosshairsTop;
public:
/** Adds an impulse to the weapon */
void ThrowWeapon();

View File

@ -0,0 +1,10 @@
#pragma once
UENUM(BlueprintType)
enum class EWeaponType : uint8
{
EWT_SubmachineGun UMETA(DisplayName = "SubmachineGun"),
EWT_AssaultRifle UMETA(DisplayName = "AssaultRifle"),
EWT_MAX UMETA(DisplayName = "DefaultMax"),
};