원본 글 : https://doc.photonengine.com/ko-kr/pun/current/demos-and-tutorials/pun-basics-tutorial/player-networking



플레이어 프리팹에 PhotonView 스크립트를 추가한다.

PhotonView 컴포넌트는 메시지 전송을 위한 스크립트로 게임오브젝트나 프리팹에 붙여주면 된다.

PhotonView는 유니티의 NetworkView와 유사하며 메시지 전송과 선택적으로 인스턴스 생성, 

다른 PhotonView 들의 할당을 위하여 항상 게임에서는 최소 하나의 PhotonView 가 있어야 한다고 함.




Transform 동기화

위와 마찬가지로 Photon Transform View 스크립트를 추가하고 아래와같이 세팅해준다.

Photon Transform View는 Photon View와 Transform 사이의 교량 역할을 함. 




Animator 동기화

위와 마찬가지로 Photon Animator View를 똑같이 세팅하고 Photon View가 Observe하게 만든다

Hi는 사용하지 않으므로 Disabled 해주고 나머지는 전부 Discrete로 설정한다

Discrete는 초당 10회 동기화 하겠다는의미고 Continuous로 설정하면 프레임마다 동기화.




사용자 입력관리

PlayerAnimatorManager로 가서 Update()문에 아래와 같이 추가한다.

1
2
if (photonView.isMine == false && PhotonNetwork.connected == true)
    return;
cs

photonView.isMine이 false면 즉 내가 아니면 애니메이터를 실행하지 않겠다는 것.

false이면 PhotonView 컴포넌트에 의해서만 transform과 애니메이터가 동기화되서 움직일것.




카메라 제어

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void Start()
{
    CameraWork _cameraWork = this.gameObject.GetComponent<CameraWork>();
    if(_cameraWork != null)
    {
        if(photonView.isMine)
        {
            _cameraWork.OnStartFollowing();
        }
    }
    else
    {
        Debug.LogError("<Color=Red><a>Missing</a></Color> CameraWork Component on playerPrefab."this);
    }
}
cs

CameraWork의 FollowOnStart를 꺼놓고(켜두면 프리팹들이 각자 카메라의 제어권을 가지려고 할것. 파트6 마지막참조)

PlayerManager 스크립트에 위와 같이 추가하여 나일때만 카메라가 따라오게함.




광선 발사 제어

카메라제어와 마찬가지로 나일때만 실행되게 ProcessInputs()를 isMine일때만 실행

1
2
3
4
if (photonView.isMine)
{
    ProcessInputs();
}
cs

대신에 다른 클라이언트에서는 광선발사가 되지않고, 이 부분은 PhotonView로 동기화하지도 않았으므로

스크립트에서 수동으로 동기화해줘야함.

그래서 PlayerManager 클래스에서 IPunObservable 인터페이스를 상속받아 아래와같이 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
void IPunObservable.OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
    if (stream.isWriting)
    {
        // We own this player: send the others our data
        stream.SendNext(IsFiring);
    }
    else
    {
        // Network player, receive data
        this.IsFiring = (bool)stream.ReceiveNext();
    }
}
cs

IsFiring이라는 bool 변수를 전송받고 보내줌으로 레이저를 쏘면 다른 클라이언트에서는 받아서 발사되는걸로 보임

Posted by misty_
,