Photon PUN


Photon pun2 개념

  • Prefab(프리팹)이란 한 줄로 설명하자면 : 미리 만들어진 Object를 재활용 가능한 형태로 만들어 두는 것을 의미합니다.
  • 편리한 점: 여러 Scene에서 같은 Object가 필요할 때, Prefab으로 만들어 두면 Object를 재사용하기 편리해집니다.

RPC

using Photon.Pun;
using Photon.Realtime;

public PhotonView photonView;

    void Start()
    {
        photonView = PhotonView.Get(this);//포톤뷰 참조 가져오기
    }

public void RPC_fade_out()
    {
        photonView.RPC("start_fade_out", RpcTarget.All);//RPC 호출하기
    }

[PunRPC] //RPC 함수 등록
    public void start_fade_in()
    {
        Debug.Log("start_fade_in");
    }

#에러목록

  • Could not find RPC with index
  • Going to ignore! Check PhotonServerSettings.RpcList
  • 혼자할때는 됨. 상대방 RPC호출하다가 인덱스 에러 일으킨것 같음.

RaiseEvent

  • 호출 ```c# using ExitGames.Client.Photon; using Photon.Realtime; using Photon.Pun;

public class SendEventExample { // If you have multiple custom events, it is recommended to define them in the used class public const byte MoveUnitsToTargetPositionEventCode = 1;

private void SendMoveUnitsToTargetPositionEvent()
{
    object[] content = new object[] { new Vector3(10.0f, 2.0f, 5.0f), 1, 2, 5, 10 }; 
    // Array contains the target position and the IDs of the selected units
    RaiseEventOptions raiseEventOptions = new RaiseEventOptions { Receivers = ReceiverGroup.All }; 
    // You would have to set the Receivers to All in order to receive this event on the local client as well
    PhotonNetwork.RaiseEvent(MoveUnitsToTargetPositionEventCode, content, raiseEventOptions, SendOptions.SendReliable);
} } ```

  • 콜백등록 ```c# using ExitGames.Client.Photon; using Photon.Realtime; using Photon.Pun;

public class ReceiveEventExample : MonoBehaviour, IOnEventCallback { private void OnEnable() { PhotonNetwork.AddCallbackTarget(this); }

private void OnDisable()
{
    PhotonNetwork.RemoveCallbackTarget(this);
}

public void OnEvent(EventData photonEvent)
{
    byte eventCode = photonEvent.Code;
    if (eventCode == MoveUnitsToTargetPositionEvent)
    {
        object[] data = (object[])photonEvent.CustomData;
        Vector3 targetPosition = (Vector3)data[0];
        for (int index = 1; index < data.Length; ++index)
        {
            int unitId = (int)data[index];
            UnitList[unitId].TargetPosition = targetPosition;
        }
    }
} } ```

public void OnEnable()
{
    PhotonNetwork.NetworkingClient.EventReceived += OnEvent;
}

public void OnDisable()
{
    PhotonNetwork.NetworkingClient.EventReceived -= OnEvent;
}

특정 함수를 등록하여 사용


6. Photon Scene Change

https://www.youtube.com/watch?v=4f_VGLtdQ-I

https://www.youtube.com/watch?v=51W7tnnvzbs

RPC : Remote Procedure Call : 원격 프로시저 콜


Photon으로 오브젝트 동기화하는 방법

1). 잡는 기능을 가진 오브젝트를 동기화시킬 때

: 잡을 수 있는 범위를 가진 오브젝트, 즉 BoxCollider를 가지고 있는 Obeject 안에 Photon View, Photon Transform View, Pun OVR Grabbable 스크립트 추가


- 체크 할 것

  • Photon View : -Ownership Transfer - TrakeOver -Synchronization - Unreliable On Change. -Observable Search - Manual (이때 Observable Components는 자기 자신 (해당 스크립트를 가지고 있는 오브젝트)으로 하기

→ 드래그 드랍 시 Photon Transform View 스크립트 자동 생성

  • Photon Transform View :
  • Position - Check, Rotation - Check, Use Local - Uncheck

  • Pun OVR Grabbable :
  • Allow Offhand Grab - Check

  • Rigidbody 추가(설정 Interpoliate로 변경), boxcollider 추가