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