2.环境准备
2.1 知识点
导入 toLua
前往 GitHub 下载 toLua 工程
前往 toLua 的 GitHub 页面 下载 toLua 工程。解压后得到的是一个 Unity 工程。


导入到 Unity 工程
新建 Unity 工程,将 toLua 工程中 Assets 同级的 Luajit、Luajit64 两个目录以及 Assets 下的所有内容拷贝到目标工程。然后在 Unity 顶栏菜单执行 Lua → Generate All(生成全部绑定代码)。



导入 AB 包工具

导入基础框架
主要会用到单例基类。
toLua 重要文件:CustomSettings 配置
saveDir 变量为导出目录
public static string saveDir = Application.dataPath + "/Source/Generate/";
在菜单 Lua 下执行 Generate All 可生成绑定文件,执行 Clear wrap files 可删除已生成的 wrap 等绑定文件。


添加需要导出的类或者委托
需要到 CustomSettings 中:类加入 customTypeList,委托加入 customDelegateList。列入列表的类型 / 委托会参与导出与注册,供 C# 与 Lua 互相调用(具体生成步骤依赖菜单中的 Wrap / Delegate / Binder 生成项或 Generate All)。
//附加导出委托类型(在导出委托时, customTypeList 中牵扯的委托类型都会导出, 无需写在这里)
public static DelegateType[] customDelegateList =
{
_DT(typeof(Action)),
_DT(typeof(UnityEngine.Events.UnityAction)),
_DT(typeof(System.Predicate<int>)),
_DT(typeof(System.Action<int>)),
_DT(typeof(System.Comparison<int>)),
_DT(typeof(System.Func<int, int>)),
_DT(typeof(CustomCallOut)),
_DT(typeof(CustomCallRef)),
_DT(typeof(CustomCallParams)),
_DT(typeof(TestFun32)),
_DT(typeof(TestFun41)),
};
//在这里添加你要导出注册到lua的类型列表
public static BindType[] customTypeList =
{
//------------------------为例子导出--------------------------------
//_GT(typeof(TestEventListener)),
//_GT(typeof(TestProtol)),
//_GT(typeof(TestAccount)),
//_GT(typeof(Dictionary<int, TestAccount>)).SetLibName("AccountMap"),
//_GT(typeof(KeyValuePair<int, TestAccount>)),
//_GT(typeof(Dictionary<int, TestAccount>.KeyCollection)),
//_GT(typeof(Dictionary<int, TestAccount>.ValueCollection)),
//_GT(typeof(TestExport)),
//_GT(typeof(TestExport.Space)),
//-------------------------------------------------------------------
_GT(typeof(LuaInjectionStation)),
_GT(typeof(InjectType)),
_GT(typeof(Debugger)).SetNameSpace(null),
_GT(typeof(LuaCallCSharp)),
_GT(typeof(Test)),
_GT(typeof(MrTang.Test2)),
_GT(typeof(PrimitiveType)),
_GT(typeof(E_MyEnum)),
_GT(typeof(Lesson3)),
_GT(typeof(List<string>)),
_GT(typeof(Dictionary<int, string>)),
_GT(typeof(Dictionary<string, int>)),
_GT(typeof(Lesson4)).AddExtendType(typeof(Tools)),
_GT(typeof(Lesson5)),
_GT(typeof(Lesson6)),
_GT(typeof(Lesson7)),
_GT(typeof(Lesson8)),
_GT(typeof(Lesson11_Test1)),
_GT(typeof(MrTao.Lesson11_Test2)),
_GT(typeof(Lesson11_Test3)),
_GT(typeof(E_StateEnum)),
_GT(typeof(Lesson13_TestDataCollectionsClass)),
_GT(typeof(System.Int32)),
_GT(typeof(Lesson14_TestClass)).AddExtendType(typeof(Lesson14_Tools)),
_GT(typeof(Lesson15_Test)),
_GT(typeof(Lesson16_Test)),
_GT(typeof(Lesson17_Test)),
#if USING_DOTWEENING
_GT(typeof(DG.Tweening.DOTween)),
_GT(typeof(DG.Tweening.Tween)).SetBaseType(typeof(System.Object)).AddExtendType(typeof(DG.Tweening.TweenExtensions)),
_GT(typeof(DG.Tweening.Sequence)).AddExtendType(typeof(DG.Tweening.TweenSettingsExtensions)),
_GT(typeof(DG.Tweening.Tweener)).AddExtendType(typeof(DG.Tweening.TweenSettingsExtensions)),
_GT(typeof(DG.Tweening.LoopType)),
_GT(typeof(DG.Tweening.PathMode)),
_GT(typeof(DG.Tweening.PathType)),
_GT(typeof(DG.Tweening.RotateMode)),
_GT(typeof(Component)).AddExtendType(typeof(DG.Tweening.ShortcutExtensions)),
_GT(typeof(Transform)).AddExtendType(typeof(DG.Tweening.ShortcutExtensions)),
_GT(typeof(Light)).AddExtendType(typeof(DG.Tweening.ShortcutExtensions)),
_GT(typeof(Material)).AddExtendType(typeof(DG.Tweening.ShortcutExtensions)),
_GT(typeof(Rigidbody)).AddExtendType(typeof(DG.Tweening.ShortcutExtensions)),
_GT(typeof(Camera)).AddExtendType(typeof(DG.Tweening.ShortcutExtensions)),
_GT(typeof(AudioSource)).AddExtendType(typeof(DG.Tweening.ShortcutExtensions)),
//_GT(typeof(LineRenderer)).AddExtendType(typeof(DG.Tweening.ShortcutExtensions)),
//_GT(typeof(TrailRenderer)).AddExtendType(typeof(DG.Tweening.ShortcutExtensions)),
#else
_GT(typeof(Component)),
_GT(typeof(Transform)),
_GT(typeof(Material)),
_GT(typeof(Light)),
_GT(typeof(Rigidbody)),
_GT(typeof(Camera)),
_GT(typeof(AudioSource)),
//_GT(typeof(LineRenderer))
//_GT(typeof(TrailRenderer))
#endif
_GT(typeof(Behaviour)),
_GT(typeof(MonoBehaviour)),
_GT(typeof(GameObject)),
_GT(typeof(Debug)),
_GT(typeof(TrackedReference)),
_GT(typeof(Application)),
_GT(typeof(Physics)),
_GT(typeof(Collider)),
_GT(typeof(Time)),
_GT(typeof(Texture)),
_GT(typeof(Texture2D)),
_GT(typeof(Shader)),
_GT(typeof(Renderer)),
_GT(typeof(WWW)),
_GT(typeof(Screen)),
_GT(typeof(CameraClearFlags)),
_GT(typeof(AudioClip)),
_GT(typeof(AssetBundle)),
_GT(typeof(ParticleSystem)),
_GT(typeof(AsyncOperation)).SetBaseType(typeof(System.Object)),
_GT(typeof(LightType)),
_GT(typeof(SleepTimeout)),
#if UNITY_5_3_OR_NEWER && !UNITY_5_6_OR_NEWER
_GT(typeof(UnityEngine.Experimental.Director.DirectorPlayer)),
#endif
_GT(typeof(Animator)),
_GT(typeof(Input)),
_GT(typeof(KeyCode)),
_GT(typeof(SkinnedMeshRenderer)),
_GT(typeof(Space)),
_GT(typeof(MeshRenderer)),
#if !UNITY_5_4_OR_NEWER
_GT(typeof(ParticleEmitter)),
_GT(typeof(ParticleRenderer)),
_GT(typeof(ParticleAnimator)),
#endif
_GT(typeof(BoxCollider)),
_GT(typeof(MeshCollider)),
_GT(typeof(SphereCollider)),
_GT(typeof(CharacterController)),
_GT(typeof(CapsuleCollider)),
_GT(typeof(Animation)),
_GT(typeof(AnimationClip)).SetBaseType(typeof(UnityEngine.Object)),
_GT(typeof(AnimationState)),
_GT(typeof(AnimationBlendMode)),
_GT(typeof(QueueMode)),
_GT(typeof(PlayMode)),
_GT(typeof(WrapMode)),
_GT(typeof(QualitySettings)),
_GT(typeof(RenderSettings)),
_GT(typeof(SkinWeights)),
_GT(typeof(RenderTexture)),
_GT(typeof(Resources)),
_GT(typeof(LuaProfiler)),
};
2.2 知识点代码
using UnityEngine;
using System;
using System.Collections.Generic;
using LuaInterface;
using UnityEditor;
using BindType = ToLuaMenu.BindType;
using System.Reflection;
public static class CustomSettings
{
public static string saveDir = Application.dataPath + "/Source/Generate/";
public static string toluaBaseType = Application.dataPath + "/ToLua/BaseType/";
public static string baseLuaDir = Application.dataPath + "/ToLua/Lua/";
public static string injectionFilesPath = Application.dataPath + "/ToLua/Injection/";
//导出时强制作为静态类的类型(注意customTypeList 还要添加这个类型才能导出)
//unity 有些类作为sealed class, 其实完全等价于静态类
public static List<Type> staticClassTypes = new List<Type>
{
typeof(UnityEngine.Application),
typeof(UnityEngine.Time),
typeof(UnityEngine.Screen),
typeof(UnityEngine.SleepTimeout),
typeof(UnityEngine.Input),
typeof(UnityEngine.Resources),
typeof(UnityEngine.Physics),
typeof(UnityEngine.RenderSettings),
typeof(UnityEngine.QualitySettings),
typeof(UnityEngine.GL),
typeof(UnityEngine.Graphics),
//typeof(Tools),
};
//附加导出委托类型(在导出委托时, customTypeList 中牵扯的委托类型都会导出, 无需写在这里)
public static DelegateType[] customDelegateList =
{
_DT(typeof(Action)),
_DT(typeof(UnityEngine.Events.UnityAction)),
_DT(typeof(System.Predicate<int>)),
_DT(typeof(System.Action<int>)),
_DT(typeof(System.Comparison<int>)),
_DT(typeof(System.Func<int, int>)),
_DT(typeof(CustomCallOut)),
_DT(typeof(CustomCallRef)),
_DT(typeof(CustomCallParams)),
_DT(typeof(TestFun32)),
_DT(typeof(TestFun41)),
};
//在这里添加你要导出注册到lua的类型列表
public static BindType[] customTypeList =
{
//------------------------为例子导出--------------------------------
//_GT(typeof(TestEventListener)),
//_GT(typeof(TestProtol)),
//_GT(typeof(TestAccount)),
//_GT(typeof(Dictionary<int, TestAccount>)).SetLibName("AccountMap"),
//_GT(typeof(KeyValuePair<int, TestAccount>)),
//_GT(typeof(Dictionary<int, TestAccount>.KeyCollection)),
//_GT(typeof(Dictionary<int, TestAccount>.ValueCollection)),
//_GT(typeof(TestExport)),
//_GT(typeof(TestExport.Space)),
//-------------------------------------------------------------------
_GT(typeof(LuaInjectionStation)),
_GT(typeof(InjectType)),
_GT(typeof(Debugger)).SetNameSpace(null),
_GT(typeof(LuaCallCSharp)),
_GT(typeof(Test)),
_GT(typeof(MrTang.Test2)),
_GT(typeof(PrimitiveType)),
_GT(typeof(E_MyEnum)),
_GT(typeof(Lesson3)),
_GT(typeof(List<string>)),
_GT(typeof(Dictionary<int, string>)),
_GT(typeof(Dictionary<string, int>)),
_GT(typeof(Lesson4)).AddExtendType(typeof(Tools)),
_GT(typeof(Lesson5)),
_GT(typeof(Lesson6)),
_GT(typeof(Lesson7)),
_GT(typeof(Lesson8)),
_GT(typeof(Lesson11_Test1)),
_GT(typeof(MrTao.Lesson11_Test2)),
_GT(typeof(Lesson11_Test3)),
_GT(typeof(E_StateEnum)),
_GT(typeof(Lesson13_TestDataCollectionsClass)),
_GT(typeof(System.Int32)),
_GT(typeof(Lesson14_TestClass)).AddExtendType(typeof(Lesson14_Tools)),
_GT(typeof(Lesson15_Test)),
_GT(typeof(Lesson16_Test)),
_GT(typeof(Lesson17_Test)),
#if USING_DOTWEENING
_GT(typeof(DG.Tweening.DOTween)),
_GT(typeof(DG.Tweening.Tween)).SetBaseType(typeof(System.Object)).AddExtendType(typeof(DG.Tweening.TweenExtensions)),
_GT(typeof(DG.Tweening.Sequence)).AddExtendType(typeof(DG.Tweening.TweenSettingsExtensions)),
_GT(typeof(DG.Tweening.Tweener)).AddExtendType(typeof(DG.Tweening.TweenSettingsExtensions)),
_GT(typeof(DG.Tweening.LoopType)),
_GT(typeof(DG.Tweening.PathMode)),
_GT(typeof(DG.Tweening.PathType)),
_GT(typeof(DG.Tweening.RotateMode)),
_GT(typeof(Component)).AddExtendType(typeof(DG.Tweening.ShortcutExtensions)),
_GT(typeof(Transform)).AddExtendType(typeof(DG.Tweening.ShortcutExtensions)),
_GT(typeof(Light)).AddExtendType(typeof(DG.Tweening.ShortcutExtensions)),
_GT(typeof(Material)).AddExtendType(typeof(DG.Tweening.ShortcutExtensions)),
_GT(typeof(Rigidbody)).AddExtendType(typeof(DG.Tweening.ShortcutExtensions)),
_GT(typeof(Camera)).AddExtendType(typeof(DG.Tweening.ShortcutExtensions)),
_GT(typeof(AudioSource)).AddExtendType(typeof(DG.Tweening.ShortcutExtensions)),
//_GT(typeof(LineRenderer)).AddExtendType(typeof(DG.Tweening.ShortcutExtensions)),
//_GT(typeof(TrailRenderer)).AddExtendType(typeof(DG.Tweening.ShortcutExtensions)),
#else
_GT(typeof(Component)),
_GT(typeof(Transform)),
_GT(typeof(Material)),
_GT(typeof(Light)),
_GT(typeof(Rigidbody)),
_GT(typeof(Camera)),
_GT(typeof(AudioSource)),
//_GT(typeof(LineRenderer))
//_GT(typeof(TrailRenderer))
#endif
_GT(typeof(Behaviour)),
_GT(typeof(MonoBehaviour)),
_GT(typeof(GameObject)),
_GT(typeof(Debug)),
_GT(typeof(TrackedReference)),
_GT(typeof(Application)),
_GT(typeof(Physics)),
_GT(typeof(Collider)),
_GT(typeof(Time)),
_GT(typeof(Texture)),
_GT(typeof(Texture2D)),
_GT(typeof(Shader)),
_GT(typeof(Renderer)),
_GT(typeof(WWW)),
_GT(typeof(Screen)),
_GT(typeof(CameraClearFlags)),
_GT(typeof(AudioClip)),
_GT(typeof(AssetBundle)),
_GT(typeof(ParticleSystem)),
_GT(typeof(AsyncOperation)).SetBaseType(typeof(System.Object)),
_GT(typeof(LightType)),
_GT(typeof(SleepTimeout)),
#if UNITY_5_3_OR_NEWER && !UNITY_5_6_OR_NEWER
_GT(typeof(UnityEngine.Experimental.Director.DirectorPlayer)),
#endif
_GT(typeof(Animator)),
_GT(typeof(Input)),
_GT(typeof(KeyCode)),
_GT(typeof(SkinnedMeshRenderer)),
_GT(typeof(Space)),
_GT(typeof(MeshRenderer)),
#if !UNITY_5_4_OR_NEWER
_GT(typeof(ParticleEmitter)),
_GT(typeof(ParticleRenderer)),
_GT(typeof(ParticleAnimator)),
#endif
_GT(typeof(BoxCollider)),
_GT(typeof(MeshCollider)),
_GT(typeof(SphereCollider)),
_GT(typeof(CharacterController)),
_GT(typeof(CapsuleCollider)),
_GT(typeof(Animation)),
_GT(typeof(AnimationClip)).SetBaseType(typeof(UnityEngine.Object)),
_GT(typeof(AnimationState)),
_GT(typeof(AnimationBlendMode)),
_GT(typeof(QueueMode)),
_GT(typeof(PlayMode)),
_GT(typeof(WrapMode)),
_GT(typeof(QualitySettings)),
_GT(typeof(RenderSettings)),
_GT(typeof(SkinWeights)),
_GT(typeof(RenderTexture)),
_GT(typeof(Resources)),
_GT(typeof(LuaProfiler)),
};
public static List<Type> dynamicList = new List<Type>()
{
typeof(MeshRenderer),
#if !UNITY_5_4_OR_NEWER
typeof(ParticleEmitter),
typeof(ParticleRenderer),
typeof(ParticleAnimator),
#endif
typeof(BoxCollider),
typeof(MeshCollider),
typeof(SphereCollider),
typeof(CharacterController),
typeof(CapsuleCollider),
typeof(Animation),
typeof(AnimationClip),
typeof(AnimationState),
typeof(SkinWeights),
typeof(RenderTexture),
typeof(Rigidbody),
};
//重载函数,相同参数个数,相同位置out参数匹配出问题时, 需要强制匹配解决
//使用方法参见例子14
public static List<Type> outList = new List<Type>()
{
};
//ngui优化,下面的类没有派生类,可以作为sealed class
public static List<Type> sealedList = new List<Type>()
{
/*typeof(Transform),
typeof(UIRoot),
typeof(UICamera),
typeof(UIViewport),
typeof(UIPanel),
typeof(UILabel),
typeof(UIAnchor),
typeof(UIAtlas),
typeof(UIFont),
typeof(UITexture),
typeof(UISprite),
typeof(UIGrid),
typeof(UITable),
typeof(UIWrapGrid),
typeof(UIInput),
typeof(UIScrollView),
typeof(UIEventListener),
typeof(UIScrollBar),
typeof(UICenterOnChild),
typeof(UIScrollView),
typeof(UIButton),
typeof(UITextList),
typeof(UIPlayTween),
typeof(UIDragScrollView),
typeof(UISpriteAnimation),
typeof(UIWrapContent),
typeof(TweenWidth),
typeof(TweenAlpha),
typeof(TweenColor),
typeof(TweenRotation),
typeof(TweenPosition),
typeof(TweenScale),
typeof(TweenHeight),
typeof(TypewriterEffect),
typeof(UIToggle),
typeof(Localization),*/
};
public static BindType _GT(Type t)
{
return new BindType(t);
}
public static DelegateType _DT(Type t)
{
return new DelegateType(t);
}
[MenuItem("Lua/Attach Profiler", false, 151)]
static void AttachProfiler()
{
if (!Application.isPlaying)
{
EditorUtility.DisplayDialog("警告", "请在运行时执行此功能", "确定");
return;
}
LuaClient.Instance.AttachProfiler();
}
[MenuItem("Lua/Detach Profiler", false, 152)]
static void DetachProfiler()
{
if (!Application.isPlaying)
{
return;
}
LuaClient.Instance.DetachProfiler();
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com