Синхронизация объектов, импортированных во время выполнения, используя PUN - PullRequest
2 голосов
/ 16 марта 2019

В нашем многопользовательском проекте на Unity каждый пользователь импортирует модель во время выполнения, затем присоединяется к комнате и затем настраивает импортируемый объект времени выполнения как сетевой объект. Проблема в том, что импортированная модель уничтожается при выходе из хоста Вот мой фрагмент кода:

 private void Start()
    {
        pView = GetComponent<PhotonView>();
        pView.ownershipTransfer = OwnershipOption.Takeover;
        pView.ObservedComponents = new List<Component>();

        photonTransformView = transform.GetComponent<PhotonTransformView>();
        pView.ObservedComponents.Add(photonTransformView);
        pView.synchronization = ViewSynchronization.UnreliableOnChange;

        photonTransformView.m_PositionModel.SynchronizeEnabled = true;
        photonTransformView.m_RotationModel.SynchronizeEnabled = true;

        if (GetComponent<OVRGrabbable>() != null)
            transform.GetComponent<OVRGrabbable>().runtimeObj = this;
        partInfo = transform.GetComponent<PartInfo>();
        if (partInfo)
            partInfo.dynamicDync = this;

        if (PhotonNetwork.isMasterClient)
        {
            int objId = PhotonNetwork.AllocateViewID();
            // pView.viewID = objId;
            //TakeOwnership(PhotonNetwork.player);

            MSetPhotonViewId(PhotonNetwork.player.ID, gameObject.name, objId);
        }
    }

    public void MSetPhotonViewId(int id, string objName, int objId)
    {
        //pView.RPC("SetOwnerForObject", PhotonTargets.Others, id);
        object[] content = new object[3];
        content[0] = id;
        content[1] = objName;
        content[2] = objId;
        PhotonNetwork.RaiseEvent(ownerId, content, true, new RaiseEventOptions() { Receivers = ReceiverGroup.All, CachingOption = EventCaching.AddToRoomCache });
    }

    private void OnEvent(byte eventcode, object content, int senderid)
    {
        if (eventcode == ownerId)
        {
            object[] data = (object[])content;
            if (gameObject.name == (string)data[1])
            {
                if (!pView)
                    StartCoroutine(MGetPhotonViewId(content, senderid));
                else
                {
                    pView.viewID = (int)data[2];
                    //Debug.Log("transfering ownership of: " + gameObject.name + " to: " + ((int)data[0]).ToString());
                    pView.TransferOwnership((int)data[0]);
                }
            }
        }
    }

    IEnumerator MGetPhotonViewId(object content, int senderid)
    {
        while (!pView)
        {
            yield return null;
        }

        object[] data = (object[])content;
        if (gameObject.name == (string)data[1])
        {
            pView.viewID = (int)data[2];
            //Debug.Log("transfering ownership of: " + gameObject.name + " to: " + ((int)data[0]).ToString());
            pView.TransferOwnership((int)data[0]);
        }
    }

Как избежать разрушения объекта в других системах после ухода хоста?

1 Ответ

0 голосов
/ 18 марта 2019

Когда игрок выходит из игры, его действия обычно не актуальны для новых игроков. Чтобы избежать заторов при объединении, сервер Photon по умолчанию автоматически очищает события, которые были кэшированы игроком, который навсегда покинул комнату.

Если вы хотите очистить кэш событий комнат вручную, вы можете создать комнаты, для которых RoomOptions.CleanupCacheOnLeave имеет значение false.

См. Документы .

...