Photon Unity Networking 소개
시작하기
Photon Unity Networking (PUN) 은 Photon 백엔드를 이용하여 인증 옵션, 매치메이킹과 빠르고 신뢰도가 높은 게임내 커뮤니케이션을 제공 합니다.
PUN은 유니티에서 지원하는 대부분의 플랫폼에서 익스포트 되며 두가지 유형이 있습니다:
PUN FREE
거의 모든 플랫폼에 익스포트 합니다. IOS와 Android 익스포트는 Unity 5 또는 모바일 라이선스가 있는 Unity 4 프로가 필요 합니다.
PUN PLUS
Unity 라이선스에 관계 없이 모든 플랫폼에 익스포트 합니다. 100 명의 동시 접속자를 제공합니다.Photon Realtime 60 개월 플랜.
노트: Unity 5 에서 두개의 PUN 패키지 파일들은 동일 합니다. 60개월 동안 100 CCU 를 이용하기 위해서 PUN+ 를 구매할 수 있지만 PUN Free 는 클라이언트 측에서 사용할 수 있습니다.
코드가 필요 합니다
PUN을 제대로 활용하기 위해서는 일부 스크립트를 작성해야 합니다. 이 페이지에서는 시작 할 때 필요한 가장 중요한 사항을 보여 줍니다.
접속
C#
PhotonNetwork.ConnectUsingSettings("v4.2");
위 코드는 Photon 기능 사용을 하기 위해 접속하는 코드 입니다.
ConnectUsingSettings
에는 클라이언트의 게임 버전을 설정하고 PUN 셋업 위자드가 작성 해 놓은 설정 파일을 사용하는데 설정파일의 PhotonServerSettings
에 저장되어 있습니다.
매치메이킹
다음으로 생성되어 있는 방에 참여하거나 방을 생성 할 수 있습니다.
다음 코드에는 게임 참여 또는 룸을 생성하는 방법을 보여 줍니다.
C#
//Join room "someRoom"
PhotonNetwork.JoinRoom("someRoom");
//Fails if there are no open games. Error callback: OnPhotonJoinRoomFailed
//Tries to join any random game:
PhotonNetwork.JoinRandomRoom();
//Fails if there are no open games. Error callback: OnPhotonRandomJoinFailed
//Create this room.
PhotonNetwork.CreateRoom("MyMatch");
// Fails if "MyMatch" room already exists and calls: OnPhotonCreateRoomFailed
일반적으로 친구들과 함께 게임하는 것이 더 즐겁습니다. 만약 서로 소통(예,Photon Chat, Facebook 을 통해서)할 수 있다면 JoinOrCreateRoom
를 이용하여 룸 이름을 결정할 수 있습니다. 친구들이 룸 이름을 알고 있다면 다른 사람이 볼 수 없게 룸을 생성 할 수 있습니다:
C#
RoomOptions roomOptions = new RoomOptions() { isVisible = false, maxPlayers = 4 };
PhotonNetwork.JoinOrCreateRoom(nameEveryFriendKnows, roomOptions, TypedLobby.Default);
JoinOrCreateRoom
를 이용하여 존재하지 않는 룸이면 새롭게 생성됩니다. 만약 룸이 가득차 있다면 OnPhotonJoinRoomFailed
가 호출됩니다(어딘가에 구현해 놓았다면).
게임플레이
게임오브젝트들은 "networked GameObjects" 로 인스턴스화 될 수 있습니다. 게임오브젝트들은 식별되는 PhotonView
와 소유자(또는 컨트롤러)를 가지고 있습니다. 소유자는 모든 것을 갱신합니다. 지속적인 업데이트는 PhotonView의 Observed
필드에 스크립트를 드래그하여 전송 될 수 있습니다. 그 스크립트는 OnPhotonSerializeView
를 아래의 코드 처럼 반드시 구현해야 합니다.
C#
// in an "observed" script:
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
if (stream.isWriting)
{
Vector3 pos = transform.localPosition;
stream.Serialize(ref pos);
}
else
{
Vector3 pos = Vector3.zero;
stream.Serialize(ref pos); // pos gets filled-in. must be used somewhere
}
}
클라이언트는 드물기는 하지만 Remote Procedure Calls 도 할 수 있습니다.
C#
// defining a method that can be called by other clients:
[PunRPC]
public void OnAwakeRPC(byte myParameter)
{
//Debug.Log("RPC: 'OnAwakeRPC' Parameter: " + myParameter + " PhotonView: " + this.photonView);
}
// [...]
// calling the RPC somewhere else
photonView.RPC("OnAwakeRPC", PhotonTargets.All, (byte)1);
GameObjects와는 별도로 자신만의 이벤트를 보낼 수 도 있습니다.
C#
PhotonNetwork.RaiseEvent((byte)eventCode, (object)eventContent, (bool)sendReliable, (RaiseEventOptions)options)