언리얼엔진
-
[UE5] GameState의 PlayerArray가 동기화되는 방법언리얼엔진/그 외 2024. 9. 9. 14:59
게임 스테이트는 클라이언트에 레플리케이트 되어서 서버와 클라이언트에 모두 존재하며, 게임의 상태를 동기화 해서 클라이언트에서도 알수있게 된다.예를 들면 AGameState에서 다루는 변수인 MatchState와 ElapsedTime은 서버와 동기화 되므로, 이 값이 변함에 따라서 클라이언트에서도 상황에 맞는 작업을 할 수 있다. 이렇게 동기화 된다고 알려진 정보중에 AGameStateBase의 PlayerArray도 있다.PlayerArray는 현재 존재하는 모든 플레이어들의 플레이어 스테이트를 담아둔 배열이다.플레이어 스테이트는 서버와 클라이언트에 모두 존재하고, 존재하는 모든 플레이어 스테이트가 각 클라이언트에 레플리케이트 되므로 게임 스테이트의 PlayerArray를 통해 클라이언트에서도 원할때마다..
-
[UE5 | FPS] 서버와 클라이언트의 동기화를 위한 시행착오언리얼엔진/FPS 프로젝트 2024. 8. 13. 18:50
이전 글의 마지막에 무기 드롭과 교체에 관한 내용을 다루겠다고 했다.관련 내용 중 서버와 클라이언트의 무기 슬롯 동기화에서 발생한 문제는 무엇인지, 이 문제를 어떻게 해결했는지, 이 방식의 아쉬운점은 무엇이고 어떻게 하면 개선할 수 있을지를 한번 정리할 필요가 있어서 글로 작성하게 됐다. 상황 정리이 프로젝트에서 무기는 액터라서 월드에 독립적으로 존재할 수 있고, 플레이어 캐릭터가 줍거나 떨어뜨릴 수 있다.캐릭터가 무기를 주웠다면 무기는 캐릭터에 부착된다.캐릭터가 무기를 들고있는경우 캐릭터 메시의 손에 있는 소켓에 부착되고, 넣은 상태면 등쪽에 있는 다른 소켓에 부착된다.등쪽의 소켓은 여러개 존재하며, 하나의 소켓에는 하나의 무기만 부착된다.등쪽의 소켓을 관리하기 위해 해시맵을 사용하고있고, 캐..
-
[UE5 | FPS] 진행 사항 정리언리얼엔진/FPS 프로젝트 2024. 8. 12. 01:36
거의 두 달만에 쓰는 글이다.그동안 다양한 작업을 했지만, 별개의 글로 쓰기엔 내용이 부족한듯 해서 이렇게 한번에 묶어서 쓰게 됐다. 그동안 한 것을 대략 정리하면 다음과 같다. 1. 달리는 중에 무기를 발사하려고 하면 달리기를 멈춘 다음 걷기 상태에서 무기를 발사하게 함. 무기를 발사하는건 게임플레이 어빌리티로 구현했는데 어빌리티에서는 특정 게임플레이 태그가 제거될 때까지 기다리는 태스크를 사용할 수 있다.캐릭터가 달리는 동안에는 달리기 게임플레이 태그를 추가하고 무기를 발사하는 어빌리티가 시작되면 달리기를 막는 게임플레이 태그를 추가해서 달리기를 멈추게 한다.달리기가 멈춰서 게임플레이 태그가 제거되면 그 이후부터 어빌리티 작업을 진행한다.어빌리티가 끝나면 달리기를 막는 태그도 제거되므로 캐릭터는 달릴..
-
[UE5] C++로 애니메이션 시퀀스 변경, 커브 추가언리얼엔진/그 외 2024. 7. 3. 16:12
가끔씩 애니메이션을 수정해야하거나 커브를 추가해야할 상황이 있는데 반복작업이 너무 많거나 정확한 계산이 필요한 경우가 있을때 사용하면 좋을듯함.애니메이션 트랜스폼 정보를 커브로 변환해서 다른곳에 사용할수도 있을듯.카메라에 있는 애니메이션을 추출해서 커브로 만든뒤에 카메라 쉐이크로 사용한다던가.아니면 커브를 애니메이션에 베이크하는 경우도 있을듯. 1. 커브 추가애니메이션 시퀀스에는 커브를 추가할수 있음.벡터 커브를 통해 본에 애디티브 트랜스폼을 추가해서 애니메이션을 수정하는것도 가능함.// 애니메이션 시퀀스UAnimSequence* AnimSeq = Cast(Object);// 애니메이션 데이터에 접근가능한 모델IAnimationDataModel* AnimDataModel = AnimSeq->GetDat..
-
[UE5 | FPS] 멀티플레이에서 작동하는 달리기 구현 과정언리얼엔진/FPS 프로젝트 2024. 6. 14. 22:43
캐릭터 무브먼트 컴포넌트를 이용해서 달리기를 구현할때는 MaxWalkSpeed를 변경하는 방식을 생각할 수 있다.MaxWalkSpeed를 사용자의 입력에 따라 변경해야하는데, 이 값을 어떻게 변경할지를 결정하기 위해서는 캐릭터 무브먼트 컴포넌트에서 MaxWalkSpeed를 언제, 어떻게 사용하는지를 알아야한다. 캐릭터 무브먼트 컴포넌트의 cpp파일에서 MaxWalkSpeed를 검색해보면 GetMaxSpeed() 함수를 찾을 수 있다.GetMaxSpeed() 함수는 MovementMode에 따라서 최대 이동 속도를 리턴해준다.이 함수가 사용되는곳을 찾아 올라가다보면 결국엔 TickComponent() 함수가 나온다.따라서 매번 GetMaxSpeed() 함수를 통해 현재 상태에서의 최대 속도를 구하는걸 알 ..
-
[UE5] 캐릭터 무브먼트 컴포넌트 작동 순서 정리언리얼엔진/그 외 2024. 6. 13. 22:16
캐릭터의 움직임이 처리되는 순서를 간단하게 정리한것.피직스 시뮬레이션이나 루트 모션 관련은 제외했음.TickComponent()| 서버에 접속한 클라이언트인 경우 서버에서 받은 정보를 통해 위치 업데이트| if 캐릭터의 움직임을 처리해야하는 경우. 대부분은 캐릭터가 직접 조종되고있을때.| ControlledCharacterMove()| | 점프 입력 확인| | 가속도 조절| | if Authority를 가지고있을때.| | PerformMovement()| | | MaybeUpdateBasedMovement()| | | ApplyAccumulatedForces()| ..
-
[UE5 | FPS] FGameplayEffectContext의 자식 구조체로 데미지 관련 정보 전달언리얼엔진/FPS 프로젝트 2024. 6. 5. 18:11
이 프로젝트는 게임플레이 어빌리티 시스템을 이용해서 멀티 플레이에서도 작동하게 작업하고있다.따라서 데미지도 게임플레이 어빌리티 시스템을 이용해서 다룬다.그렇다면 플레이어의 체력을 어트리뷰트 셋에서 관리하고, 데미지는 게임플레이 이펙트를 적용해서 체력 어트리뷰트를 조정하는 방법을 생각할 수 있다. 데미지 값은 게임플레이 이펙트의 모디파이어에서 Set by Caller로 값을 설정해서 적용하면 된다.하지만 최종 데미지를 결정할 때에는 추가적인 정보가 필요하다.예를 들면 피격된 캐릭터의 스탯과 데미지의 속성에 따라 데미지의 값을 조정해야하는 경우도 있고, FPS의 경우에는 거리가 멀어지면 데미지가 감소하는걸 생각해 볼 수도 있다.따라서 설정된 데미지 값을 그대로 적용해서 체력을 조정하기보단 피격된 캐릭터가 여..
-
[UE5 | FPS] 히트 박스를 관리하기 위한 에디터 유틸리티언리얼엔진/FPS 프로젝트 2024. 6. 2. 18:10
게임에서는 캐릭터의 피격 판정을 위해 단순한 형태의 히트 박스를 따로 만든다.만약 캐릭터에 애니메이션이 있다면 히트 박스도 애니메이션에 따라 움직여야하므로, 부위별로 나눠서 캐릭터 메시의 본을 따라가게 해야한다.그런데 움직이는 부위가 많을 수록 히트 박스도 많아질 것이고, 이걸 하나씩 직접 관리하는건 번거로운 작업이다. 언리얼 엔진에서 캐릭터의 히트 박스를 만들어야 한다면 가장 쉽게 떠올릴 수 있는 방법은 캐릭터를 상속받은 클래스나 블루프린트에서 박스 컴포넌트를 추가해서 캐릭터의 메시의 본에 어태치하는 방법이다.하지만 히트 박스를 이렇게 추가하면 히트 박스가 많아질수록 관리하기도 어려워진다.같은 메시를 사용하는 다른 캐릭터에도 동일한 히트 박스를 추가하고싶다거나, 히트 박스 작업이 끝난 캐릭터의 메시를 ..