原生实现C#和Lua相互调用-Unity3D可用【中】

简介: 1. 编译Windows下使用的DLL文件 使用VS2015创建一个空的动态链接库项目,删除里面默认创建的几个文件(如果想自定义拓展可用保留),然后把Lua的源码拷贝进来,添加到项目工程中,编译宏需要配置LUA_BUILD_AS_DLL和_CRT_SECURE_NO_WARNINGS。然后就可以编译x86和x64的DLL动态库,整体步骤简单易操作。

原生实现C#和Lua相互调用-Unity3D可用【中】



 3.需要注意的几个地方


       1. 返回char*时,不可直接使用string替换,否则调用会导致崩溃,因此需要像下面代码展示的那样进行一下转换才可以使用。


[DllImport("CSharpLua", EntryPoint = "lua_tolstring")]
private static extern IntPtr _lua_tolstring(IntPtr L, int idx, ref uint size);
public static string lua_tolstring(IntPtr L, int idx, ref uint size)
{
    IntPtr buffer = _lua_tolstring(L, idx, ref size);
    return Marshal.PtrToStringAnsi(buffer);
}


2. C#函数传递给Lua使用时,需要使用delegate委托类型。


public delegate int LuaFunction(IntPtr L);
[DllImport("CSharpLua", EntryPoint = "lua_pushcclosure")]
public static extern void lua_pushcclosure(IntPtr L, LuaFunction func, int idx);
public static void lua_pushcfunction(IntPtr L, LuaFunction func)
{
   lua_pushcclosure(L, func, 0);
}


   3. 在lua源码中定义的宏代码是无法使用的,会提示找不到,需要在C#中手动实现,例如下面展示的2个宏。


#define lua_setglobal(L,s)  lua_setfield(L, LUA_GLOBALSINDEX, (s))
#define lua_getglobal(L,s)  lua_getfield(L, LUA_GLOBALSINDEX, (s))


[DllImport("CSharpLua", EntryPoint = "lua_getfield")]
public static extern void lua_getfield(IntPtr L, int idx, string s);
public static void lua_getglobal(IntPtr L, string s)
{
   lua_getfield(L, LUA_GLOBALSINDEX, s);
}
[DllImport("CSharpLua", EntryPoint = "lua_setfield")]
public static extern void lua_setfield(IntPtr L, int idx, string s);
public static void lua_setglobal(IntPtr L, string s)
{
   lua_setfield(L, LUA_GLOBALSINDEX, s);
}


4. 如需要将C#的类实例对象即userdata传递给lua,需要在C#中转换成IntPtr后传递,Lua返回的则需要通过IntPtr转换回C#的实例对象。


[DllImport("CSharpLua", EntryPoint = "lua_pushlightuserdata")]
public static extern void _lua_pushlightuserdata(IntPtr L, IntPtr p);
public static void lua_pushlightuserdata<T>(IntPtr L, T p)
{
    IntPtr obj = Marshal.GetIUnknownForObject(p);
    _lua_pushlightuserdata(L, obj);
}
[DllImport("CSharpLua", EntryPoint = "lua_touserdata")]
public static extern IntPtr _lua_touserdata(IntPtr L, int idx);
public static T lua_touserdata<T>(IntPtr L, int idx)
{
   IntPtr p = _lua_touserdata(L, idx);
   return (T)Marshal.GetObjectForIUnknown(p);
}
    相关文章
    |
    1月前
    |
    设计模式 C# 图形学
    Unity 游戏引擎 C# 编程:一分钟浅谈
    本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
    51 4
    |
    4月前
    |
    图形学 C# 开发者
    全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
    【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
    104 0
    |
    4月前
    |
    C# 图形学 数据安全/隐私保护
    Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
    Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
    |
    6月前
    |
    C# 图形学 C++
    使用vscode开发C#+unity没有代码提示问题
    使用vscode开发C#+unity没有代码提示问题
    97 0
    使用vscode开发C#+unity没有代码提示问题
    |
    6月前
    |
    JavaScript 前端开发 C#
    初识Unity——创建代码、场景以及五个常用面板(创建C#代码、打开代码文件、场景的创建、Project、Hierarchy、Inspector、Scene、Game )
    初识Unity——创建代码、场景以及五个常用面板(创建C#代码、打开代码文件、场景的创建、Project、Hierarchy、Inspector、Scene、Game )
    408 0
    |
    7月前
    |
    图形学
    【Unity C#_菜单Window开发系列_Inspector Component UnityEditor开发】
    【Unity C#_菜单Window开发系列_Inspector Component UnityEditor开发】
    |
    7月前
    |
    定位技术 C# 图形学
    Unity和C#游戏编程入门:创建迷宫小球游戏示例
    Unity和C#游戏编程入门:创建迷宫小球游戏示例
    159 2
    |
    7月前
    |
    JSON C# 图形学
    【Unity 3D】利用C#、Unity和Socket实现简单的在线聊天室工具(附源码 简单易懂)
    【Unity 3D】利用C#、Unity和Socket实现简单的在线聊天室工具(附源码 简单易懂)
    207 0
    |
    7月前
    |
    网络协议 Unix Linux
    【Unity 3D】C#中Socket及TCP三次握手与四次挥手详解(超详细 图文解释)
    【Unity 3D】C#中Socket及TCP三次握手与四次挥手详解(超详细 图文解释)
    255 0
    |
    7月前
    |
    数据可视化 C# 图形学
    【Unity 3D】图形界面GUI的讲解及在C#中实现用户登录界面的实战(附源码)
    【Unity 3D】图形界面GUI的讲解及在C#中实现用户登录界面的实战(附源码)
    238 0