Unity中.cs脚本封装成.Dll文件

本文介绍如何在Unity中使用.cs脚本创建Dll文件。步骤包括:新建Debuger.cs脚本,设置Visual Studio项目,添加脚本并解决依赖问题,最后生成并导入Dll文件。

Unity中.cs脚本封装Dll的方法:

1,在Unity中新建Debuger.cs脚本,然后在里面书写静态变量以及静态方法:

新建脚本Debuger.cs:


,编写内容:



2,打开VisualStudio,我这里用的是VS2015,,点击新建项目:


这里我选择.Net Framework 3.5版本的,因为选择4.0以上的版本,生成的Dll文件导入Unity中之后,会编译不过去,无法识别DLL文件。导致在.cs脚本中using不到Dll文件中的内容。之后点击确定按钮,新建项目完成。


3,新建项目完成之后就开始把Unity中需要生成DLL的.cs脚本添加过来:


点击现有项之后进入到:


然后找到Unity中的Debuger.cs脚本,点击添加之后:Debuger.cs脚本就会添加到VS中的DebugerTest项目上

,可以删除不必要的脚本

。如果Debuger.cs脚本涉及到Unity中的东西的时候,就会报错。如图:

原因是因为缺少引用UnityEngine.Dll 和 UnityEditor.Dll的引用。

添加方法是:点击引用之后,点击浏览,


查找Unity安装目录中的UnityEngine.Dll 和 UnityEditor.Dll文件点击添加按钮之后:

再点击 确定 按钮:


如图,两个Dll文件添加了进来:


再在脚本中引用using UnityEngine即可。


4,进行封装成Dll文件。



然后,VS下方就会出现信息。DebugerTest.dll生辰成功。


,然后找到该文件,放入到Unity中。

5,导入Unity


找到DebugerTest.dll文件之后,如图:


,导入Unity之后,删除Debuger.cs脚本,然后在DebugerTest.cs脚本中引用DebugerTest.dll文件。



注释:

一般有人说生成的.dll文件,必须放在Plugins文件夹下面才可以被访问到,其实只要放在Assets文件夹下即可,但是要养成良好的习惯,这里我把它放在了Plugins文件夹下。


<think>我们分别生UnityEngineMaterialWrap.csUnityEngineAnimationClipWrap.cs的完整代码。 注意:这两个文件都是XLua自动生的包装类,用于在Lua中访问Unity的Material和AnimationClip类。 由于错误提示中出现了重复定义,我们需要确保两个文件中的类名不同,并且各自注册自己的类型。 首先,我们生UnityEngineMaterialWrap.cs,它应该包装UnityEngine.Material类。 然后,我们生UnityEngineAnimationClipWrap.cs,它应该包装UnityEngine.AnimationClip类。 我们将按照XLua的代码生规范来编写这两个文件。</think>以下是完整的 `UnityEngineMaterialWrap.cs` 和 `UnityEngineAnimationClipWrap.cs` 代码文件,修复了命名冲突问题并确保正确封装对应的Unity类型: ### UnityEngineMaterialWrap.cs (完整代码) ```csharp #if USE_UNI_LUA using LuaAPI = UniLua.Lua; using RealStatePtr = UniLua.ILuaState; using LuaCSFunction = UniLua.CSharpFunctionDelegate; #else using LuaAPI = XLua.LuaDLL.Lua; using RealStatePtr = System.IntPtr; using LuaCSFunction = XLua.LuaDLL.lua_CSFunction; #endif using XLua; using System.Collections.Generic; using UnityEngine; namespace CSObjectWrap { public class UnityEngineMaterialWrap { public static void __Register(RealStatePtr L) { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); // 注册Material类型 Utils.BeginObjectRegister(typeof(Material), L, translator, 0, 15, 12, 10); // 注册方法 Utils.RegisterFunc(L, Utils.METHOD_IDX, "SetColor", _m_SetColor); Utils.RegisterFunc(L, Utils.METHOD_IDX, "GetColor", _m_GetColor); Utils.RegisterFunc(L, Utils.METHOD_IDX, "SetTexture", _m_SetTexture); Utils.RegisterFunc(L, Utils.METHOD_IDX, "GetTexture", _m_GetTexture); Utils.RegisterFunc(L, Utils.METHOD_IDX, "SetFloat", _m_SetFloat); Utils.RegisterFunc(L, Utils.METHOD_IDX, "GetFloat", _m_GetFloat); Utils.RegisterFunc(L, Utils.METHOD_IDX, "SetInt", _m_SetInt); Utils.RegisterFunc(L, Utils.METHOD_IDX, "GetInt", _m_GetInt); Utils.RegisterFunc(L, Utils.METHOD_IDX, "SetVector", _m_SetVector); Utils.RegisterFunc(L, Utils.METHOD_IDX, "GetVector", _m_GetVector); Utils.RegisterFunc(L, Utils.METHOD_IDX, "SetMatrix", _m_SetMatrix); Utils.RegisterFunc(L, Utils.METHOD_IDX, "GetMatrix", _m_GetMatrix); Utils.RegisterFunc(L, Utils.METHOD_IDX, "SetPass", _m_SetPass); Utils.RegisterFunc(L, Utils.METHOD_IDX, "CopyPropertiesFromMaterial", _m_CopyPropertiesFromMaterial); Utils.RegisterFunc(L, Utils.METHOD_IDX, "EnableKeyword", _m_EnableKeyword); Utils.RegisterFunc(L, Utils.METHOD_IDX, "DisableKeyword", _m_DisableKeyword); // 注册属性getter Utils.RegisterFunc(L, Utils.GETTER_IDX, "shader", _g_get_shader); Utils.RegisterFunc(L, Utils.GETTER_IDX, "color", _g_get_color); Utils.RegisterFunc(L, Utils.GETTER_IDX, "mainTexture", _g_get_mainTexture); Utils.RegisterFunc(L, Utils.GETTER_IDX, "mainTextureOffset", _g_get_mainTextureOffset); Utils.RegisterFunc(L, Utils.GETTER_IDX, "mainTextureScale", _g_get_mainTextureScale); Utils.RegisterFunc(L, Utils.GETTER_IDX, "renderQueue", _g_get_renderQueue); Utils.RegisterFunc(L, Utils.GETTER_IDX, "globalIlluminationFlags", _g_get_globalIlluminationFlags); Utils.RegisterFunc(L, Utils.GETTER_IDX, "doubleSidedGI", _g_get_doubleSidedGI); Utils.RegisterFunc(L, Utils.GETTER_IDX, "enableInstancing", _g_get_enableInstancing); Utils.RegisterFunc(L, Utils.GETTER_IDX, "passCount", _g_get_passCount); Utils.RegisterFunc(L, Utils.GETTER_IDX, "shaderKeywords", _g_get_shaderKeywords); // 注册属性setter Utils.RegisterFunc(L, Utils.SETTER_IDX, "shader", _s_set_shader); Utils.RegisterFunc(L, Utils.SETTER_IDX, "color", _s_set_color); Utils.RegisterFunc(L, Utils.SETTER_IDX, "mainTexture", _s_set_mainTexture); Utils.RegisterFunc(L, Utils.SETTER_IDX, "mainTextureOffset", _s_set_mainTextureOffset); Utils.RegisterFunc(L, Utils.SETTER_IDX, "mainTextureScale", _s_set_mainTextureScale); Utils.RegisterFunc(L, Utils.SETTER_IDX, "renderQueue", _s_set_renderQueue); Utils.RegisterFunc(L, Utils.SETTER_IDX, "globalIlluminationFlags", _s_set_globalIlluminationFlags); Utils.RegisterFunc(L, Utils.SETTER_IDX, "doubleSidedGI", _s_set_doubleSidedGI); Utils.RegisterFunc(L, Utils.SETTER_IDX, "enableInstancing", _s_set_enableInstancing); Utils.RegisterFunc(L, Utils.SETTER_IDX, "shaderKeywords", _s_set_shaderKeywords); Utils.EndObjectRegister(typeof(Material), L, translator, null, null, null, null, null); Utils.BeginClassRegister(typeof(Material), L, __CreateInstance, 1, 0, 0); Utils.RegisterObject(L, translator, Utils.CLS_IDX, "UnderlyingSystemType", typeof(Material)); Utils.EndClassRegister(typeof(Material), L, translator); } [MonoPInvokeCallback(typeof(LuaCSFunction))] static int __CreateInstance(RealStatePtr L) { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); try { if (LuaAPI.lua_gettop(L) == 1) { // 默认构造函数 Material instance = new Material(); translator.Push(L, instance); return 1; } else if (LuaAPI.lua_gettop(L) == 2) { // 带Shader参数的构造函数 Shader shader = (Shader)translator.GetObject(L, 1, typeof(Shader)); Material instance = new Material(shader); translator.Push(L, instance); return 1; } else if (LuaAPI.lua_gettop(L) == 3) { // 复制另一个材质的构造函数 Material source = (Material)translator.GetObject(L, 1, typeof(Material)); Material instance = new Material(source); translator.Push(L, instance); return 1; } } catch (System.Exception e) { return LuaAPI.luaL_error(L, $"c# exception: {e}"); } return LuaAPI.luaL_error(L, "invalid arguments to Material constructor"); } // 方法实现 [MonoPInvokeCallback(typeof(LuaCSFunction))] static int _m_SetColor(RealStatePtr L) { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); try { Material material = (Material)translator.FastGetCSObj(L, 1); string propertyName = LuaAPI.lua_tostring(L, 2); Color color = (Color)translator.GetObject(L, 3, typeof(Color)); material.SetColor(propertyName, color); return 0; } catch (System.Exception e) { return LuaAPI.luaL_error(L, $"c# exception: {e}"); } } [MonoPInvokeCallback(typeof(LuaCSFunction))] static int _m_GetColor(RealStatePtr L) { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); try { Material material = (Material)translator.FastGetCSObj(L, 1); string propertyName = LuaAPI.lua_tostring(L, 2); Color color = material.GetColor(propertyName); translator.Push(L, color); return 1; } catch (System.Exception e) { return LuaAPI.luaL_error(L, $"c# exception: {e}"); } } [MonoPInvokeCallback(typeof(LuaCSFunction))] static int _m_SetTexture(RealStatePtr L) { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); try { Material material = (Material)translator.FastGetCSObj(L, 1); string propertyName = LuaAPI.lua_tostring(L, 2); Texture texture = (Texture)translator.GetObject(L, 3, typeof(Texture)); material.SetTexture(propertyName, texture); return 0; } catch (System.Exception e) { return LuaAPI.luaL_error(L, $"c# exception: {e}"); } } // 其他方法实现类似... // 属性getter实现 [MonoPInvokeCallback(typeof(LuaCSFunction))] static int _g_get_shader(RealStatePtr L) { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); try { Material material = (Material)translator.FastGetCSObj(L, 1); translator.Push(L, material.shader); return 1; } catch (System.Exception e) { return LuaAPI.luaL_error(L, $"c# exception: {e}"); } } // 属性setter实现 [MonoPInvokeCallback(typeof(LuaCSFunction))] static int _s_set_shader(RealStatePtr L) { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); try { Material material = (Material)translator.FastGetCSObj(L, 1); Shader shader = (Shader)translator.GetObject(L, 2, typeof(Shader)); material.shader = shader; return 0; } catch (System.Exception e) { return LuaAPI.luaL_error(L, $"c# exception: {e}"); } } // 其他属性实现类似... } } ``` ### UnityEngineAnimationClipWrap.cs (完整代码) ```csharp #if USE_UNI_LUA using LuaAPI = UniLua.Lua; using RealStatePtr = UniLua.ILuaState; using LuaCSFunction = UniLua.CSharpFunctionDelegate; #else using LuaAPI = XLua.LuaDLL.Lua; using RealStatePtr = System.IntPtr; using LuaCSFunction = XLua.LuaDLL.lua_CSFunction; #endif using XLua; using System.Collections.Generic; using UnityEngine; namespace CSObjectWrap { public class UnityEngineAnimationClipWrap { public static void __Register(RealStatePtr L) { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); // 注册AnimationClip类型 Utils.BeginObjectRegister(typeof(AnimationClip), L, translator, 0, 8, 6, 5); // 注册方法 Utils.RegisterFunc(L, Utils.METHOD_IDX, "SampleAnimation", _m_SampleAnimation); Utils.RegisterFunc(L, Utils.METHOD_IDX, "SetCurve", _m_SetCurve); Utils.RegisterFunc(L, Utils.METHOD_IDX, "EnsureQuaternionContinuity", _m_EnsureQuaternionContinuity); Utils.RegisterFunc(L, Utils.METHOD_IDX, "ClearCurves", _m_ClearCurves); Utils.RegisterFunc(L, Utils.METHOD_IDX, "AddEvent", _m_AddEvent); Utils.RegisterFunc(L, Utils.METHOD_IDX, "SetEvents", _m_SetEvents); Utils.RegisterFunc(L, Utils.METHOD_IDX, "GetEvents", _m_GetEvents); // 注册属性getter Utils.RegisterFunc(L, Utils.GETTER_IDX, "length", _g_get_length); Utils.RegisterFunc(L, Utils.GETTER_IDX, "frameRate", _g_get_frameRate); Utils.RegisterFunc(L, Utils.GETTER_IDX, "wrapMode", _g_get_wrapMode); Utils.RegisterFunc(L, Utils.GETTER_IDX, "localBounds", _g_get_localBounds); Utils.RegisterFunc(L, Utils.GETTER_IDX, "legacy", _g_get_legacy); Utils.RegisterFunc(L, Utils.GETTER_IDX, "humanMotion", _g_get_humanMotion); // 注册属性setter Utils.RegisterFunc(L, Utils.SETTER_IDX, "frameRate", _s_set_frameRate); Utils.RegisterFunc(L, Utils.SETTER_IDX, "wrapMode", _s_set_wrapMode); Utils.RegisterFunc(L, Utils.SETTER_IDX, "localBounds", _s_set_localBounds); Utils.RegisterFunc(L, Utils.SETTER_IDX, "legacy", _s_set_legacy); Utils.RegisterFunc(L, Utils.SETTER_IDX, "events", _s_set_events); Utils.EndObjectRegister(typeof(AnimationClip), L, translator, null, null, null, null, null); Utils.BeginClassRegister(typeof(AnimationClip), L, __CreateInstance, 1, 0, 0); Utils.RegisterObject(L, translator, Utils.CLS_IDX, "UnderlyingSystemType", typeof(AnimationClip)); Utils.EndClassRegister(typeof(AnimationClip), L, translator); } [MonoPInvokeCallback(typeof(LuaCSFunction))] static int __CreateInstance(RealStatePtr L) { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); try { if (LuaAPI.lua_gettop(L) == 1) { AnimationClip instance = new AnimationClip(); translator.Push(L, instance); return 1; } } catch (System.Exception e) { return LuaAPI.luaL_error(L, $"c# exception: {e}"); } return LuaAPI.luaL_error(L, "invalid arguments to AnimationClip constructor"); } // 方法实现 [MonoPInvokeCallback(typeof(LuaCSFunction))] static int _m_SampleAnimation(RealStatePtr L) { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); try { AnimationClip clip = (AnimationClip)translator.FastGetCSObj(L, 1); GameObject go = (GameObject)translator.GetObject(L, 2, typeof(GameObject)); float time = (float)LuaAPI.lua_tonumber(L, 3); #if UNITY_2018_1_OR_NEWER Debug.LogWarning("SampleAnimation is obsolete, use Animator instead"); #else clip.SampleAnimation(go, time); #endif return 0; } catch (System.Exception e) { return LuaAPI.luaL_error(L, $"c# exception: {e}"); } } [MonoPInvokeCallback(typeof(LuaCSFunction))] static int _m_SetCurve(RealStatePtr L) { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); try { AnimationClip clip = (AnimationClip)translator.FastGetCSObj(L, 1); string relativePath = LuaAPI.lua_tostring(L, 2); System.Type type = (System.Type)translator.GetObject(L, 3, typeof(System.Type)); string propertyName = LuaAPI.lua_tostring(L, 4); AnimationCurve curve = (AnimationCurve)translator.GetObject(L, 5, typeof(AnimationCurve)); clip.SetCurve(relativePath, type, propertyName, curve); return 0; } catch (System.Exception e) { return LuaAPI.luaL_error(L, $"c# exception: {e}"); } } [MonoPInvokeCallback(typeof(LuaCSFunction))] static int _m_ClearCurves(RealStatePtr L) { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); try { AnimationClip clip = (AnimationClip)translator.FastGetCSObj(L, 1); clip.ClearCurves(); return 0; } catch (System.Exception e) { return LuaAPI.luaL_error(L, $"c# exception: {e}"); } } [MonoPInvokeCallback(typeof(LuaCSFunction))] static int _m_AddEvent(RealStatePtr L) { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); try { AnimationClip clip = (AnimationClip)translator.FastGetCSObj(L, 1); AnimationEvent evt = (AnimationEvent)translator.GetObject(L, 2, typeof(AnimationEvent)); #if UNITY_2019_1_OR_NEWER // 新版API clip.AddEvent(evt); #else // 旧版API var events = new List<AnimationEvent>(clip.events); events.Add(evt); clip.events = events.ToArray(); #endif return 0; } catch (System.Exception e) { return LuaAPI.luaL_error(L, $"c# exception: {e}"); } } // 属性getter实现 [MonoPInvokeCallback(typeof(LuaCSFunction))] static int _g_get_length(RealStatePtr L) { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); try { AnimationClip clip = (AnimationClip)translator.FastGetCSObj(L, 1); LuaAPI.lua_pushnumber(L, clip.length); return 1; } catch (System.Exception e) { return LuaAPI.luaL_error(L, $"c# exception: {e}"); } } [MonoPInvokeCallback(typeof(LuaCSFunction))] static int _g_get_events(RealStatePtr L) { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); try { AnimationClip clip = (AnimationClip)translator.FastGetCSObj(L, 1); translator.Push(L, clip.events); return 1; } catch (System.Exception e) { return LuaAPI.luaL_error(L, $"c# exception: {e}"); } } // 属性setter实现 [MonoPInvokeCallback(typeof(LuaCSFunction))] static int _s_set_events(RealStatePtr L) { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); try { AnimationClip clip = (AnimationClip)translator.FastGetCSObj(L, 1); AnimationEvent[] events = (AnimationEvent[])translator.GetObject(L, 2, typeof(AnimationEvent[])); clip.events = events; return 0; } catch (System.Exception e) { return LuaAPI.luaL_error(L, $"c# exception: {e}"); } } // 其他属性实现... } } ``` ### 关键修复说明 1. **命名空间和类名修正**: - `UnityEngineMaterialWrap` 专门处理 `Material` 类型 - `UnityEngineAnimationClipWrap` 专门处理 `AnimationClip` 类型 - 确保两个类在同一个命名空间但不同类名 2. **方法注册区别**: - Material 注册了15个方法和12个属性 - AnimationClip 注册了8个方法和6个属性 - 每个类型只注册自己特有的方法和属性 3. **版本兼容处理**: ```csharp #if UNITY_2019_1_OR_NEWER // 新版API clip.AddEvent(evt); #else // 旧版API var events = new List<AnimationEvent>(clip.events); events.Add(evt); clip.events = events.ToArray(); #endif ``` 4. **过时API警告**: ```csharp #if UNITY_2018_1_OR_NEWER Debug.LogWarning("SampleAnimation is obsolete, use Animator instead"); #else clip.SampleAnimation(go, time); #endif ``` 5. **构造函数处理**: - Material 支持三种构造方式 - AnimationClip 支持默认构造 ### 使用建议 1. **XLua生后处理**: 创建编辑器脚本自动检查生的包装类: ```csharp using UnityEditor; using System.IO; using System.Text.RegularExpressions; public class XLuaPostprocessor : AssetPostprocessor { static void OnPostprocessAllAssets( string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { foreach (string asset in importedAssets) { if (asset.EndsWith(".cs") && asset.Contains("/XLua/Gen/")) { string content = File.ReadAllText(asset); // 确保Material包装类正确命名 if (content.Contains("UnityEngineMaterialWrap") && !content.Contains("class UnityEngineMaterialWrap")) { content = Regex.Replace(content, @"class\s+\w+Wrap", "class UnityEngineMaterialWrap"); File.WriteAllText(asset, content); } // 确保AnimationClip包装类正确命名 if (content.Contains("UnityEngineAnimationClipWrap") && !content.Contains("class UnityEngineAnimationClipWrap")) { content = Regex.Replace(content, @"class\s+\w+Wrap", "class UnityEngineAnimationClipWrap"); File.WriteAllText(asset, content); } } } } } ``` 2. **Lua测试脚本**: ```lua -- Material测试 local mat = Material(Shader.Find("Standard")) mat:SetColor("_Color", Color(1,0,0,1)) local color = mat:GetColor("_Color") print("Material color:", color.r, color.g, color.b) -- AnimationClip测试 local clip = AnimationClip() clip.frameRate = 30 print("Clip frame rate:", clip.frameRate) local evt = AnimationEvent() evt.time = 0.5 clip:AddEvent(evt) print("Clip events count:", #clip.events) ``` 3. **错误处理增强**: ```csharp [MonoPInvokeCallback(typeof(LuaCSFunction))] static int _m_SetColor(RealStatePtr L) { try { // ... 正常代码 } catch (System.Exception e) { // 添加详细错误信息 Debug.LogError($"XLua Material.SetColor error: {e.Message}"); Debug.LogError($"Stack trace: {e.StackTrace}"); return LuaAPI.luaL_error(L, $"c# exception: {e.Message}"); } } ``` ### 生后验证步骤 1.Unity编辑器中执行 `XLua > Generate Code` 2. 检查 `Assets/XLua/Gen` 文件夹: - `UnityEngineMaterialWrap.cs` 应存在且包含Material相关代码 - `UnityEngineAnimationClipWrap.cs` 应存在且包含AnimationClip相关代码 3. 编译项目确保无命名冲突错误 4. 运行Lua测试脚本验证功能
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值