
Weapon Ammo in C++이제 Ammo에 대해 코딩을 해주자.우선 Weapon 클래스에서 변수 및 초기화부터다. private에 선언했으므로 public에서 getter() 함수도 생성해주자. ShooterCharacter 클래스에서 Ammo을 가지고 있는 지에 대한 체크 함수를 생성해주자. 이를 토대로 기존 몇 가지 함수를 체크해주어야한다.주로 총을 발사하는 부분으로, 탄약이 있어야만 총을 발사할 수 있다. 다시 Weapon 클래스로 돌아와서 총알 감소에 대한 함수를 작성해주자. 총알 감소는 FireWeapon() 함수를 통해 총알 발사를 실시할 때마다 호출되어야 할 것이다.

Draw Ammo Count to Screen만들어준 위젯을 이제 보이도록 만들어주자.이를 위해 새롭게 플레이어 컨트롤러 클래스를 만들고, 여기서 위젯을 할당할 것이다. public 섹션을 만들고 우선 생성자 부터 만들어주었다. 다음으로 오버레이용 위젯을 만들어 줄 것이다.해당 위젯을 통해 직전에 만든 위젯을 오버레용 위젯을 또 만들어서 여기다가 배치해줄 것이다. 캔버스 패널을 만들고 BP_Ammo Count를 배치하고 앵커를 중앙 하단으로 설정하였다. 플레이어 컨트롤러 클래스에서 BeginPlay() 함수와 위젯을 위한 변수들도 생성해주자. 오버레이용 위젯 클래스가 유효한지 체크후, 해당 위젯을 할당해주자.해당 위젯을 뷰포트로 추가할 것이고, enum 클래스 옵션인 ESlateVisibility의 Vi..

Ammo Count Widget이제 위젯을 생성해주자.우선 9mm에 대한 위젯을 생성할 것이지만,이후 AR ammo도 사용할 것이기에 강의 자료에서 해당 아이콘을 다운받아 주자. 그리고 위젯을 생성해주자. 해당 위젯 크기는 바로 Custom으로 설정해주자. 전부 겹치길 원하므로 우선적으로 오버레이를 할당해주고,전에 위젯을 생성했을 때와 마찬가지로 Horizontal Box와 Vertical Box을 조합하여 만들어줄 것이다.Fill을 통해 구역 나누기와, 정렬을 이용하게 된다.글꼴도 원하는대로 바꿔주면 된다.이에 대한 세세한 내용은 생략한다.

섹션 7의 90, 91강의는 에셋 호환이 불가능하여 강의 시청만 하였다.간단하게 내용을 요악하자면 장전하는 애니메이션을 다운받아 기존 애니메이션 에셋으로 조정하는 내용이다.Ammo총알 또한 위젯으로 보여주기 위한 작업을 해주자.총기가 여러개이므로 총알 또한 여러 종류을 가지게 될 것이다.우리는 9mm와 AR용 2가지를 사용할 것이며, 이에 TMap을 활용할 것이다. 우선 enum class로 총기 종류를 만들어주자. 이어서 TMap으로 enum 클래스와 해당 총기에 따른 탄약 개수를 할당하기 위해 int를 쌍으로 묶어주자.그리고 각 탄약에 대한 개수를 위한 변수도 2개 선언하고 초기화해주자. 이제 AmmoMap을 위한 함수도 생성해주자. 각 탄약과 사전에 초기화 해준 탄약 개수 변수들을 묶어서 할당해줄 ..

Interp Scale보간을 진행하면서 떨어지는 순간에는 기존 총기의 크기를 줄이고 싶다.이를 위해 또다른 Curve가 필요하다. 이번 커브의 형태는 다음과 같다. 해당 커브를 ItemInterp() 함수에서 경과시간에 따른 Value 값을 얻고 이를 토대로 Scale을 해주자. 그리고 보간이 끝나면 다시 원상태로 되돌려주자. 현 상태는 보간 시간이 0.7초로 매우 빠르기 때문에 실제로 스케일링이 이루어지는지 확인이 어렵다.잠시 ZCurve Time을 3초로 바꾸고, Curve 값들도 이에 맞춰 조정해주자.기존 원본을 토대로 복사본을 만들어서 진행할 것이다. 이제 해당 커브들을 할당해주자.ItemZCurve는 실수로 원본에서 조정했기 때문에 편집된 원본을 사용하였다. 이제 3초에 걸쳐 느리게 보간 되므로..

Interp Rotation현재 보간 중에 문제점이 있는데,Interping 하는 도중 화면을 회전시키면 Interping 중인 총기 또한 같이 회전하는 문제이다.이번 강의에서 초기 총기의 회전 값을 그대로 유지하도록 수정해줄 것이다. 우선 초기 InterpYaw 값을 위한 변수를 하나 선언하고 초기화해주자. 그리고 Curve를 시작하는 함수에서 Camera의 회전 Yaw 값과, Item의 회전 Yaw 값을 얻어주자.이어서 이 둘을 통해 상대적인 회전 값을 얻어주자. 이제 ItemInterp 함수에서 회전 값을 설정해주자.이제 카메라의 회전 값에 방금 전에 구한 회전 차이 값을 더해줌으로서 카메라가 회전할때 같이 회전하여 카메라와 같은 회전 상태를 가지게 된다.

Interp Item X and Y저번 강의에서는 Z 값만 보간하였는데 이번엔 X와 Y 값에 대해서도 보간해주자.이를 위한 변수와 초기화를 먼저 해주자. 이후 기존 ItemInterp 함수에서 X와 Y 값에 대해서도 보간을 해주자.GetActorLocation 함수를 통해 현재 위치를 얻고, FInterpTo 함수를 통해서 보간을 하게 된다.각각 X, Y 값을 CameraInterpLocation의 X, Y 값으로 보간을 해주고,해당 값을 ItemLocation의 X, Y 값으로 할당해주면 된다. 만약 위치가 마음에 들지 않는다면 BP_ShooterCharacter 클래스에서 Camera Interp에 대한 변수 값을 조절해주자.

Following the Z Curve저번 코드에 Interping이 끝났을 떄 Interping 여부를 false로 바꿔주는 것을 추가해주고 시작하자. 그리고 기존의 SelectButtonPreseed/SelectButtonReleased 함수를 수정해주자.E 버튼을 눌렀을 때 트레이스한 아이템에 대해서 StartItemCurve를 호출해주자.놓았을 때는 일단 아무것도 하지 않게 두었다, 이제 Z 값에 대해 커브 곡선을 이용해 보간을 시켜주자.이를 위한 함수부터 생성해주자.해당 함수는 Tick을 통해 실행될 것이다. 해당 함수에서는 우선 Interping 여부부터 체크해주자.그리고 캐릭터와 ZCurve 값이 유효한지도 체크해주어야 한다. 이후에 경과시간을 우선적으로 구하고, 경과시간을 바탕으로 현재 ..

Item Interp Variables이제 필요한 변수들을 선언해주자.보간이 시작되는 위치, 카메라 타겟 위치, 보간 여부, 보간에 사용될 타이머, 타이머 시간, 캐릭터에 대한 변수이다. 이어서 생성자에서 초기화 해주자. 이제 Curve를 시작하기위한 함수를 만들어주자. 현재 캐릭터를 할당하고, 위치 또한 GetActorLocation() 함수를 통해 설정해주자.이제 보간을 시작하므로 bInterping = true로, 상태또한 EIS_EquipInterping으로 할당해주자.이제 타이머를 통해 ZCurveTime 동한 이를 시행해주자. 타이머에 연동된 콜백 함수도 필요하다. 현재 캐릭터를 체크하고, 해당 캐릭터를 통해 현재 아이템을 집도록 하자.해당 함수에서 아이템이 무기가 맞다면 무기 교체를 실시한다.

Item Z Curve무기가 특정 위치에 부드럽게 이동하도록 하기 위해 ZCurve를 이용할 것이다.우선 CurveFloat 변수를 선언해주자. 그리고 언리얼에서 커브를 직접 생성해주어야 한다. 휠 버튼 또는 우클릭 Add key 버튼을 통해 포인트를 생성하자.우선 첫 번째 포인트는 0.0, 0.0으로 지정하였다. 이어서 다음 지점도 생성해주었다.나머지도 강의에 따라 생성하였다. 모든 포인트들을 드래그하고 F을 누르면 그래프에 맞게 확대축소가 조절된다. 지금은 뾰족한 상태이니 이를 둥글게 만들어주자.우클릭하여 Auto를 누르면 둥글게 바뀐다. 각 포인트에 존재하는 핸들을 조절하여 추가적인 각도 조절이 가능하다. 핸들을 우클릭하고 Break을 누르면 핸들에 대해서 좌측, 우측 개별로 조절도 가능하다.

Camera Interp Location지금은 무기를 교체할 때 무기가 바로 스왑된다.무기를 바꾸기 전에 교체될 무기가 잠시 위쪽에 표시됐다가 이후에 바뀌도록 수정해보자.해당 과정은 보간을 통해 조절될 것이다. 먼저저 표시될 위치가 필요하다.목표 작업은 다음과 같다. 우선 위치를 얻기 위한 함수를 작성해주자.해당 함수는 다른 곳에서 사용되는 함수이기에 ShooterCharacter 클래스에서 public 섹션에 작성해주어야 한다. 앞에 대한 거리와, 위에 대한 거리 변수를 선언해주자. 이어서 생성자에서 초기화 해주자. 기존 FollowCamera를 통해 카메라 위치를 얻고, GetFowardVector를 통해 해당 카메라의 전방 벡터를 얻어주자.전방 벡터에 앞에 대한 거리 값을 곱해 실제 거리를 얻고,이..

Swap Weapon이제 무기를 바꿔보자.이를 위해 트레이스한 아이템에 대해서 알아야 한다.이에 대한 변수를 선언해주자. 함수 또한 생성해주자.인풋 매개 변수는 Awepon* 타입이다. 무기를 바꾸기 위해서는 기존 무기를 떨어뜨려야한다.따라서 DropWeapon() 함수를 호출하고, 이어서 EquipWeapon() 함수를 호출하여 새로운 무기를 장착하자.그러면서 TraceHitItme과 TraceHiItemLastFrame 값을 nullptr로 바꿔주자.기존에 추적하던 무기를 이제 장착한 상태이기에 다시 새로운 무기를 장착하기 위해 초기화해주는 것이 좋다. 그리고 SelectButtonReleased 함수를 이용하여 SwapWeapon() 함수를 호출해주자.E를 누르면서 무기를 버리고, 트레이스 한 아이..

Throw Weapon지금은 E키를 누르면 무기가 그대로 떨어지지만, 좀 더 날아가서 떨어지도록 바꿔보자.Weapon 클래스에서 해당 기능을 구현할 것이기에 헤더에서 생성자랑 관련 함수, 변수들도 선언해주자. 생성자에서 변수들을 초기화해주고, Tick을 활성화하는 문구도 적어주었다. 다음으로 무기가 멀리 나가는 함수를 작성해주자.현재 회전 값을 얻고, 이를 토대로 WorldRotation을 세팅해준다.이떄 ETeleportType::TeleportPhysics 값을 사용하여 물리적 시뮬레이트를 즉시 업데이트하여 순식간에 이동하도록 해준다. 이후 전방 벡터와 right 벡터를 얻고 이를 토대로 충격 방향을 설정한다.그리고 Z축으로 30도의 충돌값을 추가로 설정하고, 충돌 방향에 크기를 곱해준다.이를 토대로..