(学习笔记)C#与lua互相调用
1.输出lua脚本内容:void Start () {TextAsset ta = Resources.Load<TextAsset>("helloworld.lua"); // 是 helloworld.lua.txtLuaEnv env = new LuaEnv();//最好一个游戏只有一个,它对应lua虚拟机,处于开销考虑...
·
1.输出lua脚本内容:
void Start () {
TextAsset ta = Resources.Load<TextAsset>("helloworld.lua"); // 是 helloworld.lua.txt
LuaEnv env = new LuaEnv();//最好一个游戏只有一个,它对应lua虚拟机,处于开销考虑
env.DoString(ta.text);
//env.DoString("require 'helloworld'");// 或者是这样,helloworld.lua.txt
env.Dispose();
}
2.自定义Loader
void Start () {
LuaEnv env = new LuaEnv();
env.AddLoader(MyLoader);
env.DoString("require 'test'");
env.Dispose();
}
private byte[] MyLoader(ref string filePath)
{
string absPath = Application.streamingAssetsPath + "/" + filePath + ".lua.txt";
return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(absPath));
}
3.加载变量
double a = luaEnv.Global.Get<double>("a");//获取到lua里面的全局变量 a
print(a);
//1,通过class(struct)
//值拷贝,改变任意一者,不会改变对方并且耗费性能
//可以吧类型加载到GCOptimize生成降低开销
Person p = luaEnv.Global.Get<Person>("person");
print(p.name + "-" + p.age + "-" + p.age2);
p.name = "Sikiedu.com";
luaEnv.DoString("print(person.name)");
//2,通过interface
//引用方式,方法里面第一个参数是隐藏参数,传递自身对象
//需要在interface前面加上特性 [CSharpCallLua]
IPerson p = luaEnv.Global.Get<IPerson>("person");
print(p.name + "-" + p.age);
p.name = "Sikiedu.com";
luaEnv.DoString("print(person.name)");
p.eat(12, 34);// p.eat(p,12,34);
//3,通过Dictionary、List
//轻量级 前提是table里面value和key类型需要一致
Dictionary<string, object> dict = luaEnv.Global.Get<Dictionary<string, object>>("person");
foreach (string key in dict.Keys)
{
print(key + "-" + dict[key]);
}
List<int> list = luaEnv.Global.Get<List<int>>("person");
foreach (object o in list)
{
print(o);
}
//4,通过LuaTable,不推荐使用
//不需要生成代码,,但是很慢,比方式2慢一个数量级,而且没有类型检查
LuaTable tab = luaEnv.Global.Get<LuaTable>("person");
print(tab.Get<string>("name"));
print(tab.Get<int>("age"));
print(tab.Length);
class Person
{
public string name;
public int age;
public int age2;
}
[CSharpCallLua]
interface IPerson
{
string name { get; set; }
int age { get; set; }
void eat(int a,int b);
}
4.访问函数
//访问Lua中的全局函数
Action act1 = luaEnv.Global.Get<Action>("add");
act1();
act1 = null;//有绑定,没这一步没法释放env
//1、映射到Delegate
//性能好,类型安全,但是要生成很多代码
Add add = luaEnv.Global.Get<Add>("add");
int resa = 0; int resb = 0;
int res = add(34, 78, out resa, out resb);
print(res);
print(resa);
print(resb);
add = null;
//2、映射到LuaFunction
//优缺点与前者正好相反
LuaFunction func = luaEnv.Global.Get<LuaFunction>("add");
object[] os= func.Call(1, 2);//可以传递任意类型参数,返回值是数组
foreach(object o in os)
{
print(o);
}
luaEnv.Dispose();
}
Lua写入C#
--实例化对象
CS.UnityEngine.GameObject("ss");
--Debug
print(CS.UnityEngine.Time.deltaTime);
--给静态变量赋值
CS.UnityEngine.Time.timeScale=0.5
--方法,把CS.UnityEngine作为一个变量存起来,简单还节省内存
local gameObject=CS.UnityEngine.GameObject
camera=gameObject.Find("MainCamera")
//使用.需要把自身作为第一个参数传递
cameraConmmpont=camera.GetComponent(camera."Camera")
//使用:不需要cameraConmmpont=camera:GetComponent(camera."Camera")
更多推荐
已为社区贡献1条内容
所有评论(0)