PUN 2 Unity Photon.LoadLevel、IOnEventCallback 和 RaiseEvent

Posted

技术标签:

【中文标题】PUN 2 Unity Photon.LoadLevel、IOnEventCallback 和 RaiseEvent【英文标题】:PUN 2 Unity Photon.LoadLevel, IOnEventCallback and RaiseEvent 【发布时间】:2020-03-10 21:44:04 【问题描述】:

我正在使用 PUN 2 开发基于多人回合的游戏。在使用 RaiseEvent 加载场景后实例化对象时遇到问题。

一切都是从这个问题开始的:Synchronizing GameObjects with Players 但看来我必须先解决其他问题。让我解释一下。

我有一个带有“加入队列”按钮的场景,如果没有其他可用且 MaxPlayerCount = 2,它会创建一个房间。所以在第二个玩家加入后,我使用 Photon.LoadLevel(sceneName) 来加载游戏场景。在游戏场景中,我有一个生成一些对象的组件。在这个组件上,我使用 PhotonNetwork.RaiseEvent 将这些对象的位置发送给其他玩家。

PhotonView photonView = containerTile.GetComponent<PhotonView>();
if(PhotonNetwork.AllocateViewID(photonView))

    object[] data = new object[]
    
        containerTile.transform.position, containerTile.transform.rotation, photonView.ViewID
    ;

    RaiseEventOptions raiseEventOptions = new RaiseEventOptions
    
        Receivers = ReceiverGroup.Others,
        CachingOption = EventCaching.AddToRoomCache
    ;

    SendOptions sendOptions = new SendOptions
    
        Reliability = true
    ;

    PhotonNetwork.RaiseEvent(CustomEvent, data, raiseEventOptions, sendOptions);


public void OnEvent(EventData photonEvent)
        
    if(photonEvent.Code == CustomEvent)
    
        object[] data = (object[])photonEvent.CustomData;

        GameObject containerTile = (GameObject)Instantiate(containerPrefab, (Vector3)data[0], (Quaternion)data[1]);
        PhotonView photonView = containerTile.GetComponent<PhotonView>();
        photonView.ViewID = (int)data[2];
    

“CustomEvent”是我试图通过使用 IOnEventCallback 接口实现“OnEvent”回调来获取的自定义事件。当调用 OnEvent 时,EventData 代码是“PropertiesChanged(253)”,从文档中它似乎是在 MasterClient 更改房间时调用的,所以我猜 PhotonNetwork.LoadLevel 会这样做。

他们的文档说“当您使用广播选项“打开”调用 OpSetProperties 时,会触发此事件。它包含正在设置的属性。 我正在尝试跳过此 253 事件代码,但我不知道应该如何将“广播选项”设置为关闭,或者我想要实现的方法。

感谢阅读!

【问题讨论】:

只是为了理解,PUN 对PhotonNetwork.Instantiate 一个对象有一个原生特性,它可以让你将位置和旋转传递给其他人。你能解释一下为什么这不是你使用的吗? 【参考方案1】:

您不能将自己实例化为网络游戏对象,PUN 不能那样工作。

改为:

使用PhotonNetwork.Instantiate()

使用 IPunPrefabPool 接口创建您自己的系统来生成网络实例(查看 DefaultPool 类了解其内部实现方式)

请务必先完成基础教程,掌握 PUN 的几个重要特性以及如何开始使用它。

https://doc.photonengine.com/en-us/pun/v2/demos-and-tutorials/pun-basics-tutorial/player-instantiation

【讨论】:

嗨,我在网络上实例化资产包对象时遇到问题。我已经尝试过你的解决方案,它在大厅领导端成功实例化对象,但在客户端没有任何反应......你能否提供更多提示,如何在客户端也实例化相同......如果有合适的例子因为那更明显......谢谢......

以上是关于PUN 2 Unity Photon.LoadLevel、IOnEventCallback 和 RaiseEvent的主要内容,如果未能解决你的问题,请参考以下文章

Unity联网插件(PUN)

Photon PUN 2+ Unity 仅在我在本地运行两个实例时工作

Unity3D插件PUN 2插件分享《Unity3D多人在线联机联网插件》——客户端服务器端一体

Unity3D插件PUN 2插件分享《Unity3D多人在线联机联网插件》——客户端服务器端一体

在光子 Unity(PUN)中切换播放器控制

PUN介绍(干货)