네트워크의 이해
MOD에서는 기본적으로 서버-클라이언트 모델을 지원하고 있음.
이때 서버는 클라이언트의 요청을 받는 서버이고 클라이언트는 접속된 각각의 유저임.
만약 entity를 생성하게 되면 서버와 클라이언트 모두 entity가 생성이 되는데 서버와 클라이언트 모두 네트워크로 연결이 되어있긴 하지만 다른 객체 이기 때문에 어디서 설정하느냐에 따라서 설정값이 달라질 수 있고 이로인해 동기화(어느 한쪽 값이 달라졌을때 양쪽의 값을 모두 바꾸는 행동을 취하는 것) 문제 발생 가능.
서버는 한개이지만 클라이언트는 여러개 일 수 있음. 즉 서버와 클라이언트는 1:n관계임.
서버에서 특정 property값을 바꾸면 그 property를 가지고 있는 클라이언트의 property또한 전부 바뀌는 반면에 클라이언트에서는 독자적 으로 값을 바꿔도 다른 클라이언트나 서버에 영향을 미치지 않음. 이유는 서버와 클라이언트에 저장된 각각의 엔티티는 네트워크로 연결되어있으나 엄연히 다른 엔티티이기 때문임.
mod에서는 어느 한쪽이 달라졌을때 다른 한쪽 또한 일일이 바꿔주는 행동을 수행하기 번거롭다고 생각하여 실행제어하는 개념을 도입함.
property 실행 제어
서버에서는 특정 property값을 바꾸면 그 property를 가지고있는 클라이언트의 property또한 전부 값이 변경된다고했고, 클라이언트에서는 property값을 바꿔도 서버의 property에 영향을 미치지않는다고 했다. 만약 클라이언트에서 변경한 property값들이 서버에도 반영된다면 클라이언트-서버 관계는 1:n의 관계임으로 서버에 과부화가 오게됨. 따라서 동기화는 서버 -> 클라이언트 단방향으로 진행됨.
그래서 property는 동기화옵션을 설정할수있게 해줌.
여기서 [sync]를 클릭해서 [none]타입으로 변경할수있는데 [sync]는 동기화가되는 property고 [none]은 동기화가 되지않는 property임.
function 실행 제어
함수는 호출한 쪽이 서버인지 클라이언트인지에 따라 동작하는 공간이 다릅니다. 따라서 실행 제어를 통해 공간을 활성화 시켜 주어야함.
공간을 활성화하면 해당 function이 특정한 속성을 가지게됨. 이러한 공간활성화로는 5가지 속성이 있음.
client:서버가 클라이언트의 함수를 호출하면 서버와 연결된 클라이언트들에게 함수 호출을 요청하고, 연결된 클라이언트들에 있는 함수가 실행됨.
client only: 클라이언트에만 불릴 수 있으며 서버에서는 부를 수 없습니다.
server: 클라이언트 쪽에서 서버의 함수를 호출하면 서버 쪽에 신호를 보내 서버 안에서 함수가 실행되게함.
server only: 서버에만 불릴 수 있고, 클라이언트에서는 부를 수 없음. 대부분의 로직은 서버에서 서버기준으로짜게됨. 즉, 로직은 주로 서버위주의 행위를 많이 하게 됨.
multicast: 서버와 클라이언트 양쪽 모두 실행함.
MyFirstComponent {
Property:
Function:
void OnBeginPlay()
{
log("BEGIN PLAY")
wait(2)
self:Server() -- 1. 서버가 서버 메시지를 뿌립니다.
self:Client("HAHAHA") -- 2. 클라이언트에서 메시지를 뿌려달라고 요청 후 바로 다음을 실행합니다.
self:MultiCast()
log("END")
void Client( string arg1 ) -- 3. 클라이언트에 도착하면 클라이언트가 메시지를 받은 순간 요청을 실행합니다.
{
log("CLIENT" .. arg1)
}
void Server()
{
log("SERVER")
}
void MultiCast()
{
log("MULTICAST")
}
}
실행 순서
서버에서 엔티티를 생성하고 클라이언트에도 엔티티가 생성되기까지 시간이 걸림! 클라이언트에서 엔티티가 생성되는 도중에 서버에서 엔티티의 값을 넣어 전송하면 클라이언트에서 값을 받지 못하는 현상이 발생하는데 이것을 타이밍 이슈라고함.
- 서버가 흐름을 관장하고 클라이언트는 서버에서 받아온 것을 보여줌.
- 서버에 엔티티가 생성이 됐을때 그 엔티티들이 각 클라이언트 내에도 생성이 됨.
- 특정 클라이언트 안에서 생성된 엔티티는 그 클라이언트 안에서만 생성됨.
특정 클라이언트 안에서만 생성되는 엔티티의 대표적인 예
- UI
- 입력
- effect - 특정 클라이언트에서만 연출하고 싶을땐 로컬 엔티티 사용.
- 최적화 - 서버에 엔티티가 너무 많을때 비용 때문에 최적화 시 로컬 엔티티를 사용.
'NEXON_SUPER_HACKATHON' 카테고리의 다른 글
MOD project 11 -NEXON (0) | 2022.07.20 |
---|---|
MOD project 10 -NEXON (0) | 2022.07.19 |
MOD project 8 -NEXON (0) | 2022.07.19 |
MOD project 7 -NEXON (0) | 2022.07.19 |
MOD project 6 -NEXON (0) | 2022.07.15 |