
Widget Trace When Close위젯이 일정 거리 이내일때만 나타나도록 수정해보자.이를 위해 우리는 오버랩 이벤트에 대해 다룰 것이다.이를 위해 추가적으로 총기에 Sphere를 만들어줄 것이다. 이어서 생성자에서 초기화 및 루트에 붙여주자. 다음으로 오버랩에 사용될 콜백함수를 선언해주자.오버랩됐을 때와 오버랩이 풀렸을 때 총 2개를 선언해준다.언리얼에서 콜백함수로 사용되기 때문에 제대로 바인딩되기 위해서 UFUNCTION()을 선언해주어야 한다. 오버랩된 순간에 대해 다루기 때문에 동적 델리게이트를 사용하여 바인딩을 해주자. 그리고 ShooterCharacter 클래스에 트레이스 할지 말지를 정하기 위한 bool 변수를 선언해주자.기본 값은 생성자에서 false로 초기화 해줄 것이다. 그리고 오..

Refactor Trace Under Crosshairs기존 코드에 겹치는 내용이 존재하므로 리팩토링 작업을 해주자.먼저 기존 TraceUnderCrosshiars 함수에 인풋 매개 변수로 FVector 참조 변수를 추가해주었다. 그리고 해당 함수를 통해 OutHitLocation을 저장해주자.기본은 End 즉 끝점이고, 아니면 히트한 위치이다. 그리고 GetBeamEndLocation 함수를 위 내용을 토대로 리팩토링 해주자.기본적으로 히트 위치는 Crosshiar의 트레이스하여 히트한 위치일 것이다.아니면 기존 끝점에 대한 위치이다.이 끝점에 대한 값 설정을 위해 추가적으로 FVector& OutBeamLocation 인풋 매개 변수를 추가해준 것이다. 이후 2번째 트레이스로 총기 위치부터 시작한 트..

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의 값을 설정해주면 된다.여기서는 저번에 사용했던 보간 함수를 사용하여 점진적으로 확산이 이루어지도록 하였다. 공중에서는 천천히 넓게 퍼지도록, 지상에서는 빠르게 원상복구 되도록 하였다.