Xlua热更新

目录

1.导入xlua插件(下载地址:https://github.com/Tencent/xLua)

 

2.通过xlua插件运行lua程序

3.加载运行Lua源文件

4.添加自定义的Loader方法

5.通过自定义Loader加载指定目录的Lua脚本

6.C#访问Lua中的全局变量

7.C#访问Lua中的table(映射到Class,不推荐使用此方式)

8.C#访问Lua中的table(推荐使用此方式,即映射到interface)

9.C#访问Lua中的全局函数(推荐使用此方式,即映射到delegate)

10.在Lua中new C#对象(创建一个游戏物体gameobject)

11.Lua访问C#静态属性和静态方法

12.Lua访问C#成员属性和成员方法


1.导入xlua插件(下载地址:https://github.com/Tencent/xLua

2.通过xlua插件运行lua程序

using UnityEngine;
using XLua;

public class helloworld01 : MonoBehaviour {

    private LuaEnv luaenv;

	void Start () {
        luaenv = new LuaEnv();
        luaenv.DoString("print('hello world')");
        luaenv.DoString("CS.UnityEngine.Debug.Log('你好')");
	}

    private void OnDestroy()
    {
        luaenv.Dispose();
    }
}

3.加载运行Lua源文件

using UnityEngine;

public class Helloworld02 : MonoBehaviour {

	void Start () {
        TextAsset ta = Resources.Load<TextAsset>("HelloWorld.lua");
        print(ta);
    }
}

 

   

using UnityEngine;
using XLua;

public class Helloworld02 : MonoBehaviour {

	void Start () {
        TextAsset ta = Resources.Load<TextAsset>("HelloWorld.lua");
        LuaEnv env = new LuaEnv();
        env.DoString(ta.text);
        env.Dispose();
    }
}

 

4.添加自定义的Loader方法

using UnityEngine;
using XLua;

public class CreateLoader : MonoBehaviour {

	void Start () {
        LuaEnv env = new LuaEnv();
        env.AddLoader(MyLoader);
        env.DoString("require 'HelloWorld'");
        env.Dispose();
	}
    private byte [] MyLoader(ref string filePath)
    {
        return null;
    }
}

 

using UnityEngine;
using XLua;

public class CreateLoader : MonoBehaviour {

	void Start () {
        LuaEnv env = new LuaEnv();
        env.AddLoader(MyLoader);
        env.DoString("require 'HelloWorld'");
        env.Dispose();
	}
    private byte [] MyLoader(ref string filePath)
    {
        string s = "print(123)";
        return System.Text.Encoding.UTF8.GetBytes(s);
    }
}

using UnityEngine;
using XLua;

public class CreateLoader : MonoBehaviour {

	void Start () {
        LuaEnv env = new LuaEnv();
        env.DoString("require 'HelloWorld'");
        env.AddLoader(MyLoader);
        
        env.Dispose();
	}
    private byte [] MyLoader(ref string filePath)
    {
        string s = "print(123)";
        return System.Text.Encoding.UTF8.GetBytes(s);
    }
}

5.通过自定义Loader加载指定目录的Lua脚本

using System.IO;
using UnityEngine;
using XLua;

public class CreateLoader : MonoBehaviour {

	void Start () {
        LuaEnv env = new LuaEnv();
        env.AddLoader(MyLoader);
        env.DoString("require 'test007'");
        env.Dispose();
	}
    private byte [] MyLoader(ref string filePath)
    {
        print(filePath);//test007
        print(Application.streamingAssetsPath);//E:/unityPractice/XluaPractice/Assets/StreamingAssets
        string absPath = Application.streamingAssetsPath + "/" + filePath + ".lua.txt";
        return System .Text .Encoding .UTF8 .GetBytes (File.ReadAllText (absPath ));
    }
}

 

6.C#访问Lua中的全局变量

using UnityEngine;
using XLua;

public class CSharpCallLua : MonoBehaviour {

	void Start () {
        LuaEnv env = new LuaEnv();
        env.DoString("require 'CSharpCallLua'");
        int a = env.Global.Get<int>("a");
        print(a);
        string  str = env.Global.Get<string >("str");
        print(str );
        bool  isDie = env.Global.Get<bool >("isDie");
        print(isDie );
        env.Dispose();
	}
}

 

 

 

7.C#访问Lua中的table(映射到Class,不推荐使用此方式)

using UnityEngine;
using XLua;

public class CSharpCallLua : MonoBehaviour {

	void Start () {
        LuaEnv env = new LuaEnv();
        env.DoString("require 'CSharpCallLua'");

        Person p = env.Global.Get<Person>("person");
        print(p.name + ":" + p.age);
        p.name = "nihao";
        env.DoString("print(person.name)");//LUA:lijiang

        env.Dispose();
	}
    class Person
    {
        public string name;
        public int age;
    }
}

8.C#访问Lua中的table(推荐使用此方式,即映射到interface)

using UnityEngine;
using XLua;

public class CSharpCallLua : MonoBehaviour {

	void Start () {
        LuaEnv env = new LuaEnv();
        env.DoString("require 'CSharpCallLua'");

        IPerson p = env.Global.Get<IPerson>("person");
        print(p.name + ":" + p.age);
        p.name = "nihao";
        env.DoString("print(person.name)");//LUA:lijiang
        p.Eat(12, 34);
        env.Dispose();
	}

    [CSharpCallLua ]
    interface  IPerson
    {
        string name { get; set; }
        int age { get; set; }
        void Eat(int a, int b);
    }
}
person={name="lijiang",age=20}

function person.Eat(self,a,b)
    print(a+b)
    print("I am eating")
 end

 --[[function person:Eat(a,b) 这种方式也是可以的,默认带一个self参数,代表当前table
    print(a+b)
    print("I am eating")
 end
 --]]

 

9.C#访问Lua中的全局函数(推荐使用此方式,即映射到delegate)

  • 不含参函数

using UnityEngine;
using XLua;
using System;

public class CSharpCallLua : MonoBehaviour {

	void Start () {
        LuaEnv env = new LuaEnv();
        env.DoString("require 'CSharpCallLua'");
        Action A= env.Global.Get<Action>("Add");
        A ();
        A = null;
        env.Dispose();
	}
}
function Add()  --不含参函数
print("A")
end

  • 含参函数
using UnityEngine;
using XLua;

public class CSharpCallLua : MonoBehaviour {

	void Start () {
        LuaEnv env = new LuaEnv();
        env.DoString("require 'CSharpCallLua'");
        Add  A= env.Global.Get<Add >("Add");
        A (1,2);
        A = null;
        env.Dispose();
	}

    [CSharpCallLua]
    delegate void Add(int a, int b);
}
function Add(a,b)  --含参函数
print(a+b)
end

 

  • 含参函数,多返回值的情况(用ref,out都可以)
using UnityEngine;
using XLua;

public class CSharpCallLua : MonoBehaviour {

    void Start()
    {
        LuaEnv env = new LuaEnv();
        env.DoString("require 'CSharpCallLua'");

        Add A = env.Global.Get<Add>("Add");
        int resa; int resb;
        int a = A(1, 2, out resa, out resb);
        print(a);
        print(resa);
        print(resb);
        A = null;

        env.Dispose();
    }

    [CSharpCallLua]
    delegate int Add(int a, int b, out int resa, out int resb);

    //void Start()
    //{
    //    LuaEnv env = new LuaEnv();
    //    env.DoString("require 'CSharpCallLua'");

    //    Add A = env.Global.Get<Add>("Add");
    //    int resa=0; int resb=0;
    //    int a = A(1, 2, ref  resa, ref  resb);//用ref也可以,不过上面的resa要赋值,这里赋值为0
    //    print(a);
    //    print(resa);
    //    print(resb);
    //    A = null;

    //    env.Dispose();
    //}

    //[CSharpCallLua]
    //delegate int Add(int a, int b, ref  int resa, ref  int resb);
}
function Add(a,b)  --含参函数
print(a+b)
return a+b,a,b
end

10.在Lua中new C#对象(创建一个游戏物体gameobject)

using UnityEngine;
using XLua;
public class LuaCallCSharp : MonoBehaviour {

    void Start()
    {
        LuaEnv env = new LuaEnv();
        env.DoString("require 'LuaCallCSharp'");
        env.Dispose();
    }
}

11.Lua访问C#静态属性和静态方法

using UnityEngine;
using XLua;
public class LuaCallCSharp : MonoBehaviour {

    void Start()
    {
        LuaEnv env = new LuaEnv();
        env.DoString("require 'LuaCallCSharp'");
        env.Dispose();
    }
}
print(CS.UnityEngine.Time .deltaTime )        --读静态属性
CS.UnityEngine.Time.timeScale=0.5             --写静态属性

local gameObject=CS.UnityEngine.GameObject    --调用静态方法
local camera=gameObject.Find("Main Camera")
camera.name="update by lua"

 

12.Lua访问C#成员属性和成员方法

using UnityEngine;
using XLua;
public class LuaCallCSharp : MonoBehaviour {

    void Start()
    {
        LuaEnv env = new LuaEnv();
        env.DoString("require 'LuaCallCSharp'");
        env.Dispose();
    }
}
local gameObject=CS.UnityEngine.GameObject  
local camera=gameObject.Find("Main Camera")
local cameraCom=camera:GetComponent("Camera")
--用local cameraCom=camera.GetComponent(camera,"Camera")也是可以的,注意和上面用冒号的区别
cameraCom.enabled = false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值