//01-HelloWord
using XLua;
public class HolloWord01 : MonoBehaviour
{
public static HolloWord01 _instance;
private LuaEnv luaenv;//最好项目中只有一个,比较占内存
void Start ()
{
_instance = this;
luaenv = new LuaEnv();
luaenv.DoString(“print(‘hello world’)”);//调用lua语句。 luaEnv.DoFile("");/调用文件。
luaenv.DoString(“CS.UnityEngine.Debug.Log(‘Hello Word’)”);//相当于在Lua中调用了CShape的类进行输出。 luaEnv.DoFile("");/调用文件。
//CS是C#语言,UnityEngine命名空间,Debug类名,Log方法
}
private void OnDestroy()
{
luaenv.Dispose();//释放lua资源
}
}
//02-HelloWordByFile
//Resource
print(“Hello Word from lua file”)
a=2
b=3
print(a+b)
//HelloWord02
using XLua;
public class HolloWord02 : MonoBehaviour {
// Use this for initialization
void Start ()
{
//TextAsset ta= Resources.Load(“HelloWord.lua”);//第一种加载Lua的方法 //HelloWord.lua文件本质上是一个文本问价,该文件名为HelloWord.lua.txt就能加载到了
// print(ta);//第一种加载输出lua 没有加载到的原因是指定类型TextAsset的话,会自动加上后缀“.txt”,而Resources文件夹中根本就没有HelloWord.txt,只有HelloWord.lua,想加载的也是HelloWord.lua而不是HelloWord.txt
LuaEnv luaEnv=new LuaEnv();
//luaEnv.DoString(ta.text);//第二种加载输出lua
luaEnv.DoString(“require’HelloWord’”);//第三种加载输出lua //就会使用加载器Loader进行加载HelloWord.lua.txt文件。require是引用也是执行编译、、、
luaEnv.Dispose();
}
// Update is called once per frame
void Update () {
}
}
//03-DefineLoader
using XLua;
using System.IO;
public class CreaterLoader : MonoBehaviour {
void Start () {
LuaEnv env = new LuaEnv();
env.AddLoader(MyLoader);//Xlua的事件委托的添加,只需要写这一句,其他的具体实现用MyLoader方法的C#语言实现就可以
env.DoString("require'test007'");
env.Dispose();
}
private byte[] MyLoader(ref string filePath)
{
//print(filePath);
//string s = "print(123)";
// print(Application.streamingAssetsPath);
//return System.Text.Encoding.UTF8.GetBytes(s);
string adsPath = Application.streamingAssetsPath + "/" + filePath + ".lua.txt";//lua前忘记加点“.”了
//相当于默认路径 E:/ Test / XLuaProject / Assets / StreamingAssets + 加上文件路径名filePath + 再加上后缀lua.txt
//StringReader Reader=new StringReader(adsPath);//读取得是一行一行的。
return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(adsPath));//把adsPath字符串转成字节数组进行返回
//return null;
}
}
//04-CShapeCallLua
//Resources
a=100.1
str=“siki”
isDie=false
person={
name=“siki”,age=100,23,12,2,4,1,4.5, --使用冒号 “=”这样定义的话,需要手动加上一个self的参数,代表当前的table,不用再想上边一样添加self参数了
eat=function(self,a,b)–arg/self相当于c#当中的this,在c#中赋值的时候不用留这个参数
print(a+b)
print(“我正在吃饭”)
end
}
–[[function person:eat(a,b)–使用冒号 “:”这样定义的话,会默认带一个self的参数,代表当前的table,不用再想上边一样添加self参数了
print(a+b)
end–]]
–[[function person.eat(a,b)–使用冒号 “.”这样定义的话,需要手动加上一个self的参数,跟eat=function(self,a,b)一样,代表当前的table,不用再想上边一样添加self参数了
print(a+b)
end
–]]
function add(a,b)
print(a+b)
return a+b,a,b
end
//CShapeCallLua
using XLua;
public class CShapeCallLua : MonoBehaviour {
void Start () {
LuaEnv env=new LuaEnv();
env.DoString("require'CShapeCallLua'");//当执行DoString的时候,lua种的变量都已经纯在在LuaEnv env=new LuaEnv();虚拟机中了
//double a=env.Global.Get<double>("a");//获取lua中得全局变量a
//print(a);
//String str = env.Global.Get<string>("str");//获取lua中得全局变量a
//print(str);
//bool isdie = env.Global.Get<bool>("isDie");//获取lua中得全局变量a
//print(isdie);
//1.通过class(或者struct)映射Lua
//Person p = env.Global.Get<Person>("person");//类和枚举的话不能改变lua中的变量的值。
//2.通过interface映射Lua
//Iperson p = env.Global.Get<Iperson>("person");
//print(p.name+"--"+p.age);
//p.name = "Sikiedu.com";
//p.age = 10000;
//print(p.name + "--" + p.age);//接口的话能改变lua中的变量的值。
//env.DoString("print(person.name)");//接口的话能改变lua中的变量的值。
//p.eat(12,34);//相当于调用p.eat(p,12,34);所以必须在乱代码中定义参数arg
//3.通过Dictionary或者List映射Lua //Dictionary只能映射有键有值的对象
//Dictionary<string, object> dict = env.Global.Get<Dictionary<string, object>>("person");
//foreach (var key in dict.Keys)//使用Dictionary遍历不出lua中没有键得值
//{
// print(key+"_"+dict[key]);
//}
//list只能映射没有键的的对象
//List<object> list= env.Global.Get<List<object>>("person");//使用List可以遍历出lua中没有键得值,应为List也不需要键
//foreach (var o in list)
//{
// print(o);
//}
//List<int> list = env.Global.Get<List<int>>("person");//使用List可以遍历出lua中没有键得值,应为List也不需要键
//foreach (var o in list) //使用int类型得时候,只接受没有定义为其他的类型的默认int类型,小数直接输出的是0
//{
// print(o);
//}
//4.通过LuaTable来映射lua代码
//LuaTable tab = env.Global.Get<LuaTable>("person");
//print(tab.Get<string>("name"));
//print(tab.Get<int>("age"));
//print(tab.Length);
//foreach (var key in tab.GetKeys())
//{
// print(tab.GetKeys());
//}
//1.映射到Action
访问lua中的全局函数
//Action action1 = env.Global.Get<Action>("add");
//action1();//出现InvalidOperationException: try to dispose a LuaEnv with C# callback!错误是因为action1和映射的函数有引用关系,必须解除这个引用关系(action1=null;//就行了) 才能 执行env.Dispose();释放资源的函数
//action1 = null;//就行了
//env.Dispose();
//映射到Delegate
//测试out多返回值
//Add add= env.Global.Get<Add>("add");
//int resa;
//int resb;
//int res = add(3, 7, out resa, out resb);
//print(res);
//print(resa);
//print(resb);
//add = null;//就行了
测试有初值的ref 多返回值
//Add add = env.Global.Get<Add>("add");
//int resa = 0;
//int resb = 0;
//int res = add(3, 7, ref resa, ref resb);
//print(res);
//print(resa);
//print(resb);
//add = null;//就行了
//2.映射到Delegate
LuaFunction func = env.Global.Get<LuaFunction>("add");
object[] os= func.Call(1, 2);
foreach (var o in os)
{
print(o);
}
env.Dispose();
}
}
[CSharpCallLua]
//public delegate int Add(int a,int b,out int resa,out int resb);
public delegate int Add(int a, int b, ref int resa, ref int resb);
//1.通过class(或者struct)映射Lua
class Person
{
public string name;
public int age;
}
//2.通过接口interface映射Lua
[CSharpCallLua]
interface Iperson//接口必须添加字段,必须添加添加[CSharpCallLua]特性
{
string name { get; set; }
int age { get; set; }
void eat(int a, int b);
}
//05-LuaCallCShape
//Resources
–构造游戏物体,new对象
–CS.UnityEngine.GameObject(“new by Lua”)
print(CS.UnityEngine.Time.deltaTime)
CS.UnityEngine.Time.timeScale = 0.5
local gameObject=CS.UnityEngine.GameObject
–访问CShape里面的静态属性
local camera =gameObject.Find(“Main Camera”)
camera.name=“update by Lua”
–调用成员方法的时候,统一一下,使用“ :”,这样就不用再手动添加自身到成员函数中了
local cameraCom=camera:GetComponent(“Camera”)
gameObject.Destroy(cameraCom)
local light=gameObject.Find(“Directional Light”)
//LuaCallCShape
using XLua;
public class LuaCallCShape : MonoBehaviour {
LuaEnv env=new LuaEnv();
void Start ()
{
env.DoString(“require’LuaCallCShape’”);
env.Dispose();
}
}