
Trace for Widget위젯이 항상 보이는건 바람직하지 않다.총기를 가르켰을 때만 위젯이 뜨도록 변경해보자. 이에 앞서서 현재 위젯이 총기를 아에 가리고 있으므로 위젯을 조금 위로 올려주자. 그리고 우선 위젯이 보이지 않도록 세팅해주자.위젯은 플레이어가 가르켰을 때만 활성화되어야 한다. Trace를 이용하여 위젯을 가리킨 것을 판별해보자.기존 크로스헤어를 통해 Trace를 하여 충돌 여부를 판별하게 될 것이다.이는 ShooterCharacter 클래스에서 작업하게 된다. 우선 기존 Viewport 사이즈를 가져와야 한다.이후 이를 토대로 크로스헤어의 위치를 계산해준다.이는 기존 GetBeamEndLocation() 함수에서도 작성했던 중복되는 내용이다. 이후 크로스 헤어의 위치를 월드 좌표로 변환하..

Add Widget to Weapon만든 위젯을 무기에 붙여주자.이를 위해 VScode로 돌아가서 생성자에서 초기화 작업을 해주자. 그리고 BP_BaseWeapon 클래스로 돌아가서 값을 설정해주자.위젯의 경우 월드 화면이 아닌 스크린 화면이기에 Space 값을 Screen으로 변경해주자.위젯 클래스를 우리가 만든 걸로 할당해주고, 사이즈도 조절해주자. 이제 실행해보면 위젯이 총과 함께 보이게 된다.

Finishing the Pickup Widget저번에 이어서 우측 빈 공간도 채워주자.먼저 Vertical Box 2개를 생성하자.이를 상단 하단으로 나눠 사용할 것이다. 각각 size fill을 선택하고 0.45, 0.55 로 할당해주자. 이어서 각 Vertical Box에 Overlay를 할당하고, 이어서 배경용 이미지를 할당해주자. 정렬을 새롭게 해주고, 각각 색을 할당해주자. 우측 상단엔 추가적으로 텍스트를 추가해주고,우측 하단에는 Item Info용 Horizontal Box를 추가해주자.그리고 이어서 Icon Box, Amount Box, Rarity Box를 Horizontal Box로 추가해주었다. Ammo Icon의 경우도 Icon Box 아래에 추가해주는데,앵커 기능 활용을 위해 캔버..

PickupWidget Blueprint필드에 있는 총기가 어떤 아이템인지 알려줄 Pickup에 대한 Widget을 만들어주자.먼저 기존 Item 클래스에 위젯에 대한 변수를 선언해주자. 그리고 위젯을 사용하기 위해서는 VScode의 해당 프로젝트의 build.cs 파일에 아래와 같이 UMG 항목을 작성해주자.해당 내용을 작성해야 UMG와 관련된 함수들을 다룰 수 있게 된다.적어주는 것은 VScode에 UMG와 관련된 내용을 사용하겠다고 알려주는 행위라고 보면 된다. 다음으로 위젯 블루프린트를 만들어주자. 이제 해당 위젯 블루프린트에서 여러개를 겹칠 예정이므로 우선 Overlay를 할당해주자. Overlay를 배치하면 사각형 표시가 보이는데, Padding 값 상하단에 5씩 줘서 여백 간격을 만들어주자...

UMG Intro Lesson필드에서 총을 얻는 것과 동시에, 필드에 있는 총이 어떤 총인지 대략적인 정보를 띄우기 위한 작업을 해주자.필드에 총과 함께 위젯으로 간단한 정보를 같이 띄우는 것이 목표이다.이번 강의에서는 이를 위해 관련된 내용을 간단하게 알아보는 시간을 가진다. 우선 총기 정보에 대한 위젯이 필요하다.총기 이름이나, 등급, 레어도 등을 나타낼 것이다. 그리고 캔버스 패널이 필요하다.캔버스 패널을 통해 총기의 위치를 나타내줄 것이다. 오버레이 기능 또한 사용해줄 것이다.기존 위젯과 겹쳐 가장 탑부분에는 총기가 위치할 것이다. Horizontal / Vertical Box을 통해 원하는 방식으로 정렬도 해줄 것이다. 텍스트와 이미지를 같이 가진 위젯 또한 사용이 가능하다. 이러한 내용들을 계..

The Weapon Class기존 item 클래스를 기반으로하여 Weapon 클래스를 만들어주자. 그리고 해당 클래스를 기반으로 블루프린트 클래스도 생성해주자. 그리고 우리는 기존 스켈레톤 메시에서 총기 부분만 다뤄야 한다.이를 위해 해당 강의에서 2가지 방법을 다루었는데 먼저 따로 총기만 있는 에셋을 다운하여 임포트한 부분이다. 그리고 해당 총기의 Material을 설정해주자.그러면 기존의 우리가 알던 총기의 모습이 나타난다. 다음으로는 기존 스켈레톤 메시에서 총기를 제외한 나머지를 전부 감추는 것이다.이를 위해 기존 Belica 스켈레톤 메시를 복사하여 사용하자. 그리고 총기를 제외한 나머지 부분을 감추기 위해서는 불투명한 특징을 가진 Material이 필요하다.이 Material을 직접 생성하여 할..

The Item Class지금은 총기가 1개이지만, 여러 총기를 다뤄보고 싶다.이를 위한 기반작업으로 Item Class를 생성해주자. 해당 총기는 필드에서 주워서 습득할 수 있게 하고 싶다.이를 위해서는 총기에 대해 충돌 이벤트가 가능해야 한다.이를 위한 Collision 작업을 해주자. 그리고 총기의 경우 애니메이션이나 복잡한 구조를 가지고 있어서 SkeletalMeshComponent로 다룬다.해당 변수 또한 선언해주자. 이를 생성자로 초기화 해주자.그리고 ItemMesh를 루트 컴포넌트로 만들고, 콜리즌 또한 붙여주는 작업을 해주자.

Jumping Animations기존에 점프 애니메이션이 없어서 이번에 추가해주도록 하자.먼저 이를 위한 스테이트 머신을 생성해주자. 그리고 아래와 같이 구성해주자.움직임 없음/걷는 중 -> 점프 -> 착지 모션이다. 이어서 규칙을 정해주고 Duration 값도 더 짧게 수정해주었다. Jump_Land -> Idle/Jogs 에는 2가지 조건을 걸었다.하나는 자연스럽게 넘어가도록 옵션을 걸었고, 나머지 하나는 In Air 여부이다.In Air 여부가 중요한 것이 Idle/Jogs -> Jumps로 넘어가는 애니메이션 순서를 확실하게 체크하기 위해 사용된다.착지 도중에도 여전히 In Air 상태인데, Idle/Jogs로 확실히 넘어가지 않고 Jumps로 넘어가는 사태가 발생할 수 있다.이러면 애니메이션..

Automatic Fire지금은 사격을 하면 단발로만 발사된다.이번에는 사격을 누르고 있으면 계속해서 사격이 유지되도록 수정해보자.먼저 사격 버튼 눌림 여부, 사격해야 하는가에 대한 여부, 자동 사격간 딜레이, 자동 사격에 대한 타이머에 대한 변수를 선언해주었다. 그리고 생성자에서 초기화 해주자. 필요한 함수들도 선언해주자.사격 버튼 눌렀을 때와 아닐 때에 대한 함수 및 타이머 세팅에 대한 함수,마지막으로 자동 발사 리셋에 대한 함수가 필요하다. 사격 버튼 눌렀을 때와 아닐 때에 대한 함수는 바인드 액션과 매핑해주자.기존에 Fireweapon() 함수를 FireButtonPressed() 함수로 대체하게 된다. 이제 각 함수들을 채워주자.먼저 FireButtonPressed() 함수는 버튼이 눌린 것을 ..

New Level Assets캐릭터 기반을 어느정도 다졌으니, 맵에 사용할 에셋을 다운로드하여 적용해주자.사용할 에셋은 Factory Environment Collection이라는 무료에셋으로, 용량이 상당하여 주의해야할 필요가 있다. 다운로드 후 프로젝트를 생성하고 해당 맵을 기존 프로젝트에 Migrate해주자. 그럼 이제 현재 프로젝트에 추가된 맵을 볼 수 있다.해당 맵을 열고 새로 저장해두자. 다음으로 게임모드를 기존에 만들어서 사용하던 것으로 교체해주자.

Bullet Fire Aim Factor기존 FPS 게임 같은 경우 사격을 하다보면 반동으로 인해 조준점이 흔들린다.따라서 이번에는 사격 시 크로스헤어가 확산되도록 조정해보자.이를 위해 필요한 변수는 사격 시간, 사격 여부, 사격 타이머 이렇게 3가지이다. 마찬가지로 생성자에서 초기화 해주자. 사격 시작과 마침을 알리는 함수를 생성해주자.시작 함수에서는 SetTimer를 ShootTimeDuration 동안 타이머를 발동하고 마침을 알리는 함수를 호출해주자. 이제 StartCrosshairBulletFire() 함수를 FireWeapon() 마지막에서 호출해주자. 이후 확산도를 계산하는 부분에서 사격 여부를 나타내는 bFiringBullet 변수를 통해 값을 설정해주고 이를 더해주자. 추가적으로 현 상태..

Crosshair Aim Factor이번엔 조준 시 확산도를 조정해주자.조준 할 때는 크로스헤어가 좁혀져야 하므로, 기존에 더해주던 것과 달리 이번엔 기존 값에 빼주게 된다. 그리고 기존의 조준 여부를 판별했던 bAiming 변수를 활용해 간단하게 구현이 가능하다. 추가적으로 확산에 관련된 변수들이 초기화를 해주지 않아 생성자에서 전부 초기화 작업을 해주었다. 이제 조준하면 크로스헤어가 좁혀지는 것을 볼 수 있다.

Crosshair In Air Factor공중에 있을 때 확산도를 변하도록 해보자.기본적으로 기존 확산도 계산 함수에서 CrosshairInAirFactor 변수를 더해주면 된다. 그리고 이를 GetCharacterMovement()에 속한 IsFalling() 함수를 통하여 공중 여부를 판별 후, CrosshairInAirFactor의 값을 설정해주면 된다.여기서는 저번에 사용했던 보간 함수를 사용하여 점진적으로 확산이 이루어지도록 하였다. 공중에서는 천천히 넓게 퍼지도록, 지상에서는 빠르게 원상복구 되도록 하였다.

Spreading the Crosshairs이제 크로스헤어의 확산을 적용해보자.크로스헤어는 언리얼에서 HUD 블루프린트 클래스를 통해 적용했었다.따라서 C++에서 선언한 크로스헤어 확산 변수에 접근하기 위해 Getter 함수를 만들어주자. 추가적으로 저번에 Tick 내에 함수를 호출해주는 것을 잊어서 이번에 작성해주었다. 먼저 HUD 블루프린트 클래스에서 Shooter Character에 대해 유효한지 체크를 해주자.우리는 Shooter Character에 있는 getter 함수를 필요로 하므로, 유효여부 체크를 해주는 것이 좋다.이러한 작업은 C++ 내에서 각 포인터 유효여부 체크 작업을 해줬던 것과 동일하다.관련 변수를 먼저 만들어주고 이를 이용해 체크해주자. 이제 HUD 클래스내에서도 확산에 대한 ..

Crosshair Spread Velocity지금은 어떤 움직임에도 크로스헤어가 고정된 상태지만,캐릭터가 움직이거나, 줌 했을 때 등 움직임이 생겼을 때 크로스헤어도 마찬가지로 움직이는 것이 바람직하다.이번엔 이런 크로스헤어의 확산도에 대해 조정해보자. 먼저 관련된 변수들을 선언해주자.기본 확산 배율, 속도에 따른 확산, 공중에 따른 확산, 조준할 때의 확산, 사격 시의 확산 나타낸다. 이후 확산을 계산하는 함수를 작성해주자. 여기서 캐릭터의 걷는 속도에 따른 확산 배율을 계산해보자.걷는 속도는 0~600 사이인데, 이를 배율에 맞게 0~1로 매핑을 해주어야 한다.예를 들어 걷는 속도가 300이면 해당 배율은 0.5가 될 것이다. 여기서 사용하는 함수가 GetMappedRangeValueClamped 이..