使用PUN同步在运行时导入的对象

问题描述 投票:2回答:1

在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]);
        }
    }

当主机离开时,如何避免在其他系统上销毁对象?

unity3d multiplayer photon
1个回答
0
投票

当玩家退出游戏时,通常他/她的行为不再与新玩家相关。为了避免加入时出现拥塞,默认情况下,Photon服务器会自动清除播放器缓存的事件,这些事件已经离开了房间。

如果要手动清理房间的事件缓存,可以创建RoomOptions.CleanupCacheOnLeave设置为false的房间。

See the docs

© www.soinside.com 2019 - 2024. All rights reserved.