XLua热更新 siki学院第一季lua基本语法规则

//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();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值