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;
}
=> 혹시 중력이 먹혀있거나 속도가 안먹혀있으면 블루프린트 가서 값 수정해주기
=> 실행하면 발사체 스킬이 앞으로 발사됨을 확인할 수 있다.
'Unreal Engine5 > KDT 2024' 카테고리의 다른 글
[UE5 KDT2024] 34. AIPerception (0) | 2025.03.18 |
---|---|
[UE5 KDT2024] 33. 스킬 생성 2편 (0) | 2025.03.17 |
[UE5 KDT2024] 31. SpawnActor Deferred (0) | 2025.03.15 |
[UE5 KDT2024] 30. SpawnActor (0) | 2025.03.14 |
[UE5 KDT2024] 29. 애님 노티파이 클래스 (0) | 2025.03.13 |
댓글