상세 컨텐츠

본문 제목

[Unity] ZEPETO MultiPlay Guide - 월드 로직 작성하기 2

Unity

by 로니콜먼 2022. 6. 21. 14:37

본문

해당 글은

ZEPETO MultiPlay Guide - 월드 로직 작성하기 2 유튜브 영상을 정리한 내용 입니다.

 

https://youtu.be/H92Gd2G9DhM

 

  • 플레이어의 위치 동기화부터 플레이어의 퇴장까지를 진행합니다.

동기화 진행 순서

Client는 자신의 위치 정보를 Server로 전송하고

Server는 Client들에게 전송받은 위치 정보를 State에 반영

Client는 onStateChange로 변경된 다른 Client 위치를 가져와 동기화를 진행

 

내 위치 전송하기

클라이언트 - 코루틴 SendMessageLoop

정기적으로 클라이언트의 위치를 전송하기 위해 코루틴 함수 사용

//Start 함수내에서 코루틴을 실행하도록 StartCoroutine 작성
//SendMessageLoop 인자 값 0.1 -> 전송 간격
this.StartCoroutine(this.SendMessageLoop(0.1));

private * SendMessageLoop(tick: number){
	while(true){
    	yield new UnityEngine.WaitForSeconds(tick);
        
        if(this.room != null && this.room.isConnected){
        	const hasPlayer = ZepetoPlayers.instance.HasPlayer(this.room.SessionId);
            if(hasPlayer){
            	const myPlayer = ZepetoPlayers.instance.GetPlyer(this.room.SessionId);
                //내 위치 전송하기
                if(myPlayer.character.CurrentState != CharacterState.Idle){
                	this.SendTransform(myPlayer.character.transform);
                }
            }
        }
    }	
}	

private SendTransform(transform: UnityEngine.Transform){
	//transform 전송 목적
	const data =  new RoomData();
    //Position값을 넣어줄 RoomData 객체 생성
    const pos  = new RoomData();
    
    pos.Add("x", transform.localPosition.x);
    pos.Add("y", transform.localPosition.y);
    pos.Add("z", transform.localPosition.z);
    data.Add("position", pos.GetObject());
    
    const rot = new RoomData();
    rot.Add("x", transform.localEulerAngles.x);
    rot.Add("y", transform.localEulerAngles.y);
    rot.Add("z", transform.localEulerAngles.z);
    
    //인벤토리 설정 정보 등 도 설정 가능
    this.room.Send("onChangedTransform", data.GetObject());
    
}

 

Room 동기화 - index.ts의 onCreate 함수

onCreate(options: SandboxOptions){
	this.onMessage("onChangedTransform", (client, message) => {
    	//transform이 변경된 플레이어 불러오기
    	const player = this.state.players.get(client.sessionId);
        
        const transform = new Transform();
        transform.position = new Vector3();
        transform.position.x = message.position.x;
        transform.position.y = message.position.y;
        transform.position.z = message.position.z;
        
        transform.rotation = new Vector3();
        transfrom.rotation.x = message.rotation.x;
        transform.rotation.y = message.rotation.y;
        transform.rotation.z = message.rotation.z;
        
        //완성된 transform을 player의 transform에 저장
        player.transform = transform;
    });
}

 

관련글 더보기