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[] { 12510 };    // 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를 필터로 삭제한다.

Posted by misty_
,