
Limit Pickup and Equip Sounds총알 6개를 한 번에 픽업할 때 사운드가 증폭되어 상당히 시끄럽게 들린다.이를 Timer를 통해 조절해보도록 하자. 먼저 픽업 및 장착에 대한 사운드와 사운드에 대한 bool 변수, 그리고 픽업 및 장착에 대한 사운드 타이머 리셋 함수 (콜백 함수)와 각 리셋을 위한 시간 변수가 필요하다. 각 bool 값에 대해선 getter() 함수를 생성해주고, 이어서 public 섹션에 타이머를 시작하기 위한 함수들도 작성해주자. reset 함수는 간단하게 각 bool 변수 값을 true로 설정하면 된다.타이머 시작함수들은 각 Sound 값을 false로 만들고, SetTimer() 함수를 호출한다. 그리고 Item() 클래스에서 사운드를 위한 함수를 따로 만들어..

Interp to Multiple Locations이제 실제로 보간해주는 작업을 구현해주자.먼저 보간할 각 위치에 대한 Index를 얻는 함수를 구현해주자. 인덱스의 경우 ItemCount을 통해 계산하게 된다.총알이 여러개 있을 경우 기본적으로 ItemCount가 0인 첫 번째 총알을 반환할 것이다.다음으로 ItemCount가 증가했으므로 다시 해당 Count보다 작은 값을 찾게 된다.처음에 초기화 했을 때 전부 ItemCount을 0으로 했기 때문에 바로 다음 인덱스를 가르키게 된다.이를 반복하며 ItemCount가 1씩 증가하며 다음 ItemCount가 0인 인덱스를 순차적으로 반환하게 된다. InterpLoc에 대한 Index 변수도 선언 및 초기화 해주자. 그리고 해당 Index에 방금 만들어준..

Setup Interp Locations저번 강의에서 설정한 위치에 대한 작업을 해주자.먼저 픽업한 아이템이 무엇인지 알기 위해 무기와 총알에 대한 열거형을 선언해주었다. 이어서 해당 변수와 초기화도 해주었다. 이어서 구조체와 구조체를 기반으로 한 TArray도 선언해주었다. InterpLocation을 얻기 위한 함수도 public으로 선언해주었다.InterpLocations의 갯수를 체크하고 범위 내면 입력받은 인덱스의 InterpLocation을 반환하거나,없다면 기본 값을 반환하게 된다. 이제 기본 초기화 함수도 작성해주자.기존 구조체에 Add 함수를 통해 UScenecomponent와 ItemCount 값을 넘겨주면 된다.무기와 총알 종류 6개에 대해 각각 초기화를 진행하자. 초기화 함수의 경우..

Interpolation Scene Components탄약의 경우 무기와 동일한 위치로 보간되는 것이 다소 어색해보인다.탄약과 무기의 보간 위치를 다르게 설정해줄 것이며,또 여러개의 탄약이 있는 경우에 대해서도 다른 위치에 보간되도록 해보자. 먼저 이를 USceneComponent로 다루게 되며, 무기 1개 탄약 6개에 대한 변수를 선언해줄 것이다. 이제 해당 컴포넌트에 각각 Static Mesh를 생성하여 각각에 맞는 Mesh를 할당해줄 것이다.여기서 총기 Mesh는 호환이 불가능한 에셋이여서 일단 임시용으로 강의와 다른 Mesh(드릴)을 할당해주었다.나머지 총알은 기존에 있던 Shells_45_Ammo를 사용할 것이며, 전보다 작은 smaller 버전을 선택할 것이다.그리고 각각 위치를 따로 잡아주자..

Pickup Ammo on OverlapE 키를 눌러서 총알을 줍는 것 뿐만 아니라 총알을 지나칠 때도 바로 총알을 줍게 만들어보자.Sphere를 이용한 오버렙 이벤트를 통해 구현할 것이기 때문에 필요한 변수부터 선언해주자. Item 클래스에서도 사용한 적 있는 OverLap 함수를 이름만 바꿔서 또 사용할 것이다. 그리고 게임 시작시 바인딩을 해줄 것이다. 이제 오버랩된 캐릭터가 유효하면 StartItemCurve() 함수를 호출한다.이후 탄약은 사라지므로 충돌 판정도 없애준다. 이러면 PickupSound가 SelectButtonPressed() 함수에 있기에 해당 사운드가 들리지 않는다.따라서 PickupSound 호출해주는 부분을 StartItemCurve() 함수로 위치를 조정해주자.

Bind Ammo CountAmmo Count에 대해 하드코딩한 것을 수정해보자.무기에 대한 위젯을 만들 때 바인딩했던 작업을 똑같이 해줄 것이다. 이번엔 Item Reference가 아닌 Ammo Reference 변수가 필요하다. 이를 Bp_AmmoPickup 클래스 graph 창에서 생성해주자. 그리고 Ammo BP 클래스로 가서 Ammo Reference 변수에 대한 값을 세팅해주자. 이제 이를 토대로 바인딩을 해줄 것이다. 전에 설정했던 20개가 그대로 반영된 것을 볼 수 있다.

Ammo WidgetAmmo에 대한 위젯도 만들어주자. 만들고 나서 크기는 Custom으로 설정해줄 것이다. 이제 Overlay와 hoirzontal Box/vertical box 등을 이용해 위젯을 꾸며주자.배경용 이미지를 하나 맨 위에 설정했고, 캔버스 패널을 통해 아이콘 이미지들을 앵커를 이용한 정렬을 해주었다.다음 강의에 이어서 Ammo Text Box에 대해 위젯을 마저 꾸며주게 된다.

Pickup Ammo Function 이제 탄약을 습득하는 기능도 구현하자.먼저 Ammo 클래스 헤더에 AmmoType 헤더를 추가해줄 것이다. 그리고 해당 타입에 대한 변수와 Getter() 함수를 작성해주자. 다음으로 Item 클래스의 ItemCount에 대해서도 Getter() 함수를 작성해주자. 이제 ShooterCharacter 클래스에서 탄약을 줍는 기능을 구현해줄 것이다. 줍는 것에 대한 함수는 GetPickUpItem 함수가 존재한다.해당 함수를 통해 Ammo가 존재한다면 위 PickupAmmo 함수를 호출시킬 것이다. 이제 메인인 PickupAmmo() 함수다.현재 Ammo에 대한 타입이 AmmoMap에 있는지 체크하고, 이에 대한 Count을 체크할 것이다.해당 탄약 개수를 기존 탄약개..

Overriding SetItemProperties일단 오버랩 이벤트를 위해 Sphere Radius를 조정하고 이를 보이도록 설정해주자. 현재 컴파일하고 E키를 눌러 아이템을 픽업하면 전과 달리 제대로 보간 작업이 이루어지지 않는다.이는 SetItemProperties 함수에서 ItemMesh에 대해서 설정을 해줬는데, 우리는 AmmoMesh를 다루기에 발생하는 문제이다.따라서 해당 함수를 오버라이드 하여 재정의해줄 필요가 있다. Super를 통해 기존 기능도 활성화를 해주고, 기존 함수 내용을 전부 복사해오자.그리고 ItemMesh 부분을 전부 AmmoMesh로 바꿔주고 나머지 내용은 Super를 통해 작동하므로 전부 삭제해주자. 이제 컴파일 하면 다시 정상적으로 보간이 작동한다.

Ammo ClassItem 클래스를 기반으로 Ammo C++ 클래스를 생성해주자 생성자랑 필요한 기본 StaticMeshComponent와 해당 Mesh에 대한 getter() 함수도 생성해주자. 생성자에서 초기화 및 루트로 설정해주자. 이제 해당 C++ 클래스를 기반으로 블루프린트 클래스도 생성해주자. Collision Box와 Area Sphere 범위를 적절히 조정해주자. 이제 Tick() 함수와 BeginPlay() 함수도 생성해주자. 그리고 생성자에서 CollisionBox와 PickupWidget, 마지막으로 AreaSphere를 루트에 붙여줄 것이다.해당 값들은 Item 클래스에 있는 값들을 가져오므로 Getter() 함수를 사용해 호출한다. 컴파일 해보면 다음과 같이 추가된 모습을 볼 수 ..

Ammo Assets이제 레벨에 배치할 탄약 에셋을 다운로드해주자.해당 강의에서 다운한 에셋은 현재 내 언리얼 프로젝트 버전과 일치하지 않아 다른 에셋을 임의로 다운로드하였다.탄약은 아니지만 공구의 메테리얼을 사용하기 위해 해당 에셋을 선택했다. 그리고 Ammo 에셋은 강의 깃허브를 통해 다운로드하였다.해당 탄약들은 메테리얼이 없는 상태이기에 메테리얼은 직전에 다운받은 에셋의 메테리얼로 적절하게 적용시켜줄 것이다.

Reconciling Aiming and Reloading이번에는 Aiming과 관련된 내용들을 다소 수정해줄 것이다.현재 총알을 쏘고 장전하면 재장전 애니메이션이 제대로 나오지만, 이 상태에서 다시 한번 총을 쏘고 재장전을 하면 재장전 애니메이션이 100퍼센트 동작하지 않는 모습이 나타난다.따라서 조준하고 재장전하는 경우 재장전이 완료될 때까지 조준을 중지해주자. 먼저 Aim과 Aim 멈춤에 대한 함수를 만들어주자. 그리고 Aim 버튼 눌림 유무에 대한 변수도 필요하다. AimingButtonPressed/Released 의 내용을 해당 함수로 옮겨주자. 그리고 AimingButtonPressed/Released 함수에 Aim()/StopAiming() 함수들을 호출해 줄 것이다.또한 bAimingBu..