You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:12:48