[ Unreal Engine 5 / #8 attack 기능 ]

SeungWoo·2024년 9월 10일
0
post-thumbnail

bullet

bullet처럼 마법을 시전할 Projectile를 하나 만들 예정이다 관련 C++ 클래스를 하나 만든다

CPBullet.h

public:
	// Component로 붙는 아이는 protected로
	UPROPERTY(VisibleAnywhere, Category = Movement)
	class UProjectileMovementComponent* PMovementComp;

	UPROPERTY(VisibleAnywhere, Category = Movement)
	class USphereComponent* SphereCollComp;

	UPROPERTY(VisibleAnywhere, Category = Movement)
	class UStaticMeshComponent* SMeshComp;
  • 관련 Component를 선언한다

CPBullet.cpp

#include "Components\SphereComponent.h"
#include "GameFramework\ProjectileMovementComponent.h"

ACPBullet::ACPBullet()
{
 	// 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;

	SphereCollComp = CreateDefaultSubobject<USphereComponent>(TEXT("MainCollider"));
	SphereCollComp->SetCollisionProfileName(TEXT("BlockAll"));
	SphereCollComp->SetSphereRadius(13);
	RootComponent = SphereCollComp;


	SMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
	SMeshComp->SetupAttachment(RootComponent);
	SMeshComp->SetCollisionEnabled(ECollisionEnabled::NoCollision);


	// 포물체 컴포넌트 생성 
	PMovementComp = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("PMovementComp"));
	// 발사체 컴포넌트를 Update 시킬 대상( 컴포넌트 ) 지정
	PMovementComp->SetUpdatedComponent(SphereCollComp);
	PMovementComp->InitialSpeed = 3000.0f;	// 초기속도
	PMovementComp->MaxSpeed = 5000.0f;		// 최대속도
	PMovementComp->bShouldBounce = true;	// 반동
	PMovementComp->Bounciness = 0.3f;		// 반동 크기
}
  • 임시 mesh 설정 및 적적할 사이즈, 위치 배치하기

Weapon mesh

http://naver.me/G1swox94

  • 총알 스폰을 위한 Fire 발사 기능을 만들어 보자

CTPSPlayer.h

public:
	UPROPERTY(EditAnywhere, Category = EquipItem)
	class UStaticMeshComponent* WeaponMeshComp;

	UPROPERTY(EditAnywhere, Category = Fire)
	TSubclassOf<class ACPBullet> magazine;

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input)
	UInputAction* FireIA;

	void InputFire(const FInputActionValue& value);    
    
ACTPSPlayer::ACTPSPlayer()
{
	... 생략
    
	WeaponMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("WeaponMesh"));
	WeaponMeshComp->SetupAttachment(GetMesh());    
}

void ACTPSPlayer::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	if (UEnhancedInputComponent* EnhancedInputComponent = CastChecked< UEnhancedInputComponent>(PlayerInputComponent))
	{
		.. 생략 .. 
		EnhancedInputComponent->BindAction(FireIA, ETriggerEvent::Started, this, &ACTPSPlayer::InputFire);
	}
}

void ACTPSPlayer::InputFire(const FInputActionValue& value)
{
	FTransform _firePostion = WeaponMeshComp->GetSocketTransform(TEXT("FirePosition"));
	GetWorld()->SpawnActor<ACPBullet>(magazine, _firePostion);
}

Projectile LifeCycle - 총알 삭제

  • Initial LifeSpan 을 활용한 방법

CPBullet.cpp

ACPBullet::ACPBullet()
{
	...생략
    InitialLifeSpan = 2.0f;					// 생명 길이
	// Actor에 나오는 기능
}
  • Timer 구현법

CPBullet.h

public:
	void Die();

CPBullet.cpp

void ACPBullet::BeginPlay()
{
	Super::BeginPlay();
	
	// Timer -> 시간 개념 -> 쓰레드를 독립적으로 할당
	FTimerHandle _deathTimer; // 쓰레드를 독립적 할당
	GetWorld()->GetTimerManager().SetTimer(_deathTimer, FTimerDelegate::CreateLambda([this]()->void { Destroy();}), 2.0f, false);

}

void ACPBullet::Die()
{
	Destroy();
}

Lamda

익명 함수로, 함수를 직접 정의하지 않고도 코드 블록을 만들어 사용할 수 있는 방법

  • 구성요소
    • capture : 외부에 정의된 변수나 상수 구현 사용
    • parameters : 함수에서 사용할 인수 목록
    • return type : 함수의 반환 유형
    • statement : 함수의 구현부
  • 특징
    • 간결성과 가독성
      • 람다식을 사용하면 간결한 코드를 작성할 수 있습니다. 함수 객체나 함수 포인터를 정의하는 번거로움을 줄여주며, 코드를 읽고 이해하기 쉽게 만들어줍니다.
    • 지역 함수 정의
      • 람다식을 사용하면 함수를 다른 함수 내에 정의할 수 있어서, 해당 함수 내에서만 사용하는 함수를 간단하게 선언하고 사용할 수 있습니다.
    • 캡처 기능
      • 람다는 외부 변수를 캡처하여 사용할 수 있습니다. 이는 람다가 정의된 범위 내의 변수를 사용할 수 있게 해주는데, 이는 함수 객체나 함수 포인터에서 어려웠던 작업이었습니다.
    • 유연성
      • 람다식은 함수처럼 사용될 수 있기 때문에, 함수를 매개변수로 전달하거나 반환하는데 유용합니다. 이는 함수형 프로그래밍과 유사한 패턴을 사용할 수 있게 해줍니다.

람다 테스트

  • 설명
    • &sum
      • 람다 함수는 외부 범위의 변수를 캡처할 수 있는데, 이 경우 &sum을 사용하여 참조로 캡처합니다. 즉, 람다 함수 내에서 sum을 수정하면 외부의 sum 변수에 영향을 미칩니다
    • ( int number )
      • 람다 함수는 하나의 매개변수 number를 받습니다. 이는 정수형 변수이며, 호출할 때 해당 값이 전달됩니다.
    • -> void
      • 함수의 리턴 타입을 명시적으로 void로 지정했습니다. 리턴 값이 없다는 의미입니다. 실제로 이 부분은 생략할 수 있습니다. 생략하면 컴파일러가 자동으로 리턴 타입을 추론합니다
    • { sum += number; }
      • 람다 함수의 본체입니다. 외부에서 참조로 캡처한 sum 변수에 number를 더하는 연산을 수행합니다.

람다 TEST

profile
This is my study archive

0개의 댓글