(사실 내가 필요해서 정리함)

 

언리얼 입문자들이면 다 알것이다.

어느정도 배우기 시작하면 나타나는 "리플리케이션" (Replication) 이라는 개념을....

 

처음에는 굉장히 생소하고, 이게 뭐... 어쩌라는건지? 싶을때도 있는데

익숙해지고 나면 이거 없이는 개발을 어떻게하지? 싶은 순간도 와버리게 되는 마성의 개념인것같다 (글쓴이 주관임)

 

 

 

여튼,

 

언리얼 네트워크 시스템에 대해 찾아보려고 검색을 하면 다들 이 그림을 보게 될 것이다.

 

 

굉장히 예전부터 보이던 그림이라 어디가 원조인지 궁금하긴 했는데 2020년에도 쓰였다는거 말곤 잘 모르겠더라 (...)

 

 

여튼, 이 그림을 기준으로 정리를 해보도록 하자.

 

결국 리플리케이션 개념은 서버/클라 통신과 관련된 개념이다.

 

모든 데이터를 서버에 둘 수도 없고, 모든 데이터를 클라에만 둘 수도 없으며, 클라이언트에 필요는 하지만 서버에서만 관리해야하는 데이터가 있을수도 있고 등등... 온갖 이슈들이 존재하는데

이를 관계 정리한것이 리플리케이션 개념인것.

 

우선은, 언리얼 네트워크 시스템상에서 각 요소(=액터) 들은 크게 3가지로 나뉜다.

 

Server Only

Server/Client Multy

ClientOnly

 

Server Only는 게임 관리자에 해당하는 "GameMode"  가 포함

Server/Client Multy는 게임 통제 (점수 기록 등)을 담당하는 "GameState", 각 플레이어의 상태를 가지고 있는 "PlayerState", 플레이어의 이동 정보 등을 가지고 있어야하는 "PlayerController", 그리고...

"Pawn" (or Character)

생각해보면, 결국 서버/클라 무관하게 모든 캐릭터는 똑같이 보여야하니까 Pawn이 서버/클라 모두에 있는건 별로 이상한 것은 아닌것같다.

 

사실 네트워크 요소중 다른 사항들은 크게 신경쓰지 않아도 된다. (어차피 네트워크 통신 이슈가 발생하진 않으니까)

하지만, Server/Client Side 양측에 모두 존재하는 액터들이 제일 큰 문제인데

 

여기서도 몇가지 갈린다.

1. 서버가 무조건 우선권을 가짐

2. 모든 클라이언트가 소유하고 있어야 하는 경우

3. 지금 화면을 보고 있는 클라이언트의 정보만 있어야 하는 경우

 

간단히 설명하면 위의 3가지인데, 이를 좀 더 상세하게 풀어가면

1. "관리 권한이 존재"

2. "관리 권한은 없으나 소유권은 있음"

3. "관리 권한도 없고, 소유권도 없음"

 

이렇게 3가지 타입으로 구별이 가능하다.

이를, "Authority", "Autonomous", "Simulated" 이라고 표현한다.

 

디테일한 내용은 아래 공식문서를 참고바랍니다. ->

https://docs.unrealengine.com/4.27/ko/InteractiveExperiences/Networking/Actors/Roles/

 

액터 롤 및 리모트 롤

액터 오브젝트 리플리케이션의 여러가지 부분에 대한 것입니다.

docs.unrealengine.com

 

 

자세한 롤 관련 얘기는 다음 문서에서 설명하기로 하고, 여기서는 네트워크 관계도(?)에 대한 설명을 좀 더 하기로 하겠다.

결국, 리플리케이션이 필요한 객체라도 어떤 클라에선 없을수도 있고, 클라 서버 관계없이 다 있을수도 있고 이런 애들이 나타날 수 있는데, 이게 초반에는 좀 굉장히 헷깔린다. (실제로 일하다가도 좀 실수를 했음..)

 

해서, 정리를 하자면

 

액터 타입/명칭 배치 위치 클라이언트 배치 조건 각 클라이언트당 개수
GameMode Server Only None 0
GameState Server / Client All Clients 1
PlayerState Server / Client All Clients N
PlayerController Server / Client "Controlled Client Only" 1
Other Controller
(ex. AIController)
Basically Server Only "If you need" 0?
Player Pawn Server / Client All Clients N
HUD / UI Client Only Controlled Client Only 1

 

여기서 제일 골치아픈것이 "PlayerController"

내가 컨트롤중인 클라이언트에서는, 본인의 캐릭터에 연결되어있는 PlayerController를 제외하고, 타인의 PlayerController는 없다고 생각하면 된다.

...혹시나 동기화 필요하다고 PlayerController 갖고와서 하고 있으면 어라 이거 왜 안되지 하는 실수를 할 수 있을것이다..

 

그리고 추가, "이펙트는 동기화가 어떻게되나요" 할 수 있는데

이펙트는 재생 시점 / 재생 위치 / 재생 종류만 동기화가 되고, 직접적인 이펙트 랜더링은 클라이언트에서 각자 해결한다.

 

그야 그럴게, 같은곳에 같은 이펙트가 재생은 되어야하지만, 그게 어떤 모양으로 랜더링 될지는 각자 클라이언트가 판단할 문제니까...

 

 

 

 

 

예전에 작업하다가 좀 어처구니 없는 실수했던것이 기억나서 글로 남겨본다.

필요해서 메모함

 

 

 

NBT 관련

  1. Lock : "전용 인벤토리를 가진 블록"에 대해, 특정 이름을 가진 아이템 소지시 작동
    레버를 들고 우클릭하면 안되나, 레버의 이름을 모루를 이용해 "레버"로 변경하면 작동하는 식
    (=원래 아이템 이름은 영향을 받지 않음)

 

 

단축키

  1. F1 : GUI 토글
  2. F3 : 현재 좌표 등 정보 확인
  3. F3 + A : 청크 새로고침
  4. F3 + B : 히트박스 토글
  5. F3 + C : 현재 위치 클립보드에 복사 (execute tp 명령어 상태로, location과 rotation이 저장됨)
  6. F3 + G : 청크 경계선
  7. F3 + I : 바라보고 있는 블록의 nbt 정보 복사
  8. F3 + L : 프로파일링 (기본 10초)
  9. F3 + P : 창 포커스 손실 시 일시정지 여부
  10. F3 + N : 관전모드 토글
  11. F3 + T : 리소스팩 리스타트

언리얼에는 트레이스 (a.k.a. "레이캐스트") 라는 시스템이 있다.

 

간단히 요약하면 원하는 방향으로 빔을 쏴서 무언가가 걸리면 인식하는 시스템 정도로 이해해주면 되겠다.

 

언리얼에서는 해당 시스템을 좀 더 "디테일하게" 나눠서 판단을 하도록 해두었는데

 

이번에 회사에서 작업하면서 해당 시스템 관련 문제를 하나 마주쳤다.

 

 

 

 

언리얼 트레이스는 크게 2가지로 나뉘어진다.

Single Trace

Multi Trace

 

Single Trace는 "히트한 단 한개의 타겟"에 대한 결과만을 리턴

Multi Trace는 "목적지까지 다다랐을때 히트한 모든 타겟" 에 대한 결과를 리턴한다.

 

히트한 결과는, "HitResult" 라는 자료형/배열로 리턴되며, Trace 자체가 히트했는지는 각 함수의 리턴값을 통해 알 수 있다.

 

그런데 여기서 함정.

 

HitResult가 있더라도 Trace 함수의 Hit 결과는 False가 나올 수 있다.

 

이게 무슨소리냐

 

 

이걸 설명하기 위해서는 언리얼 콜리전 판정의 특이사항을 알 필요가 있다.

 

https://www.unrealengine.com/pt-BR/blog/collision-filtering

 

Collision Filtering in Unreal Engine 4

Choosing what collides is obviously very important, but it can be tricky, and it’s a problem that we have spent quite a while discussing while developing UE4. The system we have can seem a little complex at first, but it is very powerful and consistent,

www.unrealengine.com

 

 

자세한 내용은 위의 링크를 참고하면 확실하게 볼 수 있으니, 필요한 설명만 하도록 하겠다.

 

 

언리얼의 콜리전은 총 3가지 타입으로 분리된다.

 

무시 (Ignore) / 오버랩 (Overlap) / 충돌(Block)

 

 

 

Ignore는 모든 충돌 방식을 Ignore

Overlap은 Overlap / Block을 Overlap (판정은 발생하나 지나침)

Block은 Block끼리 충돌

 

 

 Trace에서 추출되는 결과는, Overlap과 Block 2가지만 추출된다. (아무래도 Ignore는 충돌을 안하니까...)

그런데, Single Trace의 경우, "Overlap" 결과는 리턴되지 않는다.

 

이에 대해서 여러 자료를 좀 찾아보았으나, 공식 문서 상에서는 확답이 없어 분석해본 결과,

공식문서에서는

1. Trace 결과는 "Hit" 라는 표현을 사용한다.

2. 공식문서에서, SingleTrace에는 없는 "Overlap" 이라는 표현이 MultiTrace에서부터 등장한다.

 

라는 결론을 얻을 수 있었다.

 

 

 

이게 무슨말이냐, 예시를 들어 설명하자면...

 

 

 

우선 간단하게 테스트용 함수를 구성했다.

테스트용 채널은 Camera 채널을 이용.

 

SingleTrace를 이용하며, Hit 시 출력은 True, 아니라면 False가 나올것이다.

 

 

뒤의 파란 블럭은 Camera 채널을 Block, 앞의 빨간 블럭은 채널을 Overlap으로 지정했다.

 

 

그리고....

 

 

빨간색 가까이에 가면 Hit Result가 False

 

 

 

파란색의 경우, 화살표 위치에서처럼 Hit 결과가 보이면서 Hit가 True로 나온다.

 

 

 

 

 

그럼 Overlap된 액터는 검출이 불가능한가?

 

그건 또 아닌게, 위에서 말한것과 같이 MultiTrace의 경우에는 Overlap이 검출이 된다.

 

 

 

 

Trace를 Multi로 변경했다.

 

 

 

아무것도 없으면 Hit Result False, Hit 0

 

 

Overlap만 있으면 Hit Result : False, Hit 1

 

 

Block이 있다면 Hit Result : True, Hit 1

 

 

즉, 결과를 요약하면 다음과 같다.

 

 

Single Trace Hit Result (히트 결과) Out Hit (히트 액터 검출)
Ignore False False
Overlap False False
Block True True
Multi Trace Hit Result (히트 결과) Out Hit (히트 액터 검출)
Ignore False False
Overlap False True
Block True True

 

=
Overlap 설정으로 충돌한 (채널/타입) 경우에는 Hit Event Result (Trace의 성공/실패여부) 를 변화시키지 않는다.
SingleTrace의 경우, Overlap만 발생한 경우에는 Hit Event Result가 False로 발생하면서 결과물이 리턴되지 않음.
MultiTrace의 경우 Overlap이 걸려도 HitResult가 채워지나, Hit Event Result는 Block으로 끝나지 않는 한 False로 리턴된다.

 

 

 

왜 Overlap에만 이런 특이한 경우가 반영되었는지는 (공식문서상 확답이 없어서) 잘 모르겠지만... 

작업할때 참고할 필요가 있을것 같다.

 

https://linuxhint.com/clone-into-non-empty-git-directory/

 

How to Clone Into a Non-Empty Git Directory

I hold a master's degree in computer science. I am passionate about my work, exploring new technologies, learning programming languages, and I love to share my knowledge with the world.

linuxhint.com

 

 

* 빠른 요약

1. 원하는 폴더로 이동

2. 해당 폴더에서 Git Bash 실행

3. [ git init ]

4. [ git remote add origin (Remote 경로) ]

5. (충돌 등의 이유로 머지 작업이 필요 시) [ git pull origin master --allow-unrelated-histories ]

1. EnhancedInput 사용시 No Such File Of Directory 발생

해결방안 : (Project).build.cs 파일의 "PublicDependencyModuleNames" 에 EnhancedInput 추가

 

https://www.reddit.com/r/unrealengine/comments/za43ip/there_is_no_file_named_inputactionvalueh/

 

 

...놀랍게도 플레이어 캐릭터입니다...

 

언리얼로 2D게임 만들기 중...

 

 

p.s : 오늘의 교훈 - 순수한 APawn으로 플레이어를 구성하면 안 움직이는게 정상이다... (Input Mapping을 안해줬으니까..) 

'신변잡기 > 일상' 카테고리의 다른 글

To do.  (0) 2024.07.22
묵혀뒀던 프로젝트들 좀 살려야겠어요  (0) 2024.06.11
오랫만에 개인작을 할까 합니다...  (0) 2024.02.08
PC 카톡은 왜 삭제기능이 없을까...  (0) 2022.11.20
근황  (0) 2022.04.25

아직 이친구가 정식 기능이 아니라서 (?) 그런가 노멀 언리얼 엔진에서는 찾을수 없는 플러그인 / 기능들이 일부 있다.

 

Lyra Starter Game을 베이스로 설명하면, 게임모드의 업그레이드버전 (이라고 소개하는) "Gameplay Experience" 도 Lyra 소스코드에만 전용으로 박혀있는 상태고...

당연히 5.3쯤 되면 기본일줄 알았지!

 

 

일부 기능들은 여전히 + 공식에서조차 "Lyra에서 복사해오세요~" 하고 있는 실정이다..

그래서 지금 필요한게 뭐였냐..

 

저기 있는 Gameplay Experience를 사용하고 싶었는데 순정 프로젝트에선 도저히 안보여서 어디박혀있나 찾고있다가 해당 파일이 "LyraWorldSettings.h" 로 오버라이드 되어있던것을 발견했다...

 

아잇 진짜

 

Lyra 흔적 안 붙이고 싶은데 

 

 

* 활성화를 위한 플러그인 리스트

 

 

 

1.Gameplay Abilites (필수)

2.Gameplay Abilities Game Feature Actions

3.Game Features

4.Modular Gameplay

 

 

그리고, 추가 플러그인으로 모듈러 게임플레이 피쳐 추가시 "게임 피쳐" 로 추가 (중요!)

 

참고
https://docs.unrealengine.com/5.0/ko/game-features-and-modular-gameplay-in-unreal-engine/

 

게임 피처 및 모듈형 게임플레이

빠르게 활성화하거나 비활성화할 수 있는 독립형 피처를 구축합니다.

docs.unrealengine.com

 

+ Recent posts