Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在android上运行的unity中共享内存?_Java_C#_Unity3d - Fatal编程技术网

Java 如何在android上运行的unity中共享内存?

Java 如何在android上运行的unity中共享内存?,java,c#,unity3d,Java,C#,Unity3d,我已经为一个每秒更新x、y、z位置200次的设备编写了一个usb驱动程序,我不希望调用某个函数每秒获取200次新值,从而更新共享内存位置上的值。 是否可以将IntPtr传递给AndroidJavaObject.call方法并使用该方法访问共享内存,或者以其他方式访问? 还是有不同的方法来解决这个问题? 发布我的代码没有意义,因为没有关于共享内存的内容 在统一方面: 您可以将您在Android插件中的位置保存到一个变量中。然后根据需要从Unity对其进行轮询(例如,在更新循环中) 安卓 统一 //

我已经为一个每秒更新x、y、z位置200次的设备编写了一个usb驱动程序,我不希望调用某个函数每秒获取200次新值,从而更新共享内存位置上的值。 是否可以将IntPtr传递给AndroidJavaObject.call方法并使用该方法访问共享内存,或者以其他方式访问? 还是有不同的方法来解决这个问题? 发布我的代码没有意义,因为没有关于共享内存的内容

在统一方面:


您可以将您在Android插件中的位置保存到一个变量中。然后根据需要从Unity对其进行轮询(例如,在更新循环中)

安卓 统一
//位置值的类
公共类位置数据
{
公共int X;
公共智力;
公共INTZ;
}
//来自Android的投票位置(usbController在其他地方初始化)
公共位置数据读取位置数据()
{
var data=usbController.Call(“getCurrentPosition”);
如果(数据==null)
{
LogError(“无法从Android检索数据”);
返回null;
}
变量位置数据=新位置数据
{
X=数据。获取(“X”),
Y=数据。获取(“Y”),
Z=data.Get(“Z”)
};
返回位置数据;
}
USB通信应该在它自己的线程中,访问它的值必须是线程安全的(Unity在主线程上运行)

此外,您还可以在Android中实现一些过滤,以平滑您的值。

请给出详细说明
        AndroidJavaClass unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
        AndroidJavaObject unityContext = unityActivity.Call<AndroidJavaObject>("getApplicationContext");


        float[] res = new float[7];
        IntPtr ptr = Marshal.AllocHGlobal(res.Length * sizeof(float));

        var ajc = new AndroidJavaObject("com.example.t265lib.USBController", unityContext, 256, ptr, null);
    public USBController(Context context, int chunkSize, int ptr,TextView deb) {
        if (deb != null) debugging = deb;
        if (chunkSize != 0) CHUNK_SIZE = chunkSize;
        msg = new byte[9];
        msgResponse = new byte[8];
        resPtr = new float[7];
        this.context = context;
        usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
    }
// inner class for position values
public class PositionData {
    public int x;
    public int y;
    public int z;
}

// access data from unity
public PositionData getCurrentPosition() { 
    // TODO: make thread-safe
    return mCurrentPosition;
}
// class for position values
public class PositionData
{
    public int X;
    public int Y;
    public int Z;
}

// poll position from Android (usbController is initialised somewhere else)
public PositionData ReadPositionData()
{
    var data = usbController.Call<AndroidJavaObject>("getCurrentPosition");

    if (data == null)
    {
        Debug.LogError("Could not retrieve data from Android.");
        return null;
    }

    var positionData = new PositionData
    {
        X = data.Get<int>("x"),
        Y = data.Get<int>("y"),
        Z = data.Get<int>("z")
    };

    return positionData;
}