
Turn at Rate이번엔 회전에 대해서 구현해보자.구현하기에 앞서 직전 강의 내용인 델타 타임에 대해서 알 필요가 있다. 델타 타임은 간단하게 말하여 각 프레임 간의 시간 차이 값으로, 두 프레임 사이에 경과한 시간을 측정한 값이다.이는 게임의 프레임 률이 일정하지 않더라도 물리적이나 애니메이션 움직임 등의 일관성 유지를 위해 사용된다.이번 구현 대상인 회전의 경우 프레임 률에 따라서 회전 속도에 큰 차이를 가질 수 있으므로, 델타 타임을 이용하여 회전 속도를 조절하게 된다. 델타 타임을 사용하는 것 말고는 상하좌우 이동 때와 거의 동일하게 구현해주면 된다.대신 여기서는 추가적으로 기본 프레임 률을 얼마로 설정할 지에 대한 변수를 추가로 선언해주어야 한다. 기본 프레임 률을 우선 45로 정했으며, 생..

Move Forward and Right직전 내용으로 컨트롤러 및 입력에 대한 내용이 있었는데, 강의로만 짧게 설명한 개요 같은 부분이라 생략한다.이에 따라 이번 강의 내용은 기본적인 플레이어 움직임에 대해 다루게 된다. 우선 프로젝트 세팅의 Input 항목으로 가서 Axis 매핑을 작성해주어야 한다.앞뒤에 대한 WS 키와, 좌우에 대한 AD 키를 할당해주자.Scale 키는 정방향 역방향에 맞게 1.0과 -1.0을 할당해주면 된다. 이제 이에 대한 함수를 만들어주어야 한다. 이제 본격적으로 구현하기에 앞서 현재 Controller가 유효한지 체크를 해주자.그리고 컨트롤러의 회전 값을 얻고, 거기서 x축에 해당하는 Yaw 값만 따로 저장해준다.이후 해당 Yaw 회전 값을 통해서 x축에 대한 방향 값을 얻어..

Follow Camera이제 카메라 또한 SpringArmComponent와 같은 방법으로 생성해주자. 카메라의 경우 플레이어와 같이 회전하면 안되므로, bUsePawnControlRotation을 false로 할당해준다.그리고 카메라의 경우 카메라붐에 붙여줄 때 소켓네임 또한 같이 적어주었다.이러면 특정 소켓에 카메라를 위치시켜주는 것이 가능하다.해당 코드에서는 소켓이 1개인 상태이므로 소켓네임을 빈칸으로 해도 같은 결과가 나온다. 이제 컴파일을 해보면 카메라가 추가된 모습을 볼 수 있다.

Camera Spring Arm이번엔 카메라의 위치와 각도 등을 조절하는 데 사용되는 SprintArmComponent를 생성해줄 것이다.이는 Camera Boom 이라고도 한다. private 섹션에서 작성해주고, 어디서나 볼 수 있고 블루프린트에서 읽을 수 있게 설정해주었다.private 섹션인데 블루프린트에서 읽을 수 있으려면 추가로 meta = (AllowPrivateAccess = "true")를 작성해주어야 한다. 그리고 public 섹션에서 해당 컴포넌트에 대한 getter 함수를 작성해주었다.이때 FORCEINLICE을 사용하여 인라인 함수로 작성하였는데, 이는 getter 함수 특성상 호출이 빈번하면서 내용은 간단한데 이러한 함수의 호출 오버헤드를 줄여 성능을 높이기 위해 사용된다. 이제..

UE_LOG with FStringulog에 대한 마지막 강의이다.이번엔 FString에 대해 알아보게 된다.언리얼에서는 주로 FString을 사용하는데, 일반적인 String 보다 다양한 문자와 언어를 지원한다.그리고 기본적으로 언리얼에서 API와 클래스에서 대부분 FString을 사용하여 문자열을 처리한다. 문자열의 경우 넘길 변수 앞에 * 을 작성하는 것을 잊으면 안된다.%s 포맷 지정자는 C 스타일 문자열을 받는데, 이는 포인터 타입이기 때문에 *을 작성해주어야 한다. 그리고 GetName() 함수를 통해 현재 인스턴스의 이름을 알 수 있다.앞서 설명했듯 언리얼에서 API와 클래스에서 대부분 FString을 사용한다고 했는데, GetName() 함수 또한 FString을 반환한다. 컴파일 하고 ..

UE_LOG Format Specifiers저번에 이어서 ulog에 대해 더 자세히 알아보자.이번엔 사용되는 지정자에 대해 간단히 알아본다. 저번엔 int만 사용했지만, float, double, char, bool 등 여러 지정자들이 존재한다.이에 대해서도 간단히 ulog를 통해 테스트해보자. int의 경우 %d를 사용했지만, 지정자에 따라 다른 % 값을 사용하는 것을 볼 수 있다.bool의 경우 int로 변환이 간단하기에 %d를 사용하게 된다. 그리고 여기서 wideChar가 다소 생소한데, char 보다 더 많은 바이트를 사용하여 문자를 표현하는 데 사용된다.주로 다국어 문자나 특수 문자 등이 이에 해당된다. 컴파일 해보면 다음과 같다. 한 번에 여러개를 지정하는 것 또한 당연히 가능하다.

UE_LOG Format String - Int이번엔 ulog에 대해 잠시 배워보는 시간을 가진다.이는 언리얼 엔진의 로그에 출력하는 기능으로, 디버깅 할 때 체크하는 용도로 요긴하게 사용이 가능하다.ulog만 쳐도 자동완성으로 인해 긴 문장을 한 번에 완성시키는 것이 가능하다. 간단한 문장을 출력해보자.해당 ulog는 캐릭터 클래스에서 작성해보자.Warning이라 쓰면 출력 부분에서 노란색으로 강조할 수 있다.자동완성시 기본 값은 display이다. 인트 값도 할당해보자.해당 강의에서는 {}을 이용한 통합 초기화 방식을 사용하였다. 이제 컴파일하고 출력해보면 로그창에서 해당 문구들을 볼 수 있다.

Character Class이번엔 캐릭터 클래스를 만들어 주자. 이어서 해당 클래스르 기반으로 BP 클래스도 생성해주자. 해당 BP 클래스로 들어가 보면 구성 요소를 볼 수 있다.특히 해당 클래스가 캐릭터 기반이므로 캐릭터 무브먼트를 가지는 것을 볼 수 있다. 캡슐 컴포넌트를 누르고 디테일 패널에서 Hidden in Game의 체크를 비활성화하면 게임 플레이에서도 캡슐 컴포넌트를 볼 수 있게 된다. BP 게임 모드에서 디폴트 폰 클래스도 방금 생성한 BP 캐릭터로 바꿔주자. 이제 게임을 실행해보면 BP 캐릭터 클래스가 존재하는 모습을 볼 수 있다.

Project Setup섹션 1에 대한 내용은 간단한 소개 내용 및 설치에 관한 내용이므로 생략한다.이번 강의는 간단하게 세팅하는 과정이다.또한 이번 섹션 자체가 기본적인 세팅에 대한 전반적인 내용을 다루게 된다. 그리고 사용할 폴더들도 미리 생성해두자. 현재 맵을 저장하고, 이를 기본 맵으로 설정해두자. 강의에서는 GameModeBase에 대한 Cpp와 Header 파일이 프로젝트 생성부터 같이 생성되었는데, 본인 환경에는 생성되지 않아 만들어주었다.강의는 언리얼 4이고, 본인 환경은 언리얼 5여서 그런 것 같다고 추측만 하고 있다. 이를 토대로 블루프린트 클래스도 생성해주자. 우측 상단 세팅에서 월드 세팅을 활성화 해주고, 여기서 만든 BP 클래스를 GameMode에 할당해주자. 다음으로 맵을 할당했..

마무리 및 도전 과제이제 마무리 할 차례이다.배경음악과 간단한 인트로 음악을 생성해주자.우선 배경음악은 액터 배치 패널에서 사운드를 화면에 끌어다주자. 이후 우측 하단의 디테일 패널에서 사운드를 할당할수 있다. 이제 인트로 음악이다.인트로 음악은 말그대로 인트로 역할을 하기에 게임 시작시 간단하게 음악이 재생된다.따라서 BP_PlayerShooterCharater 에서 Beginplay에 연결하여 사운드를 설정해주자.이때 사용하는 함수는 Play Sound at Location 이다. 컴파일을 해보면 시작 시 인트로 음악이 재생되다가 이어서 설정한 배경 음악이 재생된다. 주어진 도전과제로는 레벨 레이아웃 확장, 무기 스위칭, 탄약 시스템, 더 진보된 AI 등이 존재한다.특히 무기 스위칭 및 더 진보된 A..

복잡한 스테이트 머신 다시 EventGraph로 돌아가서 is Falling 함수를 통해 is Airborne의 값을 할당해주자.이 상태에서 컴파일하고 플레이해 보면 바로 점프시 애니메이션이 바뀌는 것을 볼 수 있다. 완성도를 높이기 위해서 점프하고 있는 순간의 애니메이션을 추가해주자.스테이트를 추가하고, 기존 Grounded에 연결해주면 된다. 다음으로 점핑 -> Airborne 변환이다.변환 부분을 더블 클릭하지말고 한 번만 누르면 디테일 패널을 볼 수 있다.여기서 Automatic Rule Based on Sequence Player in State 옵션을 활성화 해주자.이를 활성화 해주면 점핑 애니메이션을 마추고 자연스럽게 Airborne 애니메이션으로 넘어가게 된다.그리고 하단의 블렌드에서 지속..

애니메이션 스테이트 머신스테이트 머신이라는 애니메이션 블루프린트의 새로운 요소를 사용해보자.이를 사용해 점프 애니메이션을 할당하게 된다.우선 기존의 AnimGraph에서 우클릭을 하면 스테이트 머신을 생성할 수 있다. 이후 생성된 스테이트 머신을 더블 클릭하고 해당 화면에서 여러가지 스테이트를 생성 및 연결하면 다음과 같은 화면을 만들 수 있다. 여기서 또 State를 더블 클릭하여 들어가면 애니메이션을 할당할 수 있다.테스트 용도이기에 간단하게 아무 애니메이션 하나를 할당해주었다. 이제 다른 State로 변경되는 조건을 보자.화살표로 연결된 좌측의 버튼을 누르면 State와 마찬가지로 변경 조건을 할당할 수 있다. 예시로 죽었을 때의 조건을 달아보았다. 이제 실제로 할당해보자.위에 내용은 테스트 삼아 ..

에임 오프셋(AimOffsets)플레이어가 정면을 바라보고 사격하면 에임이 정상적이지만,위나 아래를 보고 사격하면 그에 맞게 방향이 돌아가지 않는다.이를 수정하기위해 에임 오프셋을 적용해주자.이는 애니메이션에서 확인할 수 있다. 해당 애니메이션은 additive 애니메이션으로 기존 애니메이션에 더하여 사용된다.따라서 달리는 와중에도 에임 조정이 가능해진다. 이를 위해 AnimGraph에서 해당 에임 오프셋을 배치해주자.그리고 Pitch 값을 180으로 두고 컴파일 하면 위를 바라보는 것을 볼 수 있다. pitch 값을 변수로 승격시켜주고, event graph에서 해당 값을 적용해주자. 기존 Event graph에 더해 너무 길어져서 Sequence 노드를 통해 약가느이 정리를 해주었다.그리고 Get ..

체력 바 게임의 완성도를 추가적으로 높이기 위해 좌측 하단에 체력 바를 만들어주자.기존 HUD를 이용하여 만들어주는데 우리는 progress 바를 사용한다.progress 바에는 퍼센트가 존재하며, 이를 통해 체력을 조절하게 될 것이다. 색상도 원하는 대로 변경해주자. 플레이해보면 크로스헤어와 같이 체력 바도 같이 보인다.하지만 실제 체력과 연동은 되지 않은 상태이므로, 이에 대한 작업을 해주어야 한다. ShooterCharacter 클래스에 체력 퍼센트를 얻기 위한 함수를 선언해주자.블루프린트에서 접근해서 작업할 것 이기에, UFUNCTION으로 선언해준다. 구현 내용은 간단하다.현재 체력 / 최대 체력으로 비율을 구해주면 된다. 이제 이를 연동시켜주어야 하는데, Percent에 Create Bind..

크로스헤어와 HUD지금 총을 발사할 수 는 있지만, 조준점이 잘 보이지 않는다.이를 보완하기 위해 크로스헤러를 추가해주자.이를 위해 위젯을 생성해주자. 해당 위젯에서 텍스트를 통해 + 크로스 헤어를 생성해준다. 이제 해당 위젯을 생성해주어야 한다.크로스헤어는 게임 시작할 때부터 있어야 하므로 BeginPlay 함수 내에 생성해주어야 한다.ShooterPlayerController 클래스에는 BeginPlay 함수가 없으므로 먼저 생성해주자. 그리고 저번에 승리패배 화면과 마찬가지로 구현해주자. 마찬가지로 컴파일하고 할당해주자. 실행해보면 다음과 같이 크로스헤어가 생성되었다.너무 큰 것 같아서 크기를 더 작게 조정해주었다. 크로스헤어는 게임 종료시 필요가 없다.따라서 이겼거나 졌을 때 크로스 헤어를 삭제시..