PUN 2 Unity Photon.LoadLevel、IOnEventCallback 和 RaiseEvent
PUN 2 Unity Photon.LoadLevel, IOnEventCallback and RaiseEvent
我正在使用 PUN 2 开发多人回合制游戏。在使用 RaiseEvent 加载场景后实例化对象时遇到问题。
一切都是从这个问题开始的:Synchronizing GameObjects with Players但看来我必须先解决其他问题。让我解释一下。
我有一个带有按钮 "Join Queue" 的场景,如果没有其他可用且 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 会这样做。
他们的文档说 "When you call OpSetProperties with the broadcast option "on",此事件已触发。它包含正在设置的属性。"
我试图跳过这个 253 事件代码,但我不知道应该如何将 "broadcast option" 设置为关闭,或者这是我想要实现的方法。
感谢阅读!
您不能将自己实例化为网络游戏对象,PUN 不能那样工作。
改为:
使用PhotonNetwork.Instantiate()
使用 IPunPrefabPool 接口创建您自己的系统来生成网络实例(查看 DefaultPool class 以了解它在内部是如何完成的)
确保先完成基础教程,掌握 PUN 的几个重要功能以及如何开始使用它。
我正在使用 PUN 2 开发多人回合制游戏。在使用 RaiseEvent 加载场景后实例化对象时遇到问题。
一切都是从这个问题开始的:Synchronizing GameObjects with Players但看来我必须先解决其他问题。让我解释一下。
我有一个带有按钮 "Join Queue" 的场景,如果没有其他可用且 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 会这样做。
他们的文档说 "When you call OpSetProperties with the broadcast option "on",此事件已触发。它包含正在设置的属性。" 我试图跳过这个 253 事件代码,但我不知道应该如何将 "broadcast option" 设置为关闭,或者这是我想要实现的方法。
感谢阅读!
您不能将自己实例化为网络游戏对象,PUN 不能那样工作。
改为:
使用
PhotonNetwork.Instantiate()
使用 IPunPrefabPool 接口创建您自己的系统来生成网络实例(查看 DefaultPool class 以了解它在内部是如何完成的)
确保先完成基础教程,掌握 PUN 的几个重要功能以及如何开始使用它。