unity与C++之间的一些交互

文章详细介绍了如何在C#和C++之间进行数据传递,包括基本数据类型和结构体的传递。在C++端创建DLL项目,定义DLL导出函数,C#端通过DllImport调用来接收和发送数据。同时,文章还阐述了C++如何注册和调用C#的回调函数,实现双方的相互调用。
摘要由CSDN通过智能技术生成

C# 传递数据到 C++

步骤:

  1. 先在C++端定义好对应结构 数据基本类型方法都一样 Int Float bool 等

这里介绍两种, 一种是基本数据类型,一种是 结构体类型

首先用visual studio 新建一个DLL项目

C++端文件配置

新建一个Bridge的类

h文件定义如下

CPP文件如下:

C#端配置文件

然后在C#端也需要做一些想对应的配置

  1. 基本类型的配置


//如果只是传递基本数据类型
[DllImport("native", EntryPoint = "IntParameter")]
//这里也可以自定函数名 比如把 IntParameter 改成 TransferInt
private static extern int IntParameter(int a);
//调用的地方需要
int a = 5;
int b = IntParameter(a);
//这样就可以把C#数据传递给C++ 并得到对应的返回值  如果函数名更改了这里就应该调用TransferInt(a);
  1. 结构体的配置


public struct Person
{
    public int Age;
    public float Height;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public int[] Scores;
    public bool Married;
}

//同样在调用之前先需要声明
[DllImport("native", EntryPoint = "StructParameter")]
private static extern void StructParameter(IntPtr p);
//然后在调用的地方
Person per;
IntPtr p = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Person)));
StructParameter(p);
Person pOut = (Person)Marshal.PtrToStructure(p, typeof(Person));
Debug.Log(string.Format("StructParameter(): {0}", pOut.Age));

上面是关于C# 传递数据给C++的一些配置

C++端传递数据给C#端

首先在C#段需要注册函数到C++端. 然后C++在合适的时候才可以调用C#端的函数 传递 或者得到数据

C#端的文件配置

//必须在脚本文件中包含这个类才可以产生回调
public class MonoPInvokeCallbackAttribute : Attribute
{
    public MonoPInvokeCallbackAttribute() { }
}
//定义好对应的注册方法
[DllImport("native")]
public static extern void RegisterStructPtr(StructDelegate fp);
[MonoPInvokeCallback]
//然后定义好对应的回调方法
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void StructDelegate(Person per);

//首先在脚本的Start()函数注册对应的回调函数   使用C++端定义好的函数注册
RegisterStructPtr(CallBackStructStructFunction);

[MonoPInvokeCallback]
static void CallBackStructStructFunction(Person p){
     Debug.Log("CallBackStructStructFunction : " + p.Age);
}

//还有一种可以使用void 直接接收,但是需要转换
//使用方法
Person per = IntPtrToStruct<Person>(strPtr);
//转换函数
public static T IntPtrToStruct<T>(IntPtr info)
{
    return (T)Marshal.PtrToStructure(info, typeof(T));
}

C++端(完成头文件上面有)

NativeCallUnity 是关于C++中调用C#函数的

文件如下

NativeCallUnity.h

NativeCallUnity.cpp

上面是C++文件相关的配置

C++调用C#函数的地方



void CallStructStruct(){
    Person www = Person();
    //调用保存的函数
    NativeCallUnity::transmitStruct(list);
 }
//注册函数到NativeCallUnity中保存
 void RegisterStructPtr(NativeCallUnity::CallStructPtr ptr) {
    NativeCallUnity::SetStructPtrCallBackFuncPtr(ptr);
}

这样就实现了 两者间的互相调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值