프로그래밍 농장

포톤 실시간 동기화 방식 Synchronization Issues [Unity] 본문

Unity

포톤 실시간 동기화 방식 Synchronization Issues [Unity]

Tennessee201 2022. 11. 2.
728x90
 

Synchronization Issues (Unity + Photon): Part 1

The start of a series exploring synchronization issues in Unity and Photon through example.

john-tucker.medium.com

포톤을 통하여 각 사용자의 화면간에 동기화를 진행해줄때는 다양한 방법이 있다. 

기본적으로 Application은 포톤서버와 각각 통신한다. 이 과정에서 두 플레이어(클라이언트) 간 RTT의 합계가 필요하다 .

네트워크적으로 깊은개념을 제쳐두고 우선 결과만 본다면 1초정도의 지연이 발생한다고 한다.


아래는 포톤 공식홈페이지에서 제안하는 클라이언트 간 동기화 속도 개선방법 

 

지연 보상 | Photon Engine

 

doc.photonengine.com

 

기본적으로 포톤에서 패킷은 1초에 10번을 전송한다. 그렇기 때문에 포톤에서 값을 받아온 후, 클라이언트에서 해당 값을 보정해주어야 한다. 

using UnityEngine;

public class Ball : Photon.MonoBehaviour, IPunObservable {

    Vector3 _networkPosition;
    Quaternion _networkRotation;
    Rigidbody _rb;

    public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.isWriting)
        {
            stream.SendNext(_rb.position);
            stream.SendNext(_rb.rotation);
            stream.SendNext(_rb.velocity);
        }
        else
        {
            _networkPosition = (Vector3)stream.ReceiveNext();
            _networkRotation = (Quaternion)stream.ReceiveNext();
            _rb.velocity = (Vector3)stream.ReceiveNext();

            float lag = Mathf.Abs((float)(PhotonNetwork.time - info.timestamp));
            _networkPosition += (_rb.velocity * lag);
        }
    }

    void Start()
    {
        _rb = GetComponent<Rigidbody>();
    }

    public void FixedUpdate()
    {
        if (!photonView.isMine)
        {
            _rb.position = Vector3.MoveTowards(_rb.position, _networkPosition, Time.fixedDeltaTime);
            _rb.rotation = Quaternion.RotateTowards(_rb.rotation, _networkRotation, Time.fixedDeltaTime * 100.0f);
        }
    }
}
728x90