UE5/Network

[UE5] SetPawn() : OnPossess in Client

samoyedAlice 2024. 9. 28. 03:17

[ UE5 OnPossess in Client ]

 

간혹 게임이 처음 시작될 때, Controller가 Pawn을 소유한 직후, 그러니까 Controller와 Pawn이 둘 다 유효한 가장 처음 시점이 필요할 때가 있다.

OnPossess(APawn* InPawn)라고 간편한 함수가 직접적으로 존재하지만, 이는 서버에서만 호출된다.

클라이언트, 또는 클라이언트와 서버 둘 다 간편하게 Init 할 수있는 함수가 없을까?

 

[ AController::SetPawn(APawn* InPawn) ]

이 함수는 서버, 클라이언트로 부터 전부 호출된다.

그리고 virtual로 선언되어 있어 잘 사용하면 서버, 클라이언트 양측 케이스를 한 번에 핸들링가능하다는 뜻이다.

기본적으로 서버에서는 OnPossess(), 클라이언트에서는 OnRep_Pawn()에서 호출된다고 이해하면 된다.

Server side
Client side

 

한 가지 유의해야 할 것은, 이 두 곳에서만 호출되는게 아니라 여러군데서 호출된다. 말그대로 Controller, PlayerController 내에서 Pawn을 설정할 때마다 호출되는 함수이기 때문이다.

예를 들면 UnPossess 될 때도 InPawn이 NULL로 들어와서 호출되고, Restart 등등.. 실제로 로그를 찍어보면 게임 시작시 LocalController 조건을 걸어도  3~4번씩 호출된다.

 

그래서 사용할려면 Init하려는 변수가 nullptr일 때만 호출하게 한다거나 실행 조건을 거는 것을 권장한다.