D1/Source/D1/Components/CollisionComponent.h

90 lines
3.8 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameplayTagContainer.h"
#include "Components/ActorComponent.h"
#include "Kismet/KismetSystemLibrary.h"
#include "CollisionComponent.generated.h"
//DECLARE_MULTICAST_DELEGATE_OneParam -> It can be changed
DECLARE_DELEGATE_OneParam(FOnHit, FHitResult);
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class D1_API UCollisionComponent : public UActorComponent
{
GENERATED_BODY()
public:
// Sets default values for this component's properties
UCollisionComponent();
protected:
// Called when the game starts
virtual void BeginPlay() override;
public:
// Called every frame
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
public:
void CollisionTrace();
public:
TArray<AActor*> GetAlreadyHitActors() { return AlreadyHitActors; }
FORCEINLINE void ClearHitActors() { AlreadyHitActors.Empty(); }
FHitResult GetLastHit() { return LastHit; }
UPrimitiveComponent* GetCollisionMeshComponent() { return CollisionMeshComponent; }
FORCEINLINE void SetCollisionMeshComponent(UPrimitiveComponent* InputComponent) { CollisionMeshComponent = InputComponent; }
FORCEINLINE void AddActorToIgnore(AActor* inputActor) { ActorsToIgnore.Add(inputActor); }
void RemoveActorToIgnore(AActor* inputActor) { ActorsToIgnore.Remove(inputActor); }
TArray<AActor*> GetActorToIgnore() { return ActorsToIgnore; }
//Initialize
FORCEINLINE void SetTraceRaius(float inputTrace) { TraceRadius = inputTrace; }
FORCEINLINE void SetStartSocketName(FName InputStartSocketName) { StartSocketName = InputStartSocketName; }
FORCEINLINE void SetEndSocketName(FName InpuEndSocketName) { EndSocketName = InpuEndSocketName; }
FORCEINLINE void SetCollisionObjectTypes(TArray<TEnumAsByte<EObjectTypeQuery>> InputCollisionObjectTypes) { CollisionObjectTypes = InputCollisionObjectTypes; }
FORCEINLINE void SetDrawDebugType(TEnumAsByte<EDrawDebugTrace::Type> InputDrawDebugType) { DrawDebugType = InputDrawDebugType; }
FORCEINLINE void SetGameplayTagsIgnore(FGameplayTagContainer& InputGameplayTagContainer) { GameplayTagsIgnore = InputGameplayTagContainer; }
public:
UFUNCTION(BlueprintCallable)
FORCEINLINE void ActivateCollision();
UFUNCTION(BlueprintCallable)
FORCEINLINE void DeactivateCollision() { bCollisionEnabled = false; }
bool IsCollisionEnabled() { return bCollisionEnabled; }
bool CanHitActor(AActor* InActor);
private:
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Initialization", meta=(AllowPrivateAccess="true"))
float TraceRadius;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Initialization", meta = (AllowPrivateAccess = "true"))
FName StartSocketName;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Initialization", meta = (AllowPrivateAccess = "true"))
FName EndSocketName;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Initialization", meta = (AllowPrivateAccess = "true"))
TArray<TEnumAsByte<EObjectTypeQuery>> CollisionObjectTypes;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Initialization", meta = (AllowPrivateAccess = "true"))
TEnumAsByte<EDrawDebugTrace::Type> DrawDebugType;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Initialization", meta = (AllowPrivateAccess = "true"))
FGameplayTagContainer GameplayTagsIgnore;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Components", meta = (AllowPrivateAccess = "true"))
TObjectPtr<UPrimitiveComponent> CollisionMeshComponent;
UPROPERTY()
TArray<TObjectPtr<AActor>> AlreadyHitActors;
UPROPERTY()
TArray<TObjectPtr<AActor>> ActorsToIgnore;
UPROPERTY()
TObjectPtr<AActor> HitActor;
bool bCollisionEnabled;
FHitResult LastHit;
public:
FOnHit OnHitDelegate;
};