Unity与c++结构体中带数组参数传递

Unity与c++结构体中带数组参数传递
在unity与c++ 进⾏交互中往往会有结构体的数据传递,如果在结构体中定义了数组,那么在unity中需要怎样去定义结构体从⽽对应c++中定义的带有数组的结构体呢.
请看代码
#ifndef TRACK_H_H_
#define TRACK_H_H_
上海海洋大学学报#define TRACK_POINT_SIZE 68
#define TRACK_MOUNT_POINT_SIZE 11
#ifdef __cplusplus
extern "C" {
#endif
typedef struct TrackPointCoord{
float x;
float y;
}TrackPointCoord;
typedef struct TRACK2DRET{
TrackPointCoord allTrackPoints[TRACK_POINT_SIZE];
TrackPointCoord mountTrackPoints[TRACK_MOUNT_POINT_SIZE];
float  scale;不断深化对三个规律的认识
float  angle;
float  rendering_paramsy;
float  rendering_paramsx;
}TRACK2DRET;
bool Track2DForUnity3D(unsigned char* rgba, TRACK2DRET* track2dRet);
#ifdef __cplusplus
}
#endif
#endif
在c++代码中定义了⼀个结构体,结构体中还定义了两个数组对象。那么c#该怎样定义呢
请看代码:
using System.Runtime.InteropServices;
using UnityEngine;
public struct TrackPointCoord
{
public float x;
public float y;
public TrackPointCoord(float _x, float _y)
{
this.x = _x;
this.y = _y;
}
};
public struct TRACK2DRET
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 68)]
public TrackPointCoord[] allTrackPoints;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
public TrackPointCoord[] mountTrackPoints;
public float scale;政治权利是什么
public float angle;
public float angle;
public float rendering_paramsy;
public float rendering_paramsx;
public TRACK2DRET(TrackPointCoord[] _allTrackPoints, TrackPointCoord[] _mountTrackPoints, float _scale, float _angle, float _rendering_paramsy, float _ren    {
this.allTrackPoints = _allTrackPoints;
麻醉系统
this.scale = _scale;
this.angle = _angle;
}
};
public class TrackTool: Manager
{
欧姆定律教案#region Android
#if UNITY_ANDROID
[DllImport("TrackToolForUnity3D")]
private static extern bool Track2DForUnity3D(byte[] rgba, ref TRACK2DRET track2dRet);
#endif
#endregion
/// <summary>
/// 初始化结构体
/// </summary>
public TRACK2DRET InitStruct()
{
TrackPointCoord[] _allTrackPoints, _mountTrackPoints;
TrackPointCoord _TrackPointCoord = new TrackPointCoord(0, 0);
_allTrackPoints = new TrackPointCoord[68];
_mountTrackPoints = new TrackPointCoord[11];
for (int i = 0; i < _allTrackPoints.Length; i++)
{
_allTrackPoints[i] = _TrackPointCoord;
}
for (int i = 0; i < _mountTrackPoints.Length; i++)
{
_mountTrackPoints[i] = _TrackPointCoord;
}
TRACK2DRET track2dret = new TRACK2DRET(_allTrackPoints, _mountTrackPoints, 0, 0, 0, 0);
return track2dret;
}
//调⽤so
public bool GetTarck2d(Color32[] Pixels,ref TRACK2DRET track2dret)昆明理工大学楚雄应用技术学院
{
return Track2DForUnity3D(Color32ArrayToByteArray(Pixels), ref track2dret);
}
/// <summary>
/// color32 array to byte array
/// </summary>
/// <param name="colors"></param>
/// <returns></returns>
byte[] Color32ArrayToByteArray(Color32[] colors)
{
if (colors == null || colors.Length == 0)
return null;
int length = Marshal.SizeOf(typeof(Color32)) * colors.Length;
byte[] bytes = new byte[length];
GCHandle handle = default(GCHandle);
try
{
handle = GCHandle.Alloc(colors, GCHandleType.Pinned);
Marshal.Copy(handle.AddrOfPinnedObject(), bytes, 0, length);
}
finally
{
if (handle != default(GCHandle))
handle.Free();
}
return bytes;
}
}
在c# 可以看到
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 68)]
MarshalAs属性指⽰如何在托管代码和⾮托管代码之间封送数据
[MarshalAs(UnmanagedType unmanagedType, 命名参数)]
实际上相当于构造⼀个MarshalAsAttribute类的对象
常⽤的UnmanagedType枚举值:
BStr  长度前缀为双字节的 Unicode 字符串;
LPStr  单字节、空终⽌的 ANSI 字符串。;
LPWStr  ⼀个 2 字节、空终⽌的 Unicode 字符串;
ByValArray⽤于在结构中出现的内联定长字符数组,应始终使⽤MarshalAsAttribute的SizeConst字段来指⽰数组的⼤⼩。SizeConst值对应着c++中定义的结构体中数组⼤⼩.。
-----------------------》
在c#中想要获取c++中返回的结构体值需要使⽤ref⽅法。
[DllImport("TrackToolForUnity3D")]
private static extern bool Track2DForUnity3D(byte[] rgba, ref TRACK2DRET track2dRet);
c++中:
bool Track2DForUnity3D(unsigned char* rgba, TRACK2DRET* track2dRet);
-----------------------------》
说下unsigned char* rgba参数
在c# 中需要定义对象为byte[]形式进⾏传值。上⾯代码中提供⼀个简便的将Color32[]转为byte[]⽅法。

本文发布于:2024-09-23 16:14:03,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/361255.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:结构   定义   数组   代码   托管   技术   应用
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议