
Item Falling State이제 떨어지는 상태에 대해서 구현해주자.우선 기존 Belica_guns를 토대로 물리적 에셋을 만들어줄 것이다. Primitive Type은 Box를 선택해주자. 이제 해당 파일을 열어보면 다음과 같은 화면을 볼 수 있다.여기서 우리는 총기를 제외한 나머지 부분을 전부 삭제시켜줄 것이다. 아래 부분들을 모두 삭제해주자. 이제 물리적 몸체를 뜻하는 사각형 박스를 총기에 맞춰서 조절해주자. 이렇게 만든 것을 기존 Belica_Guns의 Physics와 Lighing 에셋에 할당해주자. 이제 ETS_Falling에 대해 값을 설정해주자.캐릭터에서 떨어졌으므로 다시 Physics를 활성화해주고, 콜리즌을 켜주자.또한 Gravity 값도 활성화 해주었다. (기존 코드 다른 stat..

Detach Weapon무기를 장비하기 위해서는 현재 착용하고 있는 무기를 캐릭터에서 분리시켜야 한다.이를 위한 함수를 구현해주자. 무기를 분리하기 위해선 ItemMesh에 대해서 접근해야한다.ShooterCharacter 클래스에서 분리에 대한 작업을 하게 되므로, Item 클래스에서 getter 함수를 만들어주자. 그리고 이에 관한 액션 매핑도 지금 만들어주었다.E키를 누르면 현재 장착하고 있는 무기가 캐릭터에서 분리될 것이다. 분리를 위해서는 관련된 규칙에 대해아아야 한다.우리가 사용할 것은 KeepWorld로, 분리시 해당 위치에 그대로 유지시키도록 해주는 것이다.또한 회전 상태도 유지하기 위해 값을 true로 넘겨줄 것이다. 그리고 액션 매핑에 대해 바인딩할 함수를 작성해주자. 이제 버튼을 눌렀..

Set Item Properties이제 Switch 문을 통해 상태에 대해 상세한 내용을 구현해주자.우선 이를 위한 함수를 선언해주자. 그리고 Switch 문을 통해 지금 다룰 수 있는 상태인 Pickup과 Equipped에 대해 작성해주자.Pickup의 경우 다음과 같은 내용이 필요하다.물리 시뮬레이션 비활성화 Visibility 활성화충돌 채널 반응 무시충돌 비활성화AreaSphere에 대해 오버랩 이벤트 감지AreaSphere에 대해 오버랩 이벤트 활성화CollsionBox에 대해 충돌 이벤트 무시 CollisionBox에 대해 시각적 충돌 활성화CollisionBox에 대해 오버랩 이벤트 충돌 검사 및 물리적 충돌 활성화 Equipped의 경우 CollsionBox에 대한 충돌 이벤트와 AreS..

Item State이번에는 전에 EItemRarity를 통해 레어도를 설정했던 것과 유사하게,EItemState를 활용하여 무기의 상태에 대해 다루게 된다.무기의 상태는 아래와 같이 5가지가 존재한다.EIS_Pickup : 무기가 집힐 수 있는 상태EIS_EquipInterping : 무기가 집히면서 보간되는 중인 상태EIS_Pickedup : 무기가 집어진 상태EIS_Equipped : 무기가 장착된 상태EIS_Falling : 무기가 떨어지고 있는 상태 이를 토대로 레어도를 선언했을 때와 같이 enum class를 생성해주자. 이제 이에 대한 변수도 선언해주자. 초기화로 기본값은 Pickup 상태로 해주었다. 다음으로 ItemState 얻기 및 세팅을 위한 getter 함수를 생성해주었다. 세팅을 통..

Equip Function이제 총기를 장비하기 위한 기능을 구현해보자.이에 대한 함수를 구현해줄 것이며, 인풋으로 Aweapon* 타입 변수를 받게 된다. 그리고 총기를 얻었을 때 해당 총기는 구체와 콜리즌 박스에 대해 충돌 설정이 없어야 한다.만약 충돌 설정이 존재하면 박스와 총구에서 나오는 총알이 부딪혀서 총알이 나가지 않는 현상이 발생한다.따라서 이를 위해 getter 함수를 생성하여 접근이 가능하도록 해주자. 이제 함수 구현이다.기존의 기본 무기 생성 함수 부분에서 많은 내용을 그대로 사용한다.충돌 설정을 해제하는 2가지 부분만 추가하게 된다. 이에 따라 기존 SpawnDefaultWeapon 함수를 고칠 것이다.우선 함수 타입을 Aweapon* return 하도록 바꿔주자.기본 무기를 retu..

Spawn Default Weapon지금은 기본적으로 총기가 캐릭터에 붙어있는 상태이다.총기를 스폰하기 위해 기존 캐릭터의 총기를 안보이게 감춰주자. 이제 총기를 스폰 시켜줄 준비를 하자.장비된 무기에 대한 변수와, 할당할 WeaponClass에 대한 TSubclassOf 변수를 선언해주자. 그리고 무기 스폰을 위한 함수도 작성해주자. 그리고 우선 스폰할 위치를 검토해주자.우리는 오른쪽 손에 스폰해줄 것이며, 해당 위치에 총기를 위한 소켓을 만들어주자. Preview를 통해 미리 총기를 장착했을 때의 모습을 볼 수 있다.이때 총기를 적절히 회전 및 이동시켜서 위치를 조정해주자. 이제 소켓이름을 토대로 함수를 작성해주자. 기본적으로 총기를 소유해야 하므로 BeginPlay() 함수에서 해당 함수를 호출해주..

Bind Star Opacity이번엔 레어도를 나타내는 별 5개에 대해서도 바인딩 작업을 해주자. 먼저 헤더파일 바로 아래 부분에 enum 클래스를 선언하여 레어도에 대해 열거해주자.각 지정된 레어도들에 대해 UMETA(Displayname = " ")을 통해 이름을 넣어주자.그리고 EIR_MAX을 통해 열거형 최대 개수를 지정하게 된다.uint8의 경우 메모리 절약을 위해 사용되었다. 그리고 해당 열거형을 변수로 선언해주자. 기본 등급은 우선 Common 등급으로 초기화하였다. 그리고 bool 타입 TArray도 선언해주자.열거형에 대해서 bool로 판별하게 될 것이다. 다음으로 Stars를 활성화하기 위한 함수이다.기본 값은 false로 초기화하고, 레어도에 따라서 해당 레어디의 별 갯수만큼 true..

Bind Item Name이번에는 Item 이름에 대해 바인딩 작업을 해주자.지금은 우리가 하드코딩 식으로 이름을 직접 적어준 상태이다.ItemName을 위한 FString 변수를 선언하고 초기화해주자. BP_PickupWidget 클래스에서 Text 부분에 바인딩을 생성해주자. 다음으로 Item Reference를 위한 변수를 선언해주자.타입을 Object Item으로 해주는 것을 잊으면 안된다. BP_BaseWeapon 클래스에서 해당 Item Reference 값을 세팅해주자.User Widget Object를 얻고, Cast를 통해 이를 Bp_PickUpWidget으로 캐스팅해주고 이를 통해 Item Reference 값을 세팅해주자.Item Reference에는 Self 값을 연결해준다.이는 C..

Hide Widget기존 위젯을 이제 없애주는 작업을 해주자.더 이상 트레이스할 것이 없거나, 총기가 아닌 다른 것을 트레이스하고 있으면 위젯을 감춰줄 것이다.이를 위해 마지막으로 트레이스하여 히트한 내용을 저장해줄 필요가 있다.ShooterCharacter 클래스에서 해당 변수를 선언해주자. TraceForItems() 함수에서 해당 변수에 HitItem을 저장해주자.그리고 만약 해당 변수가 존재하고, 해당 변수가 기존 HitItem과 다르다면 이는 다른 물체를 히트한 케이스이다.따라서 Visibility를 비활성화 해주자. 그리고 bShouldTraceForItems가 false일 때 또한 Visibility를 비활성화 해주자.해당 케이스의 경우 트레이스할 대상이 없는 상태이다.

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 아래에 추가해주는데,앵커 기능 활용을 위해 캔버..