이전 글에서 포톤 튜토리얼을 따라하면서, PhotonView 컴포넌트에 등록해서 동기화하는 방식만 익혔다.
더 알아보니 이렇게 동기화하는 방식말고도 여러가지가 존재했다.
참고
https://doc.photonengine.com/ko-kr/pun/current/gameplay/synchronization-and-state
https://www.youtube.com/watch?v=8zJRxOU4aCc
갱신이 많이 발생하는 경우
PhotonView 컴포넌트를 사용하기.
예) 위치 이동이나 상태 변경 등등.
1. Transform(위치,회전,크기) 동기화하기.
PhotonView 컴포넌트에 Photon Transform View 컴포넌트 등록하기.
최신 버전의 Photon은 Photon Transform View 컴포넌트를 Simple하게 만들어놓아서,
옛날 버전인 Photon Transform View Classic 컴포넌트로 조금 더 세세하게 조정이 가능하다.
최대한 Simple하게 만들어서 배우기 쉽게 하려는 것 같다.
2. 애니메이션 파라미터 동기화하기.
PhotonView 컴포넌트에 Photon Animator View 컴포넌트 등록하기.
Disable : 동기화하지 않음.
Discreate : 초당 10번 동기화.
Continuous : 매 프레임마다 동기화.
이것도 결국엔 3번처럼 OnPhotonSerializeView에서 호출된다. (문서에 이렇게 적혀있다.)
PhotonView는 편리하게 제공해주는 느낌??
3. 체력과 같은 특별한 변수를 동기화하기.
PhotonView 컴포넌트에 이 코드가 들어있는 스크립트 컴포넌트 등록하기.
// IPunObservable 인터페이스를 구현해야한다.
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
if (stream.IsWriting)
{
// We own this player: send the others our data
stream.SendNext(IsFiring);
stream.SendNext(Health);
}
else
{
// Network player, receive data
this.IsFiring = (bool)stream.ReceiveNext();
this.Health = (float)stream.ReceiveNext();
}
}
마지막으로 Photon View 컴포넌트에 등록하면 된다.
Auto 기능이 있어서, 자동으로 등록되어서 편했다.
Unreliable : 고정된 주기로 계속 전송.
Unreliable On Change : 게임 오브젝트가 휴식 중이라면 전송 안함. (이라고 되어있는데, 잘 모르겠음. 일단 다 이거 쓰는 것 같음.)
갱신이 드문드문 일어나는 경우
RPC로 전송하기. 사용자가 직접 발생시키는 동기화라고 생각하면 될 듯 하다.
예) 캐릭터 장비 착용하는 타이밍, 채팅 타이밍 정도??
RPC 같은 경우에는 이해만 하는 것보단, 한번 써보면서 시행착오를 겪는 게 좋을 것 같다. 대충 이해는 간다.
주의할 것은
1.
photonView.IsMine으로 묶는 것.
2.
RpcTarget.All 이면, 호출되고 잊어버림.
RpcTarget.AllBuffered 이면, 호출되고 버퍼에 저장됨. 이후에 누가 들어오면 자동으로 순차적으로 실행된다.
버퍼에 너무 많이 저장되면, 네트워크가 약한 클라이언트는 끊어질 수 있다고 한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
public class PlayerScript : MonoBehaviourPunCallbacks
{
public SpriteRenderer SR;
void Update()
{
if (photonView.IsMine)
{
float axis = Input.GetAxisRaw("Horizontal");
transform.Translate(new Vector3(axis * Time.deltaTime * 7, 0, 0));
if (axis != 0) photonView.RPC("FlipXRPC", RpcTarget.AllBuffered, axis);
}
}
[PunRPC]
void FlipXRPC(float axis)
{
SR.flipX = (axis == -1);
}
}
갱신이 아주 드물게 일어나는 경우
Custom Properties 사용하기.
예) 문이 열려있는지, 닫혀있는지. 이전에 문이 몇번 열리고 닫혔는지 그런거 신경 1도 안써도 됨. (버퍼에 저장안하고 있어도 되는 것들.)
주의할 것은
1.
해쉬 테이블을 사용할 때 유니티의 해쉬 테이블과 겹치기 때문에, using문을 써줘야한다.
2.
해쉬테이블 값의 자료형으로는 이런 것들이 가능하다.
https://doc.photonengine.com/ko-kr/realtime/current/reference/serialization-in-photon
3.
RoomOption.CustomProperties는 Room의 커스텀 프로퍼티이다.
서든어택에서 칼전이라든지 인원은 5vs5라든지 이렇게 특정 방을 구분지을 때? 쓸 것 같다.
게임 시간을 100초나 200초로 정한다든지. 등등
매치메이킹할 때, 필터링으로 좋을 듯.
4.
Player.CustomProperties는 Player의 커스텀 프로퍼티이다.
캐릭터 팀 선택?? 일 때 쓸려나??
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
using Hashtable = ExitGames.Client.Photon.Hashtable;
public class NetworkManager : MonoBehaviourPunCallbacks
{
void Awake()
{
Screen.SetResolution(960, 540, false);
PhotonNetwork.ConnectUsingSettings();
}
public override void OnConnectedToMaster()
{
RoomOptions roomOption = new RoomOptions();
roomOption.MaxPlayers = 6;
roomOption.CustomRoomProperties = new Hashtable() { { "키1", "문자열" }, { "키2", 1 } };
PhotonNetwork.JoinOrCreateRoom("Room", roomOption, null);
}
public override void OnJoinedRoom()
{
Hashtable CP = PhotonNetwork.CurrentRoom.CustomProperties;
print(CP["키1"]);
CP["키1"] = "gd";
CP.Add("키3", 0.5f);
print(CP.Count);
CP.Remove("키3");
if (PhotonNetwork.IsMasterClient)
{
PhotonNetwork.LocalPlayer.SetCustomProperties(new Hashtable { { "IsAdmin", "Admin" } });
Hashtable playerCP = PhotonNetwork.LocalPlayer.CustomProperties;
print(playerCP["IsAdmin"]);
for (int i = 0; i < PhotonNetwork.PlayerList.Length; i++)
{
PhotonNetwork.PlayerList[i].SetCustomProperties(new Hashtable { { "IsAdmin", "Admin" } });
}
}
}
}
'Unity' 카테고리의 다른 글
포톤 삽질 정말 재밌다 하하 (0) | 2021.10.01 |
---|---|
[포톤] 직접 예제 만들어보기 (랜덤 입장할 때, 필터링하기 / 매칭하기) (3) | 2021.09.29 |
[Unity] SafeArea로 모바일 Notch 디자인 대응하기 (0) | 2021.09.28 |
[포톤] 콜백 함수들 (1) | 2021.09.27 |
포톤 연동하기 (0) | 2021.09.27 |