본문 바로가기

Unreal

(316)
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 5-27 데미지 적용 이제 실제로 데미지를 적용시켜주자. 데미지는 hit 한 순간에 적용되어야 하므로 우리가 만들었던 OnHit 함수에서 ApplyDamage 함수를 호출하게 된다. 먼저 해당 함수의 인풋 매개 변수를 체크해보자. 데미지 받은 액터, 기본 데미지, 컨트롤러, 데미지 입히는 액터, 데미지 타입을 필요로 하는 것을 알 수 있다. 우선 데미지 받은 액터는 OnHit 함수의 OtherActor에 해당하여 쉽게 할당이 가능하다. 다음으로 기본 데미지는 우리가 줄 데미지 수치로, 헤더에서 따로 선언해주자. 일단 초기 데미지로 50을 선언해주었다. 이제 컨트롤러다. 컨트롤러의 경우 다소 복잡하다. 우선 컨트롤러의 대상은 컴포넌트의 소유주이다. 따라서 GetOwner()를 통해 접근할 수 있다고 생각하지만, 현..
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 5-26 체력 컴포넌트 발사체가 무언가를 맞췄을 때 데미지를 입어야 한다. 따라서 데미지에 앞서 체력을 설정하기 위해 체력 컴포넌트 클래스를 생성해보자. 체력은 트랜스폼이나 어태치 기능이 필요없기에, 액터 컴포넌트 클래스로 생성해주자. 그리고 이어서 최대 체력과 현재 체력을 표시할 변수를 선언해주자. 우선은 체력을 최대 체력에서 시작하고, 데미지를 입으면 감소하게 된다. 따라서 BeginPlay에서 체력을 최대 체력으로 설정해주자. 이제 해당 컴포넌트를 블루프린트 클래스에서 탱크와 터렛에 추가해주자. 최대 체력은 언리얼에서도 편집이 가능하다. 이제 데미지에 대한 내용을 구현해야한다. 우선 언리얼 엔진에는 데미지 기능 또한 존재하며, 모든 액터는 데미지 이벤트를 상속받는다. 여기서 전 강의에서의 OnComponen..
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 5-25 타격(Hit) 이벤트 발사체가 파괴되기 위해서는, 마지막에 부딪히는 시점을 알아야 한다. 따라서 부딪히는 방식을 알기 위해 히트 이벤트에 대해 다루게 된다. 발사체는 UStaticMeshComponent이고, 해당 컴포넌트의 부모는 UPrimitiveComponent이다. UPrimitiveComponent는 히트 이벤트 생성이 가능하고 여기서 OnComponentHit이라는 변수가 존재한다. 해당 변수는 구조체 타입이며, 구성은 다음과 같다. 그리고 이 OnComponentHit이라는 히트 이벤트 멀티캐스트 델리게이트라고도 한다. 멀티캐스트 델리게이트는 여러 개의 함수 바인딩이 가능하다. 또한 바인딩된 함수는 인보케이션 리스트라는 곳에 저장된다. 이 인보케이션 리스트가 히트 이벤트가 호출하라고 하면 호..
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 5-24 발사체 이동 컴포넌트 현재 발사체가 고정되어있는 상태이므로, 이름에 맞게 발사시켜주어야 한다. 이를 위해서는 직접 위치를 설정시킬 수 있고, 임펄스를 추가해줄 수도 있으나, 우리는 언리얼에 내장된 기능인 발사체 이동 컴포넌트를 사용하여 발사시켜줄 것이다. 이를 위해 우선 발사체 클래스에서 해당 컴포넌트를 생성해주어야 한다. 생성하고 나면 해당 컴포넌트를 통해서 최대속도 및 기초속도와 같은 변수에 접근할 수 있다. 해당 값들을 직접 설정해주자. 이제 컴파일을 해보면 발사체 블루프린트 클래스에 컴포넌트가 추가되었고, 초기속도와 최대속도 변수도 값이 설정된 것을 볼 수 있다. 이제 플레이를 해보면 탱크와 터렛 모두 발사체가 무사히 발사되는 것을 볼 수 있다. 하지만 설정된 속도만큼 이동한 이후에 여전히 멈춰있..
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 5-23 발사체 생성 이제 발사체가 생성되는 것을 구현해줄 차례이다. 우리는 발사체를 생성되는 것을 VScode 내의 Fire 함수를 통해 하게 된다. 이때 발사체에 적용한 메시를 알아야 하는데, 이는 언리얼 블루프린트를 통해서 설정한 정보이다. 이렇게 블루프린트에서 설정한 정보를 C++에서 접근하기 위해서는 TSubclassOf가 사용된다. TSubclassOf는 UClass 타입을 반환하게 된다. UClass 타입은 클래스 타입이지만 C++와 블루프린트 사이 정보를 교환할 수 있는 언리얼 엔진의 리플렉션 시스템과 상호작용이 가능하다. 우리가 액터를 생성하는데 사용할 SpawnActor 함수의 첫 번째 인풋 매개 변수가 이 UClass 타입을 사용하게 된다. 먼저 TSubcalssof를 사용하여 AProject..
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 5-22 Projectile 클래스 발사하기 위한 작업을 마쳤으므로, 실제 발사체를 만들어준다. 따라서 발사체에 대한 C++ 클래스를 먼저 생성한다. 월드에 배치되기만 하면 되기에, 부모 클래스로 액터를 선택해준다. 발사체는 메시를 필요로 하므로, 이에 UStaticMeshComponent 타입 포인터가 필요하다. 그리고 전에 몇 번 했던 것과 똑같이 CreateDefaultSubobject 함수를 통해 컴포넌트를 생성해준다. 그리고 발사체는 Tick에 대한 내용이 굳이 필요없으므로, 생성자에 있는 Tick을 false로 바꿔주었다. 이렇게 만든 클래스를 바탕으로 블루프린트 클래스르를 만들어주고, 해당 스태틱 메시 컴포넌트에 발사체 메시를 넣어주면 된다.
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 5-21 타이머 탱크에서 Fire가 가능하도록 해줬으니, 타워에서도 가능하게 해줄 차례이다. 타워는 탱크를 보면 알아서 Fire를 해야하므로 타이머를 사용하도록 하였다. FTimerManager라고 하는 클래스로 타이머 설정이 가능하며, 이는 GetWorldTimerManager() 함수를 통해 얻게 된다. 이후 SetTimer 함수를 통해 실질적인 타이머 설정을 하게 된다. 이때 필요한 인풋 매개 변수들이 있는데 우선 타이머를 관리하는 타이머 핸들이 필요하다. 이를 위해 따로 선언해주어야할 필요가 있으며, 마찬가지로 타이머가 실행되기까지 걸리는 시간에 대한 변수와 콜백 함수가 필요하여 각각 선언 및 구현을 해줄 필요가 있다. 콜백 함수는 언제 발사할지의 여부이다. 우리는 타워의 일정 범위내에 도달하면 타워가 탱..
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 5-20 Fire 탱크는 발사체를 발사해야 하지만, 아직 이와 관련된 함수가 없다. 우리는 프로젝트 세팅에서 액션 매핑으로 Fire가 마우스 좌클릭으로 있었던 것을 알고 있기에, 여기에 바인드할 함수를 구현해주어야 한다. 해당 함수 자체는 터렛과 탱크 모두에게 필요하다. 따라서 베이스폰에서 해당 함수를 구현하게 된다. 탱크에서는 입력을 통해 발사가 이루어지기에 바인드 작업이 필요하다. 축 매핑의 경우 BindAxis 함수를 통해 바인드 작업을 해줬지만, 액션 매핑의 경우 BindAction 함수를 통해 바인드 작업을 하게 된다. 동작 매핑은 축 매핑과 다소 다른데, 우선 동작 매핑은 일회성이기에 모든 프레임에서 실행되지 않는다. 또한 축 매핑의 스케일 값과 같은 인풋 매개 변수가 존재하지 않는다. 버튼이 눌렸는지..