멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon 3주차 회고

仁惠·2022년 5월 28일
0
post-thumbnail

스크립트의 이해

MOD에서의 스크립팅 : LuaScript기반 + a

반복문 만들어보기

짝수만 더해보기

Logic

월드에서 딱 하나밖에 없음, 어디 위치에 두는게 아니고 지속적으로 돌아가는 것

Component

컴포넌트를 실행할려면 엔티티에 추가시켜줘야함

  • OnBeginPlay()
  • OnEndPlay()
  • OnUPdatePlay()

Property:
	[Sync] -> 서버와의 동기화
    number sum=0

Function:
    void OnBeginPlay(){
        log("begin") // 가장 기본적으로 월드가 실행할때 실행되는 함수이다.
        self.sum=5 -> 컴포넌트의 프로퍼티 접근을 위해 self.붙임
        self:myFunction() -> 컴포넌트의 함수 실행 코드
        
        local myEntityPosition=self.Entity.TransformComponent.Position
        -> 컴포넌트의 엔티티에 다른 컴포넌트에 접근가능하게 해준다.
    }
    
    void myFuntion(){
    	log("my Function")
    }

응용

Entity의 position이 1초마다 0.5씩 움직이게 해주는 코드

네트워크의 이해

통신모델
서버 클라이언트 기본 구조
서버 1개 여러개의 클라이언트에서 접속해서 통신하는 형태
클라이언트는 각각의 유저! 어딘가에 있는 서버!

컴포넌트

서버 와 클라이언트가 있을 때,
Entity를 생성하면 서버에도 존재, 플레이를 하면 클라이언트에도 존재
한 곳에 작업을 한 것 처럼 보이지만 서버와 클라 양쪽에 추가된 것
내부적으로 ID를 가지고 식별을 유니크하게 함 개념상 연결되어 있다고 생각

스코어 값을 1로 바꿈

서버에서 score값 처음엔 0 클라이언트도 0임
여기서 값을 바꾸면 바꾼 위치에 따라 변경되는 값이 다름
서버에서 바꾸면 서버는 1 클라는 0
클라에서 바꾸면 클라는 1 서버는 0
두 개의 Entitiy가 다른 영역에 있어서 << 다른 Entity임
문제점 : 컨텐츠 상에선 같은 객체인데 서버와 클라의 값이 달라짐
따라서 같이 바꿔줘야 한다. >> 동기화

MOD에서는 기본적으로 Property에 동기화를 설정할 수 있게 해놓음

Property: +
	[Sync] // 이부분!!!
    number score = 0 :

몇몇의 타입은 동기화가 안됨

동기화 방향은 기본적으로 단방향

Server
    └--Client 1
    └--Clinet 2
    └--Client 3

의 구조로 되어 있을 때, Client 1이 값을 바꾼다 해서 다른 애들한테 영향이 가지 않음
모든 값을 바꿀라면 Server의 값을 바꿔야함
Server가 score를 1의 값으로 바꿨는데 Client1에서 score값을 2로 바꾼다면, 모두가 1을 가지고 있지만 Client1만 2값을 가지고 있게됨
==> 일반적으로 이렇게 작업하진 않지만 가끔 이렇게 코딩해야 할 때가 있음

Sever에서 score가 바뀜
Client에서 이게 바뀐걸 알고 싶음 (OnSyncProperty)

Function => 실행제어

메소드는 부르는 위치에 따라 동작하는 구간이 다름 👇

Method Setting = 메소드의 속성을 정의할 수 있음 = 공간 활성화
(현재는 Function Setting으로 바뀐 듯)

Server Only와 Client Only
Client에서만 돌아가고, Server에서만 돌아가게
대부분의 로직은 Server Only로 짬

Client와 Server
이 함수가 Clinet에서 돌아가야해! => Client Only와 무슨 차이?
혹시 이 함수가 Server에서 불리게 되면 자동으로 Client쪽에러 패킷을 보내서 통신을 해서 Client가 호출이 되게 함

Server는 혹시 이 함수가 Client에서 불렸다 하더라도 Server에 보내서 실행을 하라는 뜻 (Client가 Function을 실행하라고 Server에 보내고 Client는 자기 갈 길 마저 감 Function은 Server가 실행시킴)

Server에서 Client용 Function을 호출하면 각각의 Client에게 모두 실행시키라 명령함

Multicast
Function이 양쪽에서 실행

self.ClinetOnly() 는 OnBeginPlay()가 ServerOnly함수라 호출이 안됨

Server가 Client에 함수를 호출하라 메시지를 보내고 계속 Server실행을 해서 순서가 Server -> End -> Client 순으로 찍히고 있음
타이밍 이슈는 있음 (정확히 알 수 없음)

Multicast순서또한 위와 같은 맥락

일반적으로, Server에서 Entity를 생성하면 그 밑에 Client들도 해당 Entity가 생성된다.
가끔씩 Client 1만의 Entity를 갖고 싶어하는 경우가 있음 (대표적으로 UI)

UI, 입력단 : Local Entity, Play1이 스탯창을 키는데 다른 유저의 스탯창이 열리면 안되니까, 이런건 나만의 Client에서 돌아가야 함, 이런건 Server 에도 없음!

최적화를 할 때도 Client쪽 로직을 사용

Example

KeyDown을 했을 때 Log가 찍히도록 해봄

Client1에서 power값을 증가 시켜줬는데 해당 함수가 Client라면 다른 Client2에서 Power값이 계속 0임, 해당 함수를 Server로 바꾸면 Server에서 동기화 시켜줘서 증가된 Power값을 모두가 볼 수 있음

profile
ᕕ( ᐛ )ᕗ

0개의 댓글