Replicated

[Drag Down] 눈발사대 눈사람(주기적 발사 장애물) 본문

언리얼 엔진/Drag Down

[Drag Down] 눈발사대 눈사람(주기적 발사 장애물)

라구넹 2025. 4. 14. 02:43

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "DDBulletBase.generated.h"

UCLASS()
class DRAGDOWN_API ADDBulletBase : public AActor
{
	GENERATED_BODY()
	
public:	
	ADDBulletBase();

protected:
	UFUNCTION()
	void OnComponentBeginOverlapCallback(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepHitResult);

	void PushCharacter(ACharacter* Character);

	UPROPERTY()
	TObjectPtr<class USphereComponent> Trigger;

	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Components")
	TObjectPtr<class UStaticMeshComponent> StaticMeshComp;

	UPROPERTY()
	TObjectPtr<class UProjectileMovementComponent> Movement;

	UPROPERTY(EditAnywhere)
	float Power;
};


// Fill out your copyright notice in the Description page of Project Settings.


#include "Actor/DDBulletBase.h"
#include "GameFramework/ProjectileMovementComponent.h"
#include "Components/SphereComponent.h"
#include "Components/StaticMeshComponent.h"
#include "Physics/DDCollision.h"
#include "GameFramework/Character.h"
#include "GameFramework/CharacterMovementComponent.h"

ADDBulletBase::ADDBulletBase()
{
	bReplicates = true;

	Trigger = CreateDefaultSubobject<USphereComponent>(TEXT("Trigger"));
	Trigger->InitSphereRadius(5.0f);
	Trigger->SetCollisionProfileName(CPROFILE_DDTRIGGER);
	RootComponent = Trigger;
	Trigger->OnComponentBeginOverlap.AddDynamic(this, &ADDBulletBase::OnComponentBeginOverlapCallback);

	StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMeshComp"));
	StaticMeshComp->SetupAttachment(RootComponent);
	StaticMeshComp->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f));
	StaticMeshComp->SetCollisionEnabled(ECollisionEnabled::NoCollision);

	Movement = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("Movement"));
	Movement->InitialSpeed = 3000.0f;
	Movement->MaxSpeed = 3000.0f;
	Movement->bRotationFollowsVelocity = true;
	Movement->bShouldBounce = false;

	InitialLifeSpan = 3.0f;

	Power = 3000.0f;
}

void ADDBulletBase::OnComponentBeginOverlapCallback(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepHitResult)
{
	if ( HasAuthority() )
	{
		ACharacter* Character = Cast<ACharacter>(OtherActor);
		if (Character)
		{
			PushCharacter(Cast<ACharacter>(OtherActor));
		}
	}
}

void ADDBulletBase::PushCharacter(ACharacter* Character)
{
	if ( Character && Character->GetCharacterMovement() )
	{
		FVector Dir = GetActorForwardVector();
		Character->LaunchCharacter(Dir * Power, true, true);
	}
}

Bullet Base

이거 상속받아서 눈덩이로 만들 거다

밑에서 메시 설정해주면 되고, 파워도 설정 가능

 

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "DDPeriodicLauncher.generated.h"

UCLASS()
class DRAGDOWN_API ADDPeriodicLauncher : public AActor
{
	GENERATED_BODY()
	
public:	
	ADDPeriodicLauncher();
	void Spawn();

protected:
	virtual void BeginPlay() override;
	virtual void EndPlay(const EEndPlayReason::Type EndPlayReason);

	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Launcher")
	TObjectPtr<class UStaticMeshComponent> StaticMeshComp;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Launcher")
	TSubclassOf<AActor> ActorClass;

	UPROPERTY()
	FTimerHandle SpawningHandle;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Launcher")
	FRotator Rot;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Launcher")
	float Offset;
};

// Fill out your copyright notice in the Description page of Project Settings.


#include "Actor/DDPeriodicLauncher.h"

// Sets default values
ADDPeriodicLauncher::ADDPeriodicLauncher()
{
	bReplicates = true;

	Offset = 300.0f;
	Rot = FRotator::ZeroRotator;

	StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMeshComp"));
	RootComponent = StaticMeshComp;
}

void ADDPeriodicLauncher::Spawn()
{
	FActorSpawnParameters SpawnParams;
	SpawnParams.Owner = this;
	SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;

	FVector SpawnLocation = GetActorLocation();
	SpawnLocation.Z += Offset;
	FRotator SpawnRotation = FRotator(0.f, 90.f, 0.f);

	GetWorld()->SpawnActor<AActor>(ActorClass, SpawnLocation, SpawnRotation, SpawnParams);
}

void ADDPeriodicLauncher::BeginPlay()
{
	Super::BeginPlay();

	if ( HasAuthority() )
	{
		GetWorld()->GetTimerManager().SetTimer(SpawningHandle, this, &ADDPeriodicLauncher::Spawn, 1.0f, true, 0.0f);
	}
}

void ADDPeriodicLauncher::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
	if ( GetWorld() )
	{
		GetWorld()->GetTimerManager().ClearTimer(SpawningHandle);
	}

	Super::EndPlay(EndPlayReason);
}

이건 발사대

블루프린트로 상속해서 눈사람 넣어줄 거다

 

 

맵 다음 테마를 눈, 얼음으로 할 거라 눈사람이 눈덩이 발사하도록 했다

 

이제 다음은 이거에 네트워크 오브젝트 풀링을 적용해야 한다