Files
JJBB/Assets/XLua/Doc/XLua_API.md

330 lines
8.2 KiB
Markdown
Raw Normal View History

2024-08-23 15:49:34 +08:00
## C# API
2024-09-04 02:07:48 +08:00
2024-08-23 15:49:34 +08:00
### LuaEnv类
2024-09-04 02:07:48 +08:00
2024-08-23 15:49:34 +08:00
#### object[] DoString(string chunk, string chunkName = "chuck", LuaTable env = null)
2024-09-04 02:07:48 +08:00
2024-08-23 15:49:34 +08:00
描述:
执行一个代码块。
参数:
chunk: Lua代码的字符串
chunkName 发生error时的debug显示信息中使用指明某某代码块的某行错误
env :这个代码块的环境变量;
返回值:
代码块里return语句的返回值;
比如return 1, “hello”DoString返回将包含两个object的数组 一个是double类型的1 一个是string类型的“hello”
2024-09-04 02:07:48 +08:00
2024-08-23 15:49:34 +08:00
例如:
LuaEnv luaenv = new LuaEnv();
object[] ret = luaenv.DoString("print(hello)\r\nreturn 1")
UnityEngine.Debug.Log("ret="+ret[0]);
luaenv.Dispose()
#### T LoadString<T>(string chunk, string chunkName = "chunk", LuaTable env = null)
描述:
加载一个代码块但不执行只返回类型可以指定为一个delegate或者一个LuaFunction
参数:
chunk: Lua代码的字符串
chunkName 发生error时的debug显示信息中使用指明某某代码块的某行错误
env :这个代码块的环境变量;
返回值:
代表该代码块的delegate或者LuaFunction类
2024-09-04 02:07:48 +08:00
#### LuaTable Global
2024-08-23 15:49:34 +08:00
描述:
代表lua全局环境的LuaTable
### void Tick()
描述:
清除Lua的未手动释放的LuaBase对象比如LuaTable LuaFunction以及其它一些事情。
需要定期调用比如在MonoBehaviour的Update中调用。
### void AddLoader(CustomLoader loader)
描述:
增加一个自定义loader
参数:
loader一个包括了加载函数的委托其类型为delegate byte[] CustomLoader(ref string filepath)当一个文件被require时这个loader会被回调其参数是调用require所使用的参数如果该loader找到文件可以将其读进内存返回一个byte数组。如果需要支持调试的话而filepath要设置成IDE能找到的路径相对或者绝对都可以
#### void Dispose()
描述:
2024-09-04 02:07:48 +08:00
2024-08-23 15:49:34 +08:00
Dispose该LuaEnv。
> LuaEnv的使用建议全局就一个实例并在Update中调用GC方法完全不需要时调用Dispose
### LuaTable类
2024-09-04 02:07:48 +08:00
#### `T Get<T>(string key)`
2024-08-23 15:49:34 +08:00
描述:
获取在key下类型为T的value如果不存在或者类型不匹配返回null
2024-09-04 02:07:48 +08:00
#### `T GetInPath<T>(string path)`
2024-08-23 15:49:34 +08:00
描述:
和Get的区别是这个函数会识别path里头的“.”比如var i = tbl.GetInPath<int>(“a.b.c”)相当于在lua里头执行i = tbl.a.b.c避免仅为了获取中间变量而多次调用Get执行效率更高。
2024-09-04 02:07:48 +08:00
#### `void SetInPath<T>(string path, T val)`
2024-08-23 15:49:34 +08:00
描述:
和GetInPaht<T>对应的setter
2024-09-04 02:07:48 +08:00
#### `void Get<TKey, TValue>(TKey key, out TValue value)`
2024-08-23 15:49:34 +08:00
描述:
上面的API的Key都只能是string而这个API无此限制
2024-09-04 02:07:48 +08:00
#### `void Set<TKey, TValue>(TKey key, TValue value)`
2024-08-23 15:49:34 +08:00
描述:
对应Get<TKey, TValue>的setter
2024-09-04 02:07:48 +08:00
#### `T Cast<T>()`
2024-08-23 15:49:34 +08:00
描述:
把该table转成一个T指明的类型可以是一个加了CSharpCallLua声明的interface一个有默认构造函数的class或者struct一个DictionaryList等等。
#### void SetMetaTable(LuaTable metaTable)
描述:
2024-09-04 02:07:48 +08:00
2024-08-23 15:49:34 +08:00
设置metaTable为table的metatable
2024-09-04 02:07:48 +08:00
### LuaFunction 类
2024-08-23 15:49:34 +08:00
2024-09-04 02:07:48 +08:00
> 注意用该类访问Lua函数会有boxingunboxing的开销为了性能考虑需要频繁调用的地方不要用该类。建议通过 `table.Get<ABCDelegate>` 获取一个 delegate 再调用(假设 `ABCDelegate` 是 C# 的一个 delegate。在使用使用 `table.Get<ABCDelegate>` 之前请先把ABCDelegate加到代码生成列表。
2024-08-23 15:49:34 +08:00
#### object[] Call(params object[] args)
描述:
以可变参数调用Lua函数并返回该调用的返回值。
#### object[] Call(object[] args, Type[] returnTypes)
描述:
调用Lua函数并指明返回参数的类型系统会自动按指定类型进行转换。
#### void SetEnv(LuaTable env)
描述:
相当于lua的setfenv函数。
## Lua API
### CS对象
#### CS.namespace.class(...)
描述:
调用一个C#类型的构造函数,并返回类型实例
例如:
local v1=CS.UnityEngine.Vector3(1,1,1)
#### CS.namespace.class.field
描述:
访问一个C#静态成员
2024-09-04 02:07:48 +08:00
2024-08-23 15:49:34 +08:00
例如:
Print(CS.UnityEngine.Vector3.one)
#### CS.namespace.enum.field
描述:
2024-09-04 02:07:48 +08:00
2024-08-23 15:49:34 +08:00
访问一个枚举值
#### typeof函数
描述:
2024-09-04 02:07:48 +08:00
2024-08-23 15:49:34 +08:00
类似C#里头的typeof关键字返回一个Type对象比如GameObject.AddComponent其中一个重载需要一个Type参数
例如:
newGameObj:AddComponent(typeof(CS.UnityEngine.ParticleSystem))
#### 无符号64位支持
##### uint64.tostring
描述:
无符号数转字符串。
##### uint64.divide
描述:
无符号数除法。
##### uint64.compare
描述:
无符号比较相对返回0大于返回正数小于返回负数。
##### uint64.remainder
描述:
2024-09-04 02:07:48 +08:00
2024-08-23 15:49:34 +08:00
无符号数取模。
2024-09-04 02:07:48 +08:00
2024-08-23 15:49:34 +08:00
##### uint64.parse
描述:
字符串转无符号数。
#### xlua.structclone
描述:
2024-09-04 02:07:48 +08:00
2024-08-23 15:49:34 +08:00
克隆一个c#结构体
2024-09-04 02:07:48 +08:00
#### xlua.private_accessible(class)
2024-08-23 15:49:34 +08:00
描述:
2024-09-04 02:07:48 +08:00
2024-08-23 15:49:34 +08:00
让一个类的私有字段,属性,方法等可用
例子:
2024-09-04 02:07:48 +08:00
xlua.private_accessible(CS.UnityEngine.GameObject)
2024-08-23 15:49:34 +08:00
#### xlua.get_generic_method
2024-09-04 02:07:48 +08:00
2024-08-23 15:49:34 +08:00
描述:
2024-09-04 02:07:48 +08:00
2024-08-23 15:49:34 +08:00
获取一个泛型方法
例子:
2024-09-04 02:07:48 +08:00
```lua
2024-08-23 15:49:34 +08:00
local foo_generic = xlua.get_generic_method(CS.GetGenericMethodTest, 'Foo')
local bar_generic = xlua.get_generic_method(CS.GetGenericMethodTest, 'Bar')
local foo = foo_generic(CS.System.Int32, CS.System.Double)
local bar = bar_generic(CS.System.Double, CS.UnityEngine.GameObject)
-- call instance method
local o = CS.GetGenericMethodTest()
local ret = foo(o, 1, 2)
print(ret)
-- call static method
bar(2, nil)
2024-09-04 02:07:48 +08:00
```
2024-08-23 15:49:34 +08:00
#### cast函数
描述:
2024-09-04 02:07:48 +08:00
2024-08-23 15:49:34 +08:00
指明以特定的接口访问对象这在实现类无法访问的时候比如internal修饰很有用这时可以这么来假设下面的calc对象实现了C#的PerformentTest.ICalc接口
例子:
2024-09-04 02:07:48 +08:00
2024-08-23 15:49:34 +08:00
cast(calc, typeof(CS.PerformentTest.ICalc))
然后就木有其它API了
访问csharp对象和访问一个table一样调用函数跟调用lua函数一样也可以通过操作符访问c#的操作符,下面是一个例如:
local v1=CS.UnityEngine.Vector3(1,1,1)
local v2=CS.UnityEngine.Vector3(1,1,1)
v1.x = 100
v2.y = 100
print(v1, v2)
local v3 = v1 + v2
print(v1.x, v2.x)
print(CS.UnityEngine.Vector3.one)
print(CS.UnityEngine.Vector3.Distance(v1, v2))
## 类型映射
### 基本数据类型
|C#类型|Lua类型|
|-|-|
|sbytebyteshortushortintuintdoublecharfloat|number|
|decimal|userdata|
|longulong|userdata/lua_Integer(lua53)|
|bytes[]|string|
|bool|boolean|
|string|string|
### 复杂数据类型
|C#类型|Lua类型|
|-|-|
|LuaTable|table|
|LuaFunction|function|
|class或者 struct的实例|userdatatable|
|methoddelegate|function|
2024-09-04 02:07:48 +08:00
#### LuaTable
2024-08-23 15:49:34 +08:00
C#侧指明从Lua侧输入包括C#方法的输入参数或者Lua方法的返回值LuaTable类型则要求Lua侧为table。或者Lua侧的table在C#侧未指明类型的情况下转换成LuaTable
2024-09-04 02:07:48 +08:00
#### LuaFunction
2024-08-23 15:49:34 +08:00
C#侧指明从Lua侧输入包括C#方法的输入参数或者Lua方法的返回值LuaFunction类型则要求Lua侧为function。或者Lua侧的function在C#侧未指明类型的情况下转换成LuaFunction
2024-09-04 02:07:48 +08:00
#### LuaUserData
2024-08-23 15:49:34 +08:00
2024-09-04 02:07:48 +08:00
对应非 C# Managered 对象的lua userdata。
2024-08-23 15:49:34 +08:00
2024-09-04 02:07:48 +08:00
#### class 或者 struct 的实例
2024-08-23 15:49:34 +08:00
从C#传一个class或者struct的实例将映射到Lua的userdata并通过__index访问该userdata的成员
C#侧指明从Lua侧输入指定类型对象Lua侧为该类型实例的userdata可以直接使用如果该指明类型有默认构造函数Lua侧是table则会自动转换转换规则是调用构造函数构造实例并用table对应字段转换到c#对应值后赋值各成员
2024-09-04 02:07:48 +08:00
#### method delegate
2024-08-23 15:49:34 +08:00
成员方法以及delegate都是对应lua侧的函数。
C#侧的普通参数以及引用参数对应lua侧函数参数C#侧的返回值对应于Lua的第一个返回值引用参数和out参数则按序对应于Lua的第2到第N个参数。
## 宏
#### HOTFIX_ENABLE
打开hotfix功能。
#### NOT_GEN_WARNING
反射时打印warning。
#### GEN_CODE_MINIMIZE
以偏向减少代码段的方式生成代码。