구조도

PUN :

릴레이 서버. API 중 최상위 레벨은 PUN 코드로, 네트워크 객체, RPC 등과 같은 Unity의 기능을 구현합니다. 두번째 레벨은 Photon 서버, 매치메이킹, 콜백 등과 관련된 로직이 포함되어 있습니다. 가장 낮은 레벨은 DLL 파일들로 이루어져 있으며, 직렬화/비직렬화, 프로토콜 등과 같은 것으로 구성되어 있습니다.

 

Bolt :

호스팅된 클라이언트. 위 이미지의 2,3번 유저는 직접 연결이 불가능하여 포톤을 통해 접속하고, 4,5,6번 유저는 직접 연결이 가능하여 1번 유저가 직접 호스팅을 하고 있습니다.

 

 

 

지연보상

동기화 문제에서 발생하는 증상으로써 한 클라이언트에서 보내는 메시지가 다른 클라이언트로 ‘이동’하는데 걸리는 시간차이 때문에 발생합니다. 움직임이 느린 경우 눈에 띄지 않을 수도 있습니다. 그러나 이동 속도가 매우 빠르면 다른 게임에서 차이가 명확하게 표시될 수 있습니다.

PUN : OnPhotonSerializeView함수에서 포지션 격차를 보완하고, FixedUpdate함수에서 회전 격차를 보완합니다.

코드 예시

OnPhotonSerializeView함수는 PhotonView에 대한 동기화 데이터를 쓰고 읽을 수 있도록 초당 PUN에 의해 ​​여러 번 호출됩니다. 이는 PhotonView가 정기적으로 동기화하는 데이터를 사용자가 정의할 수 있습니다. 즉, 전송되는 내용과 클라이언트가 데이터를 사용하는 방법을 정의합니다. 이 함수 인자로 PhotonStream을 받습니다. PhotonView를 제어하는 ​​클라이언트의 "쓰기"모드 (PhotonStream.IsWriting == true)와 제어 클라이언트가 전송 한 원격 클라이언트의 "읽기 모드"입니다. 스트림에 값을 쓰지 않으면 PUN은 업데이트를 건너 뜁니다.

 

Bolt : Bolt Physics를 이용해서 격차를 보완합니다.

코드예시

Bolt Physics를 사용하기 전에 Bolt Hit Box Body 컴포넌트를 추가해야합니다. 그리고 나서 RaycastAll 함수를 이용하면 됩니다. 

* RayCast란? 3차원 공간에서 어느 한 점(시작점)에서 Ray를 정해진 방향(direction vector)으로 진행하여 Ray와 충돌되는 객체를 구하는 방법

 

 

 

동기화

PUN : RPC(원격 프로시저) 등. 같은 룸에 있는 다른 클라이언트에 있는 메소드를 호출하는 것입니다. 호출될 함수에는 '[PunRPC]' 속성이 적용되어 있어야 합니다. PhotonView가 함수를 호출합니다.

 

* RPC 조금 더 자세히

https://photonkr.tistory.com/22

 

[PUN]RPC 알아보기

포톤은 여러 서비스를 제공합니다. Realtime, PUN 등등 그 중 PUN은 원격프로시저호출(Remote Procedure Call)을 지원합니다. * 프로시저(Procedure)란? - 루틴이나 서브루틴 및 함수와 같은 뜻 - 어떤 행동을 수..

photonkr.tistory.com

Bolt : 이벤트 입력. 즉, 플레이어가 입력한 w,a,s,d 키, 마우스 클릭 등 이런 input을 동기화 합니다.  또한 3D물리엔진을 구비하고있고 클라이언트쪽에서 움직임을 예측하며 롤백기능이 있어 서버와 클라이언트가 일치하도록 조절해줍니다

 

 

매치메이킹

다른 유저와 같이 플레이하기 위하여 룸에 입장하는 것은 Photon에서 매우 쉽습니다. 

PUN : 기본적으로 3가지 방법을 제공합니다. 1. 서버에게 매칭되는 룸을 찾은 후 입장 2. 친구를 따라 룸에 입장 3. 룸의 목록을 얻어 사용자가 하나를 선택하여 입장. 여러 방법 중 대표적인 하나를 예로 들면, JoinRandomRoom 함수를 이용해 룸에 입장할 수 있습니다. 즉, 로비에서 룸에 입장하고, 룸이 없으면 입장 실패합니다. 로비를 많이 생성했다면 맞는 룸을 찾기 위하여 JoinRandomRoom 함수를 반복해야 할 수 있습니다. 이 메소드는 현재 참여한 로비내에 있는 룸을 찾거나 로비에 있지않는 상태라면 디폴트 로비에서 찾습니다.

 

Bolt : Bolt.Matchmaking.BoltMatchmaking 클래스를 이용합니다. 순서로는 현재 세션 얻어오기->세션 생성하고 갱신하기->만든 세션에 참여하기. 세션에 참여하는 방법은 udp로, 이름으로, 랜덤으로 할 수 있습니다. 

코드예시

세션 얻어오기

세션 생성

세션 참여

 

 

Bolt.Matchmaking.BoltMatchmaking 클래스 API

https://doc-api.photonengine.com/en/bolt/current/class_bolt_1_1_matchmaking_1_1_bolt_matchmaking.html

 

Photon Bolt Engine API: Bolt.Matchmaking.BoltMatchmaking Class Reference

Join a Session in a random fashion. In order to filter the rooms the player can join, you can make use of the UdpSessionFilter class and pass custom parameters. Parameters sessionFilterSession filter parameters tokenJoin Token Example: public void Join(str

doc-api.photonengine.com

 

추천 게임장르

PUN : 퍼즐, 턴베이스 등

 

Bolt : FPS, TPS, 슈팅 등

 

아래 링크에서 플랫폼, 장르, Photon 서비스를 필터링하여 출시된 게임을 확인할 수 있습니다.

https://www.photonengine.com/ko-kr/pun/showcase#allPlatforms-allGenres-allTypes

 

Photon PUN을 이용한 게임 : | Photon Engine

MULTIPLAYER REALTIME PUN BOLT QUANTUM COMMUNICATION CHAT VOICE SELF-HOSTED SERVER 멀티플레이를 간단하게 실현합니다! Photon Realtime 인디/프로 개발자 누구나 실시간 멀티 플레이어 게임을 개발하여 세계로 진출할 수 있습니다. Photon PUN 인디/프로 개발자 누구나 실시간 멀티 플레이어 게임을 개발하여 세계로 진출할 수 있습니다. Photon BOLT 비교불가! Photon B

www.photonengine.com

 

 

요약

PUN : Photon Realtime을 유니티에 매우 적합하게 만든 제품입니다. 네트워킹 경험이 적다면 PUN으로 시작하는 것이 좋습니다.

Bolt : 이벤트 기반의 네트워크 솔루션입니다. 기술문서를 참고하면서 개발하시면 됩니다.

 


 

Photon 공식 홈페이지 
https://www.photonengine.com/ko-kr/Photon


★Photon Help Center
https://support.photonengine.jp/hc/ko

 

 

★Photon Korea 공식 블로그
https://photonkr.tistory.com

 

 

★Photon Korea 페이스북

https://www.facebook.com/photoncloudkr

 

 

★Photon Korea 유투브

https://bitly.kr/photonyoutube

'Photon > Bolt' 카테고리의 다른 글

[Photon Engine]유니티짱을 이용한 Bolt 시작하기  (0) 2019.08.20

 

FPS, 배틀로얄, 액션 게임을 위한 네트워크 엔진 'Photon Bolt'에 대해서 설명해드리려고 합니다.

 

Bolt는 Authoritative movement를 지원합니다. 클라이언트 서버 형식의 게임을 구축하실 경우 , Bolt의 예측가능 기능과 렉(lag) 및 지연을 보상하는 기능을 이용하시면 아주 편리합니다. 그리고 Clientside prediction을 통한 동기화를 구현합니다.

 

어셋 스토어에서 최고의 평가를 받고 있고, 최고 수준의 Unity 네트워킹 솔루션을 하나씩 알아보겠습니다.

 

 

유니티에서 새 프로젝트를 만드세요.

 

 

유니티 어셋스토어 Bolt 다운로드

유니티 어셋스토어에서 'Photon Bolt'를 검색하세요. 그 중 아래 화면과 같이 Bolt Free 버전을 다운로드 받으시면 됩니다.

 

 

Bolt 프로젝트 구성

다운로드, 임포트 후 프로젝트를 보면 아래화면과 같이 구성될 것입니다.

 

Bolt Assets 위자드

유니티 \ Window \ Bolt \ Assets 을 통해서 윈도우를 관리할 수 있습니다.

 

Bolt Editor는 정말 강력합니다.

코딩없이 inspector 설정만으로 구현할 수 있습니다.

강력한 이벤트 시스템을 지원합니다. 수신자에게 이벤트를 보내는 이벤트 시스템이 내장되어 있으며, 구성의 자유도가 매우 높고 구성의 자동화도 지원합니다. 특정 게임 오브젝트를 대상으로 한 이벤트 뿐만 아니라, 글로벌한 이벤트도 지원합니다. 이벤트의 발신에는 3가지 모드가 있습니다(Unreliable、Unreliable Synced、Reliable). 상태 복제는 게임 오브젝트 변형 및 사용자 정의 속성을 자동으로 복제할 수 있습니다. 비쥬얼 에디터를 통해 모든 기능을 깔끔하게 이용할 수 있으며, 이를 통해 상세한 수준으로 속성을 정의 및 커스터마이즈할 수 있습니다. 우선 순위 결정과 스코핑(Scoping)도 지원합니다. Bolt에서는 엔티티의 스코핑(Scoping, 플레이어가 인식하는 엔티티의 결정)과 스코핑된 엔티티의 우선 순위 결정(스코핑된 엔티티가 2개 존재할 경우, 어느 쪽이 플레이어에게 중요한지 그 우선순위를 정함)을 지원합니다.

 

 

유니티 어셋스토어 유니티짱 다운로드

 

 

유니티짱 모델 프리팹만들고 등록

유니티짱 폴더에 있는 프리팹을 Bolt가 컴파일하여 인식하는 폴더에 옮겨주세요.

 

이름 변경해보겠습니다. 물론 그대로 사용하셔도 됩니다.

여기서는 unitychan_dynamic을 'Unitychan'으로 변경했습니다.

 

 

유니티짱 State 만들기

Bolt Assets 위자드에서 우클릭 후 New State를 클릭합니다. 그리고 이름을 UnityChanState로 변경해주세요.

UnityChanState로 들어오시면,

New Property 클릭하여 Property를 하나 생성합니다. 필터를 Transform으로 변경한 후  Replication을 Everyone Except Controller로 변경해주세요.

 

 

 

유니티짱 프리팹 인스펙터에 Bolt Entity 컴포넌트 추가

유니티짱 프리팹에 Bolt Entity를 추가하세요. Prefab Id와 State가 설정되지 않아 에러가 뜹니다. Bolt Assets 컴파일하면 Id 부여받습니다. Id가 부여받은 것을 확인 후 State 선택하세요. 여기서는 IUnityChanState를 선택합니다.

 

 

Bolt Assets 컴파일 

(컴파일 성공)

 

 

 

팁> States에서 중복된 이름이 있으면 컴파일 안됩니다.

예시: CubeState 중복

결과: Duplicate assete name 에러

 

 

이제 코드로 활용할 수 있게 준비를 다 갖추었습니다.

 

 

유니티짱 instantiate

생성할 수 있는 코드는 8가지 입니다. 그 중 몇 가지를 소개합니다.

1. 단순 인스턴스 생성

2. 위치, 방향 지정

 

 

 

이벤트(글로벌) 

Bolt 이벤트 중 글로벌에 대해 알아보겠습니다. Bolt Assets의 Senders를 설정하겠습니다. Global Senders, Entity Senders 를 Everyone 으로 선택해주세요.

 

키보드 이벤트는 Input 클래스를 통해서 받습니다. KeyCode에서 키보드 입력값을 지정할 수 있습니다.

 

OnEvent 함수를 이용해 이벤트를 처리합니다.

처리하고 싶은 이벤트를 구현하시면 됩니다. 여기에서는 로그만 찍어보겠습니다. 아래 그림과 같이 로그가 잘 찍히면 글로벌 이벤트 구현은 잘 하신 것 입니다.

 

 

 

 

 

애니메이션

 

메카니즘 애니메이션 연결을 해보겠습니다. Bolt Assets에서 UnityChanState를 활성화합니다. 아래와 같은 화면이 나오면 됩니다. (Transform은 없어도 됩니다. 없다면 애니메이션 설정 후 Transform을 추가하셔도 됩니다.) 여기서는 Import Mecanim Parameters를 모델의 애니메이션과 연결하겠습니다. 유니티짱 모델의 애니메이션을 찾아서 연결해주세요. (만약 다른 모델을 넣으셨다면 그 모델의 애니메이션을 찾아서 연결해주세요.) 연결을 하면 오른쪽에 Import 버튼이 생성됩니다. 

 

애니메이션을 State 프라퍼티에 임포트하면 아래화면과 같이 Speed, Direction, jump 등 애니메이션에 설정된 값들이 하나씩 나옵니다.

 

 

 

키보드 입력 받아보겠습니다. 앞서 예로 든 키보드는 물론 조이스틱, 마우스, 화살표 등 모든 입력 이벤트를 처리할 수 있습니다.

 

 

 

 

SimulateOwner 함수에서 받은 키 이벤트만큼 위치이동을 하겠습니다.

 

 

빌드 앤 런을 하시면 입력키 이벤트에 동작하는 것을 확인하실 수 있습니다.

감사합니다.

 

 


 

Photon 공식 홈페이지 
https://www.photonengine.com/ko-kr/Photon


★Photon Help Center
https://support.photonengine.jp/hc/ko

 

 

★Photon Korea 공식 블로그
https://photonkr.tistory.com

 

 

★Photon Korea 페이스북

https://www.facebook.com/photoncloudkr

 

 

★Photon Korea 유투브

https://bitly.kr/photonyoutube

'Photon > Bolt' 카테고리의 다른 글

[Photon Engine] PUN vs Bolt  (0) 2019.09.03

+ Recent posts