OnSerializePhotonView
PhotonView에 의해 관찰되고 있는 스크립트에서만 작동
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { if (stream.isWriting) { //We own this player: send the others our data stream.SendNext((int)controllerScript._characterState); stream.SendNext(transform.position); stream.SendNext(transform.rotation); } else { //Network player, receive data controllerScript._characterState = (CharacterState)(int)stream.ReceiveNext(); correctPlayerPos = (Vector3)stream.ReceiveNext(); correctPlayerRot = (Quaternion)stream.ReceiveNext(); } } | cs |
RPC (Remote Procedure Calls)
룸 안에 있는 모든 클라이언트의 메소드를 호출
RPC로 호출되는 메소드들은 게임 오브젝트에 PhotonView 컴포넌트가 있어야함.
같은 PhotonView를 가진 오브젝트의 클래스 안에서만 RPC를 받는다.
메소드 자체는 [PunRPC] 속성으로 마킹되어야하며
원격 클라이언트가 로드되지 않았거나 아직 매칭되는 PhotonView 생성을 하지 못했으면 RPC는 손실
1 2 3 4 5 6 7 8 | PhotonView photonView = PhotonView.Get(this); photonView.RPC("ChatMessage", PhotonTargets.All, "jup", "and jup!"); [PunRPC] void ChatMessage(string a, string b) { Debug.Log("ChatMessage " + a + " " + b); } | cs |
스크립트가 Photon.PunBehaviour를 상속받았다면 this.photonView.RPC()로 바로 사용가능
PhotonTargets
Buffered는 서버가 RPC를 기억하다가 새 플레이어가 참여하면 이전에 발생한것까지 보내줌.
ViaServer는 서버로 RPC 전송없이 즉시 실행.
RaiseEvent
PhotonView와 호출할 메소드가 없이도 네트워크 객체에 관계 없이 이벤트들을 전송할 수 있음.
1 2 3 4 | byte evCode = 0; // my event 0. could be used as "group units" byte[] content = new byte[] { 1, 2, 5, 10 }; // e.g. selected unity 1,2,5 and 10 bool reliable = true; PhotonNetwork.RaiseEvent(evCode, content, reliable, null); | cs |
마지막 null 부분은 RaiseEventOptions를 설정가능.
이벤트를 받기 위해서는 EventCallback을 구현하고 등록해야한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // setup our OnEvent as callback: void Awake() { PhotonNetwork.OnEventCall += this.OnEvent; } // handle events: private void OnEvent(byte eventcode, object content, int senderid) { if (eventcode == 0) { PhotonPlayer sender = PhotonPlayer.Find(senderid); // who sent this? byte[] selected = (byte[])content; foreach (byte unitId in selected) { // do something } } } | cs |
RaiseEventOptions
CachingOption, InterestGroup, TargetActors, Receivers, SequenceChannel, ForwardTowebhook, Encrypt가 있다.
그 중 CachingOption은 AddToRoomCache, AddToRoomCacheGlobal, RemoveFromRoomCache 등이 있는데
AddToRoomCache는 이벤트가 서버의 캐시에 놓여져 나중에 참가한 참여자들이 이 이벤트를 받는다.
플레이어가 떠나면 저장된 이벤트들이 캐시에서 제거되는데
AddToRoomCacheGlobal로 하게되면 룸의 이벤트 캐시로 들어가게 되어 삭제되지 않는다.
필요하지 않은 이벤트들은 RemoveFromCache를 이용하여 EventCode를 필터로 삭제한다.
'프로그래밍 공부 > Photon' 카테고리의 다른 글
RaiseEvent에 InterestGroup 설정시 메세지가 로컬플레이어에게 오지않는문제 (0) | 2018.10.10 |
---|---|
PlayFab으로 닉네임 설정하기 (8) | 2018.09.22 |
PlayFab을 이용하여 로그인 인증하기 (3) | 2018.08.09 |
10. 튜토리얼 문제 해결 (0) | 2018.08.07 |
9. 플레이어 UI 프리팹 (0) | 2018.08.07 |