|
一.Lua文件加载
1.Resources文件夹下加载 xxx.lua.txt 文件
1.)Resources加载xuaTest文件
// 1.Resources加载xuaTest文件 TextAsset ta = Resources.Load<TextAsset>("xluaTest.lua"); //Resources文件夹下文件命名为 xx.lua.txt LuaEnv env = new LuaEnv(); //实例化lua环境虚拟机 // 执行文件中的文本 env.DoString(ta.text); env.Dispose();//销毁虚拟机
2.)通过loader加载
LuaEnv env = new LuaEnv(); env.DoString("require 'xluaTest'"); env.Dispose();
3.)自定义loader加载<StreamingAssets>
using XLua;using System.IO;publicclass Lua_CustomLoader : MonoBehaviour { // Use this for initializationvoid Start() { LuaEnv env = new LuaEnv(); env.AddLoader(MyLoader);
env.DoString("require 'xluaTest001'"); env.Dispose(); } ///<summary>//////</summary>///<param name="filepath">文件路径名</param>///<returns>加载器加载的lua文件</returns>publicbyte[] MyLoader(refstring filepath) { //2.streamingAssets下的lua文件加载string path = Application.streamingAssetsPath + "/" + filepath + ".lua.txt"; //lua中代码文本转换字节数组return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path)); }
二.C#访问Lua
在StreamingAssets文件下建立 xluaTest.lua.txt 文本
1.)访问lua中的全局变量
using XLua;using System.IO;publicclass Lua_CustomLoader : MonoBehaviour {void Start() { LuaEnv env = new LuaEnv(); env.AddLoader(MyLoader); env.DoString("require 'xluaTest001'"); //1.访问lua中的全局变量int playerLv = env.Global.Get<int>("lv"); string playerName = env.Global.Get<string>("playerName"); bool isDie= env.Global.Get<bool>("isDie"); Debug.Log(playerLv + "====" + playerName + "====" + isDie); env.Dispose(); }///<param name="filepath">文件路径名</param>///<returns>加载器加载的lua文件</returns>publicbyte[] MyLoader(refstring filepath) { //2.streamingAssets下的lua文件加载string path = Application.streamingAssetsPath + "/" + filepath + ".lua.txt"; //lua中代码文本转换字节数组return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path)); }// Update is called once per framevoid Update() { } }
2.)访问全局的table表
//先建立一个类,与lua中的表对应class MyPerson{ publicstring name; publicint age; publicbool isSingle;}
① 映射到类中, 获取全局table表
// 2. 映射到类中, 获取全局table表 MyPerson myPerson = env.Global.Get<MyPerson>("Person"); Debug.Log(myPerson.name + "" + myPerson.age + "" + myPerson.isSingle);
②映射到interface
先建立一个interface 并且要有 [CSharpCallLua]
[CSharpCallLua]interface IPerson{ string name { get; set; } int age { get; set; } bool isSingle { get; set; }}
//3.映射到interface IPerson LLWH = env.Global.Get<IPerson>("Person"); Debug.Log(LLWH.name + "=======" + LLWH.age + "=======" + LLWH.isSingle);
注意: 这里如果运行的时候报以下错误
在unity的菜单栏里面进行操作:找到 XLua----->Clear Generated Code 点击即可
③映射到字典Dictionary<>
// 4. 映射到字典中 Dictionary<string, object> dict = env.Global.Get<Dictionary<string, object>>("Person"); foreach (string key in dict.Keys) { Debug.Log(key + "======>" + dict[key]); }
④映射到 List<> 中
// 5. 映射到list中 List<object> list = env.Global.Get<List<object>>("Person"); //用object向上转型foreach (object item in list) { Debug.Log(item); }
⑤映射到 luatable 中
// 6. 映射到luatable中 LuaTable table = env.Global.Get<LuaTable>("Person"); print(table.Get<string>("name")); print(table.Get<int>("age")); print(table.Get<bool>("isSingle"));
3.)访问 lua 中的方法
①无参
Action要引用命名空间 using System;
//1. C#访问方法 无参 Action func = env.Global.Get<Action>("PrintFunc");//PrintFunc 为lua中的方法名 func(); func = null;
② 有参
首先引入委托
[CSharpCallLua]delegateint Add(int a, int b);
Add func = env.Global.Get<Add>("AddFunc");//AddFunc 为lua中的方法名int result= func(10,5); Debug.Log(result); func = null;
三.C#调用Lua
返回a+b,a-b;
void Start() { LuaEnv env = new LuaEnv(); env.AddLoader(MyLoader); env.DoString("require 'xluaTest001'"); //C#调用lua方法 使用luafaction LuaFunction func = env.Global.Get<LuaFunction>("AddFunc"); object[] res = func.Call(1, 23); foreach (object item in res) { Debug.Log(item); } env.Dispose(); }///<param name="filepath">文件路径名</param>///<returns>加载器加载的lua文件</returns>publicbyte[] MyLoader(refstring filepath) { // streamingAssets下的lua文件加载string path = Application.streamingAssetsPath + "/" + filepath + ".lua.txt"; //lua中代码文本转换字节数组return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path)); }
四.Lua调用C#
using System.Collections;using System.Collections.Generic;using UnityEngine;using XLua;publicclass LuaCallCSharpTest : MonoBehaviour { void Start () { LuaEnv luaEnv = new LuaEnv(); luaEnv.DoString("require 'LuaCallCSharpTest'"); luaEnv.Dispose(); } void Update () { }}
然后在 LuaCallCSharpTest.lua.txt 文本里面进行lua脚本编写
1.) new C#对象
在C#中new对象:
var newGameObj=new UnityEngine.GameObject();
对应到Lua是这样:
local newGameObj = CS.UnityEngine.GameObject()
基本类似,除了:
①lua里面没有new关键字
②所有C#相关的都放到CS下,包括构造函数,静态成员属性、方法;
xlua支持重载,比如你要调用GameObject的带一个string参数的构造函数,这么写:
local newGameObj2 = CS.UnityEngine.GameObject('helloworld')
2.) 访问C#静态的属性(调用用" . ")
Lua: print( CS.UnityEngine.Time.deltaTime)
3.)访问C#中静态的方法 调用用(" . ")
local cameraGo = UnityEngine.GameObject.Find('Main Camera')
4.)访问C#中的成员属性 调用用(" . ")
local cameraCom = cameraGo:GetComponent("BoxCollider")
UnityEngine.GameObject.Destroy(cameraCom)
5.)访问C#中的成员方法 (调用用" : ")
local cameraGo = UnityEngine.GameObject.Find('Main Camera')
cameraGo:SetActive(false)
转载于:https://www.cnblogs.com/lk95/p/10114907.html |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|