两个Unity应用HLA数据共享异常:接收属性值始终为0
HLA Unity数据同步问题:订阅端属性值始终为0
开发项目中,需要让两个Unity应用通过高层体系结构(HLA)共享数据,使用PitchRTI作为运行时基础设施(RTI),编写了C++的.dll插件处理HLA交互(插件包含FOM)。
当前配置:两个应用已加入同一联邦,Unity应用1更新BoxObject的positionX和positionY属性并发布到联邦,Unity应用2订阅这些属性并接收更新值。但Unity应用2虽能接收数据包,属性值却始终为0。
Unity应用1:发布更新代码
void UpdatePosition() { try { box1.positionX = (float)double.Parse(positionX.text); box1.positionY = (float)double.Parse(positionY.text); Debug.Log($"{box1.id}, {box1.positionX}, {box1.positionY}"); Connector.UpdateUnit(box1); } catch (Exception e) { Debug.Log("Update error occurred: " + e); } }
Unity应用2:订阅接收代码
private void GetBoxData() { int size = 0; IntPtr dataPtr = Connector.GetBoxes(ref size); if (size > 0) { BoxData[] boxDataFromHLA = new BoxData[size]; int offset = 0; int dataBoxSize = Marshal.SizeOf(typeof(BoxData)); for (int i = 0; i < size; i++, offset += dataBoxSize) { boxDataFromHLA[i] = Marshal.PtrToStructure<BoxData>(new IntPtr(dataPtr.ToInt64() + offset)); Debug.Log(boxDataFromHLA[i].positionX); Debug.Log(boxDataFromHLA[i].positionY); cube.transform.position = new Vector3(boxDataFromHLA[i].positionX, boxDataFromHLA[i].positionY, 1); } } }
联邦连接器脚本
using UnityEngine; using System.Runtime.InteropServices; using System; // Define the same data structure that is being used in dll public struct BoxData { public int id; public float positionX; public float positionY; } public class Connector : MonoBehaviour { [DllImport("hla_plugin.dll")] public static extern void Connect(string federationName, string federateName, string fomFilePath); [DllImport("hla_plugin.dll")] public static extern void Disconnect(); // Test Sim methods [DllImport("hla_plugin.dll")] public static extern void PublishUnit(); [DllImport("hla_plugin.dll")] public static extern void SubscribeUnit(); [DllImport("hla_plugin.dll")] public static extern int CreateUnit(); [DllImport("hla_plugin.dll")] public static extern void UpdateUnit(BoxData unit1Data); [DllImport("hla_plugin.dll")] public static extern IntPtr GetBoxes(ref int size); }
已排查的问题
- Unity应用1中
positionX和positionY属性已正确初始化和更新,自身订阅BoxObject时能看到更新值; - DLL在两个Unity应用中均正确加载并运行;
- 两个Unity应用均已正确连接RTI并加入同一联邦;
- 两个Unity应用使用相同的联邦对象模型(FOM)。
作为C++、HLA和仿真领域的新手,恳请帮助排查问题或提供进一步调试的方法。
内容的提问来源于stack exchange,提问作者Keiken
相关产品推荐
相关产品推荐

