본문 바로가기
Unreal Engine5/KDT 2024

[UE5 KDT2024] 32. 스킬 생성 1편

by 유잉유잉유잉 2025. 3. 16.
728x90

 

1. 스킬을 생성해보자 

 

1) Actors폴더, 액터 상속, SkillBase 클래스 생성 

#include "EngineMinimal.h"
..
UCLASS()
class RESTART0501_API ASkillBase : public AActor
{
	..
protected:
	UPROPERTY( EditAnywhere, BlueprintReadWrite )
	UParticleSystemComponent* mEffect;

	UPROPERTY( EditAnywhere, BlueprintReadWrite )
	USphereComponent* mCollision;
..
}

생성자

ASkillBase::ASkillBase()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

	mEffect		= CreateDefaultSubobject<UParticleSystemComponent>( L"Effect" );
	mCollision	= CreateDefaultSubobject<USphereComponent>( L"Collision" );

	SetRootComponent( mEffect );
	mCollision->SetupAttachment( mEffect );
	bReplicates = true;
}

 

 

2) 스킬용 블루프린트 생성

(1)Actors폴더 블루프린트 생성 - SkillBase상속 - BP_Skill 생성 

(2) 에디터에서 mEffect 선택 - 파티클 - 템플릿에서 파티클 선택

(3) mCollision에서 콜리전 - 콜리전 프리셋 - PlayerAttack 선택 



▶️코드 수정한게 해당 코드 상속받은 블루프린트에 바로 적용 안될 때 파일 - 모든 노드 새로고침 

그래도 안나오면 에디터를 재실행 시키자.

 

3) 스킬 입력키 추가

(1) 블프/input 폴더에 입력액션 IA_SkillCast 추가

(2) IA_Context에 IA_SkillCast 추가 , 트리거 눌림 추가 

 

(3) DefaultInputSystem에 추가

	UPROPERTY( EditAnywhere, BlueprintReadWrite )
	class UInputAction* mSkill;
UDefaultInputSystem::UDefaultInputSystem()
{
	...
	static ConstructorHelpers::FObjectFinder<UInputAction>
		SkillAction( L"/Script/EnhancedInput.InputAction'/Game/Blueprint/Input/IA_SkillCast.IA_SkillCast'" );
	if ( SkillAction.Succeeded() )
		mSkill = SkillAction.Object;
}

 

(4) PlayerBase

	UFUNCTION()
	virtual void SkillCastAction( const struct FInputActionValue& value );
void APlayerBase::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
...
	inputCp->BindAction( mDefaultInput->mSkill,		ETriggerEvent::Triggered, this, &APlayerBase::SkillCastAction );
}

void APlayerBase::SkillCastAction( const FInputActionValue & value )
{}

 

 

(5) PlayerKnight

header

...
	virtual void SkillCastAction( const struct FInputActionValue& value ) override;
...
#include "SkillBase.h"
..
void APlayerKnight::SkillCastAction( const FInputActionValue& value )
{
	UClass* skillClass = LoadClass<ASkillBase>( nullptr, L"/Script/Engine.Blueprint'/Game/Blueprint/Actor/BP_Skill.BP_Skill_C'" );
	if ( !IsValid( skillClass ) )
		return;

	FActorSpawnParameters params;
	params.Owner = this;
	params.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
	FVector pos = GetActorLocation() + GetActorForwardVector() * 100;
	ASkillBase* skill = GetWorld()->SpawnActor<ASkillBase>( skillClass, pos, GetControlRotation(), params );
	if ( skill )
		skill->SetLifeSpan( 5.f );
}

 

▶️ SetLifeSpan() : 라이프타임 설정. 인자 초 이후 자동으로 지워진다.

 

=> 위 작업까지 완료 후 실행하면

플레이어 앞에 스킬 오브젝트가 생성되고 5초후에 지워진다. 



 


 

 

2. 서버 동기화

 

1) PlayerKnight

header

public :
...
	UFUNCTION( Server, Reliable )
	void SkillCast_Server();
	void SkillCast_Server_Implementation();
public :
	...
	void SkillCast();

 

스킬 이펙트 생성 코드 SkillCast()로 이동

void APlayerKnight::SkillCast()
{
	UClass* skillClass = LoadClass<ASkillBase>( nullptr, L"/Script/Engine.Blueprint'/Game/Blueprint/Actor/BP_Skill.BP_Skill_C'" );
	if ( !IsValid( skillClass ) )
		return;

	FActorSpawnParameters params;
	params.Owner = this;
	params.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
	FVector pos = GetActorLocation() + GetActorForwardVector() * 100;
	ASkillBase* skill = GetWorld()->SpawnActor<ASkillBase>( skillClass, pos, GetControlRotation(), params );
	if ( skill )
		skill->SetLifeSpan( 5.f );
}

void APlayerKnight::SkillCast_Server_Implementation()
{
	if ( HasAuthority() )
		SkillCast();
}

void APlayerKnight::SkillCastAction( const FInputActionValue& value )
{
	SkillCast_Server();
}

=> 리슨서버, 플레이어 2명으로 설정하고 에디터를 실행하면

서버일때만 스킬을 생성한다.

두명의 플레이어 화면 양쪽에 생성된 스킬이 정상적으로 출력된다.

 

 




 

3. 스킬 앞으로 이동시키기 

 

▶️UProjectileMovementComponent 

: 투사체에 사용하는 이동형 컴포넌트

"GameFramework/ProjectileMovementComponent.h" 를 include해줘야 사용가능.

- SetUpdatedComponent() : 인자로 들어온 컴포넌트를 움직이도록 적용

- bSimulationEnabled : 시뮬레이션을 실행하고 업데이트 할건지 여부. 거짓일 경우 시뮬이 중지되지만, Component는 여전히 tick(보간 실행 허용) 된다.

- ProjectileGravityScale : 중력 적용. 0.f으로 입력시 중력 영향을 받지 않는다. 

- InitialSpeed : 초기속도. 0일 경우 velocity값을 재정의 하고 velocity를 방향으로 처리한다. 

- MaxSpeed : 최대 속도. 0일경우 한계를 두지 않는다는 의미  

- 참고링크

 

SkillBase.h

#include "GameFramework/ProjectileMovementComponent.h"
...
	UPROPERTY( EditAnywhere, BlueprintReadWrite )
	UProjectileMovementComponent* mMovement;

 

ASkillBase::ASkillBase()
{
	...
	mMovement = CreateDefaultSubobject<UProjectileMovementComponent>( L"Movement" );
	mMovement->SetUpdatedComponent( mEffect );
	mMovement->bSimulationEnabled = true;
	mMovement->ProjectileGravityScale = 0.f;
	mMovement->InitialSpeed = 1000.f;

	bReplicates = true;
}

=> 혹시 중력이 먹혀있거나 속도가 안먹혀있으면 블루프린트 가서 값 수정해주기

=> 실행하면 발사체 스킬이 앞으로 발사됨을 확인할 수 있다.



728x90

댓글