초보 코린이의 성장 일지

Unreal Multi Network 본문

네트워크

Unreal Multi Network

코오린이 2024. 6. 25. 21:19

어떠한 Map이 실행되면 서버와 클라이언트에서 다 실행이 되기 떄문에 Begin Play가 전부 불러진다.

불러질거 불러지지 말아야 할 것들을 나눠야한다.

 

게임내에 적용하기 위해서는 서버의 권한이 있기 때문에 서버와 클라이언트에서 실행할 수 있는 객체들을 나눠서 구분지어줘야 한다.

Authority =  서버에서만 실행

Remote =  클라이언트에서만 실행

 

2개의 객체가 존재한다고 가정했을때, Replicates을 Off한 객체는 서버에서는 보이지만 클라이언트에서는 등장하지 않는다. 클라이언트에서도 보이게 하려면 Replicates를 On을 해줘야 클라이언트에서도 서버와 동일하게 객체가 보이게 된다.

결국은 Replicates이 켜져있어야 Replicates을 통해 사용자들에게 모든 정보가 공유된다.

 

객체 위에 Health의 정보 변화가 Server에서는 변화되고 있지만, Client에서는 한쪽 객체의 정보만 변화되는걸 볼 수 있다.

객체가 정보를 가지고있고 그 정보들을 보여주는 변수를 선언하고 사용할때 변수에서도 Replication이 존재한다.

객체에서만 Replicates을 On으로 켜놨어도 변수들의 변화되는 값들을 보여주기 위해서는 따로 체크해줘야한다.

 

 

사용할 변수 디테일창을 보면 리플리케이션 상태값을 설정해주는 옵션이 있다 이걸 Replicated로 켜줘야 클라이언트에서 양쪽 객체가 동일하게 정보가 업데이트되는걸 볼 수 있다. Replication되는 변수나 정보를 최소한 하기 위해서 필요한것만 제공할 수 있도록 설정해줘야한다. 게임내에서 서버와 클라이언트가 동기화해여 사용되야 하는 변수는 꼭 Replication를 해서 사용해야한다.

 

 

BluePrint에서는 Replication이 켜져 있는지 꺼져 있는지 변수를 눌러서 확인하지 않아도 알기 쉽게 위에 그림처럼 표시되어있다. 빨간색 영역처럼 표시되어 있는 변수는 Replicated가 On인 상태이다.

 

 

특정한 변수가 계속 변화될때 변화되는 수치에 따라 특정 상황을 넣어 연출하고 싶다면 그 수치가 변화될때마다 알 수 있는 방법이 존재한다. (Hp가 0이되면 Dead되는 상황)

 

 

변수 디테일창에서 리플리케이션을 RepNotify로 변경해주면, 자동으로 함수 이벤트가 생성된다. 

이 함수안에서 특정 조건들을 설정해주면 된다.

 


Function Replication이라 불리는 RPC에 대해 알아보겠다.

 

멀티캐스트 = 서버, 클라이언트에서 모두 실행

서버에서 실행 = 클라이언트에서는 실행되지 않고, 서버에서만 실행 (총을 쐈을때 총이 발사되는 조건 처리)

소유중인 클라이언트에서 실행 = 클라이언트에서만 실행 (파티클 실행같은 디테일은 게임안에 영향을 주는게 아니므로 서버에서는 실행할 필요가 없다.)

 

Custom Envnt를 생성하여 이름을 정하고 어떠한 동작이 나오도록 설정한 이벤트를 호출하려한다.

이떄 서버에서만 실행되어야 한지 서버를 포함한 모든 곳에서 실행되야 하는지 조건을 설정해줘야한다.

 

Function Replication는 이벤트가 발생하면 실행 조건을 한번 보여주고 끝이난다.

Function Replication는 경우는 이벤트가 일어나는 상황이 없으면 아무것도 하지 않지만, bool변수로 예를 들면 지정해 놓은 지역안에 캐릭터가 들어간다면 서버에서는 해당 변수가  동작을 취한 상태로 true 변경되어 상자가 열려 있지만 캐릭터가 지정해 놓은 지역안에 들어오기 전까지는 알지 못한다. 이때 클라이언트에서는 상자가 닫혀 있는 상태로 보인다. 하지만 캐릭터가 지역안으로 들어온다면 뒤늦게라도 상자가 true로 열려있다고 변수가 Replication이 되어있기 때문 상자가 열려있는걸로 바뀌게 된다.

 

위에 조건도 문제가 생긴다. 왜냐면 서버에서는 이미 한번에 파티클이 실행되면서 상자가 열렸지만, 클라이언트에서는 뒤늦게 상자가 열려있는게 보이면서 한번 더 파티클이 실행된다. 서버에서 이미 실행되서 끝난게 클라이언트에서 한번더 실행되는건 옳지 않다.

 

 

이걸 해결하기 위해 RPC + Replication을 둘다 사용해서 실행 조건을 체크하고 보여줘야한다.

역할을 나눠줘야한다. 지역안에 들어갔다면 bool변수를 true로 바꿔주고 열려있다고 알려만준다 그 이후 Function  Replication을 통해서 이미 지역안에 있는 캐릭터들한테만 파티클이 실행되도록 보여주고, 변수가 true 상태로 바뀐 상태에서 뒤늦게 지역 안으로 들어오는 캐릭터들이 봤을때는 파티클은 실행되지 않고, 상자만 열려있도록 보이게된다. 

 

 

Comments