Unity+Photon Realtime로 온라인 게임 만들기
개요
Unity 온라인 게임에 사용되는 클라우드 엔진 Photon Realtime를 사용합니다.
살짝 사용한 느낌으로 좋은 인상을 주었어요.
자세한 내용은 공식 문서를 참조하십시오.
다만, 공식은 가벼워 Qita, 트위터, 영어 블로그 등을 중심으로 검색하는 것이 좋다.
Photon에서 모델을 공유할 때 클라이언트 실행 파일에 해당 모델이 미리 존재하지 않으면 이 모델을 표시하지 않습니다. 따라서 가상 업로드 등 기능을 실현할 때 외부에서 가상 이미지를 다운로드하는 처리를 설치해야 합니다.
가족 구성원
이름:
기능
PhotonRealtime
MO와 MMO를 향해서.
PhotonTurnbased
라운드 게임의 특화판
PhotonChat
특히 채팅 기능은 비용도 싸다
PhotonVoice
음성 채팅 기능 제공
견본
개발 프로세스
이름:
기능
PhotonRealtime
MO와 MMO를 향해서.
PhotonTurnbased
라운드 게임의 특화판
PhotonChat
특히 채팅 기능은 비용도 싸다
PhotonVoice
음성 채팅 기능 제공
견본
개발 프로세스
PhotonRealtime 등록
기본적으로 상술한 절차다.
SDK 설정은
Photon Unity Networking/Resources/PhotonServerSettings.asset
부터 시작할 수 있습니다.동기화 대상의 처리에는 아직 약간의 실험이 필요하다.
Photon Realtime는 아마도 온라인으로 GameObject의 좌표와 회전을 공유할 수 있을 것 같습니다.
서버와 방에 연결하는 절차 정보
소스 코드 보면서 자세히 봐.
기본적으로PhotonNetwork
류에 필요한 방법은 정태적으로 정의되었다.
게임할 때의 절차는 대략 다음과 같다.
모든 절차의 세부 사항은 원본 코드를 참조하십시오.
애니메이션 동기화하기
Photon에서의 애니메이션 동기화는 Photon Animatior View의 Component를 통해 수행할 수 있습니다.
Photon은 Animatior Parameter를 공유할 수 있는 메커니즘을 마련했습니다.
책은 코드로 이루어지는 방법이 있지만 이쪽은 Component로 코드를 숨기는 것이 비교적 쉽다.
사용 방법은 다음과 같다.
또한 대상의 GameObject에서 Update 메서드의 처음에 다음 코드를 추가합니다.
이렇게 하면 자신의 캐릭터
Update()
의 내용만 반영할 수 있다.또한 이렇게 하지 않으면 애니메이션이 동기화되지 않을 수도 있습니다.
void Update() {
if (!(photonView.isMine)) return;
...
}
애니메이션에 대한 자세한 내용은 아래 링크와 책을 참조하십시오.음성 채팅을 해야 돼요.
샘플: https://github.com/kawashi/PhotonVoiceExample
이것 그렇게 하면 금방 할 수 있어요.
단계는 다음과 같습니다.
클라이언트에 메시지 보내기
PhotonView가 있는 GameObject에 메시지를 보낼 때는 RPC를 사용하는 것이 좋습니다.
예컨대 라거에 있는 위치 정보만 있을 경우 판정 등이 잘 동기화되지 않아 RPC를 사용해 판정했다고 공지했다.
RPC는 PhotonView를 소유한 모든 GameObject의 스크립트를 통해 수신할 수 있습니다.
RPC를 처리할 때 ViewID를 사용하면 PhotonView가 있는 GameObject만 인식할 수 있습니다.
(ViewID는 PhotonNetwork.Instantiate에서 생성한 GameObject에 고유하게 할당됩니다.)
예:void OnCollisionEnter(Collision other) {
photonView.RPC("OnCollisionRPCFunction", PhotonTargets.All, photonView.viewID);
}
[PunRPC]
void OnCollisionRPCFunction(int viewID) {
if ( photoView.viewID == viewID ) {
Debug.Log("自分と同一のviewIDからRPCメソッドが呼ばれた!");
}
}
PhotonTargetsEnums.cs
는 다음과 같이 정의됩니다.
Enum.cs/// <summary>Enum of "target" options for RPCs. These define which remote clients get your RPC call. </summary>
/// \ingroup publicApi
public enum PhotonTargets
{
/// <summary>Sends the RPC to everyone else and executes it immediately on this client. Player who join later will not execute this RPC.</summary>
All,
/// <summary>Sends the RPC to everyone else. This client does not execute the RPC. Player who join later will not execute this RPC.</summary>
Others,
/// <summary>Sends the RPC to MasterClient only. Careful: The MasterClient might disconnect before it executes the RPC and that might cause dropped RPCs.</summary>
MasterClient,
/// <summary>Sends the RPC to everyone else and executes it immediately on this client. New players get the RPC when they join as it's buffered (until this client leaves).</summary>
AllBuffered,
/// <summary>Sends the RPC to everyone. This client does not execute the RPC. New players get the RPC when they join as it's buffered (until this client leaves).</summary>
OthersBuffered,
/// <summary>Sends the RPC to everyone (including this client) through the server.</summary>
/// <remarks>
/// This client executes the RPC like any other when it received it from the server.
/// Benefit: The server's order of sending the RPCs is the same on all clients.
/// </remarks>
AllViaServer,
/// <summary>Sends the RPC to everyone (including this client) through the server and buffers it for players joining later.</summary>
/// <remarks>
/// This client executes the RPC like any other when it received it from the server.
/// Benefit: The server's order of sending the RPCs is the same on all clients.
/// </remarks>
AllBufferedViaServer
}
별말씀이지만 cluster가 이 메시지 동기화에 이용했을 수도 있습니다. MQTT
참조 링크
- RPC 및 RaiseEvent | Photon Engine
- 유닛에서 게임을 만드시는 분들은 꼭 보세요!클러스터의 Unity 엔지니어는 "클러스터의 매력과 VR×Unity 작업 | cluster's Blog
공유 속성
Photon에서 모든 클라이언트에서 속성을 공유할 수 있습니다.
속성의 설정은 다음과 같습니다.var properties = new ExitGames.Client.Photon.Hashtable();
properties.Add ("プロパティ名", 値);
PhotonNetwork.room.SetCustomProperties (properties);
또한 획득 속성은 다음과 같다.
(속성이 없는 경우NullReferenceException
)(型名)PhotonNetwork.room.CustomProperties ["プロパティ名"]
참조 URL: https://qiita.com/mo4_9/items/f43606875c8b198fb145
다른 유저의 새로운 연결 탐지
다음 방법을 정의하면 새 유저를 검출할 수 있습니다.void OnPhotonPlayerConnected(PhotonPlayer player) {
// ...
}
주의점
void OnCollisionEnter(Collision other) {
photonView.RPC("OnCollisionRPCFunction", PhotonTargets.All, photonView.viewID);
}
[PunRPC]
void OnCollisionRPCFunction(int viewID) {
if ( photoView.viewID == viewID ) {
Debug.Log("自分と同一のviewIDからRPCメソッドが呼ばれた!");
}
}
/// <summary>Enum of "target" options for RPCs. These define which remote clients get your RPC call. </summary>
/// \ingroup publicApi
public enum PhotonTargets
{
/// <summary>Sends the RPC to everyone else and executes it immediately on this client. Player who join later will not execute this RPC.</summary>
All,
/// <summary>Sends the RPC to everyone else. This client does not execute the RPC. Player who join later will not execute this RPC.</summary>
Others,
/// <summary>Sends the RPC to MasterClient only. Careful: The MasterClient might disconnect before it executes the RPC and that might cause dropped RPCs.</summary>
MasterClient,
/// <summary>Sends the RPC to everyone else and executes it immediately on this client. New players get the RPC when they join as it's buffered (until this client leaves).</summary>
AllBuffered,
/// <summary>Sends the RPC to everyone. This client does not execute the RPC. New players get the RPC when they join as it's buffered (until this client leaves).</summary>
OthersBuffered,
/// <summary>Sends the RPC to everyone (including this client) through the server.</summary>
/// <remarks>
/// This client executes the RPC like any other when it received it from the server.
/// Benefit: The server's order of sending the RPCs is the same on all clients.
/// </remarks>
AllViaServer,
/// <summary>Sends the RPC to everyone (including this client) through the server and buffers it for players joining later.</summary>
/// <remarks>
/// This client executes the RPC like any other when it received it from the server.
/// Benefit: The server's order of sending the RPCs is the same on all clients.
/// </remarks>
AllBufferedViaServer
}
Photon에서 모든 클라이언트에서 속성을 공유할 수 있습니다.
속성의 설정은 다음과 같습니다.
var properties = new ExitGames.Client.Photon.Hashtable();
properties.Add ("プロパティ名", 値);
PhotonNetwork.room.SetCustomProperties (properties);
또한 획득 속성은 다음과 같다.(속성이 없는 경우
NullReferenceException
)(型名)PhotonNetwork.room.CustomProperties ["プロパティ名"]
참조 URL: https://qiita.com/mo4_9/items/f43606875c8b198fb145다른 유저의 새로운 연결 탐지
다음 방법을 정의하면 새 유저를 검출할 수 있습니다.void OnPhotonPlayerConnected(PhotonPlayer player) {
// ...
}
주의점
void OnPhotonPlayerConnected(PhotonPlayer player) {
// ...
}
PhotonNetwork.Instantiate
캐시를 남기고 PhotonNetwork.Destroy
삭제하지 않으면 캐시를 남길 수 있습니다(단, 삭제는 소유자가 해야 합니다MonoBehaviour.Destroy
안 됩니다)Photon 관련 URL
Reference
이 문제에 관하여(Unity+Photon Realtime로 온라인 게임 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yakimeron/items/4826dce916cc9821f37b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)