关于FMETP结合Photon PUN数据传输无接收的技术求助
问题排查与解决建议:FMETP + Photon PUN 数据接收失败
你当前尝试通过FMStreamPun脚本桥接FMETP编码器和解码器,基于Photon PUN同步数据,但解码器始终收不到编码器发送的信息。以下是针对性的排查和修复方案:
1. 检查PhotonView组件核心配置
挂载FMStreamPun脚本的对象必须正确配置PhotonView,否则同步逻辑根本不会触发:
- 确保对象上存在PhotonView组件,且
Observed Components列表中已添加FMStreamPun脚本(这是触发IPunObservable接口OnPhotonSerializeView方法的必要条件) View ID设置为Auto Sync或手动分配唯一ID,保证房间内所有客户端的该ID一致- 确认
Ownership Transfer设置符合需求:发送数据的客户端必须是该PhotonView的拥有者,否则无法写入流
2. 验证FMETP编码器与FMStreamPun的绑定逻辑
- 确认FMETP Encoder的输出事件(如
OnEncodedDataReady)已正确绑定到FMStreamPun的Action_SendData方法 - 运行时查看控制台是否打印
entro al action send data:如果没打印,说明编码器的数据根本没传入FMStreamPun,检查绑定是否遗漏、编码器是否激活
3. 修复FMStreamPun脚本的逻辑缺陷
读取逻辑的冗余判断
原脚本中stream.IsReading分支的!photonView.IsMine判断完全多余——因为stream.IsReading本身只会在非拥有者客户端触发,这个判断会导致部分客户端无法读取数据,直接移除:
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { Debug.Log("entro al seriaize view"); if (stream.IsWriting) { Debug.Log("is writting"); stream.SendNext(appendQueueSendDataCount); while (appendQueueSendDataCount > 0) { byte[] sentData = appendQueueSendData.Dequeue(); stream.SendNext(sentData); } } if (stream.IsReading) { // 移除 !photonView.IsMine 判断 int streamCount = (int)stream.ReceiveNext(); for (int i = 0; i < streamCount; i++) { byte[] receivedData = (byte[])stream.ReceiveNext(); OnDataByteReadyEvent.Invoke(receivedData); } } }
同步触发验证
运行时检查控制台日志:
- 如果没打印
entro al seriaize view:回到第一步检查PhotonView配置 - 如果只打印
entro al seriaize view但没打印is writting:说明当前客户端不是PhotonView的拥有者,无法写入流,调整拥有者设置
4. 确认FMETP解码器的绑定与状态
- 确保
FMStreamPun的OnDataByteReadyEvent已绑定到FMETP Decoder的输入方法(如Action_DecodeData) - 临时添加日志验证接收逻辑:
void Start() { OnDataByteReadyEvent.AddListener((data) => Debug.Log("收到同步数据,长度:" + data.Length)); } - 确认解码器处于激活状态,且编码格式、参数与编码器完全一致
5. 网络环境与房间状态检查
- 确保至少两个客户端连接到同一个Photon房间,网络状态正常
- 暂时保留
Action_SendData中被注释的玩家数量判断(或直接移除),测试时保证房间内有至少两名玩家(单玩家场景下不会触发读取逻辑)
内容的提问来源于stack exchange,提问作者Serchnm
相关产品推荐
相关产品推荐

