一、Lua 文件加载

1. 执行字符串

using UnityEngine;
using XLua;public class ByString : MonoBehaviour {XLua.LuaEnv luaEnv  ;// Use this for initializationvoid Start () {luaEnv = new XLua.LuaEnv();//从Unity调用Lua// luaEnv.DoString("print('HelloWorld')");//从unity调用Lua,Lua调用C#luaEnv.DoString("CS.UnityEngine.Debug.Log('HelloWorld')");}// Update is called once per framevoid Update () {if (luaEnv!=null){// 清楚 Lua 未手动释放的 LuaBase 对象luaEnv.Tick();}}private void OnDestroy(){luaEnv.Dispose();}
}

2. 加载 Lua 文件

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class HelloWorldByFile : MonoBehaviour {XLua.LuaEnv luaEnv = null;void Start () {TextAsset ta = Resources.Load<TextAsset>("HelloWorld.lua");luaEnv = new XLua.LuaEnv();luaEnv.DoString(ta.bytes);
//或者用下面的方法// luaEnv.DoString("require 'HelloWorld'"); //requite 会Load  找到 HelloWorld.Lua.Txt  require实际上是调一个个的loader去加载,有一个成功就不再往下尝试,全失败则报文件找不到。}// Update is called once per framevoid Update () {}private void OnDestroy(){luaEnv.Dispose();}
}

其中 Lua 文件代码为:

print("Hello Lua")
print("Hello Lua")
print("Hello Lua")
print("Hello Lua")a=2b=3
print(a+b)

需要注意的是因为 Resource 只支持有限的后缀,放 Resources 下 lua 文件得加上 txt 后缀,如:HelloWorld.lua.txt。

3. 自定义 Loader

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CreateLoad : MonoBehaviour {public delegate byte[] CustomLoader(ref string filepath);//  public void LuaEnv.AddLoader(CustomLoader loader)XLua.LuaEnv luaEnv;private byte[] MyLoader(ref string filePath){print(filePath);string s = "    a=5   b=10  print(a+b)";return System.Text.Encoding.UTF8.GetBytes(s);}void Start () {luaEnv = new XLua.LuaEnv();luaEnv.AddLoader(MyLoader);luaEnv.AddLoader(MyLoader);luaEnv.DoString("require 'xxx'");}private void OnDestroy(){luaEnv.Dispose();}
}

自定义loader路径

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;public class CreateLoad : MonoBehaviour {public delegate byte[] CustomLoader(ref string filepath);//  public void LuaEnv.AddLoader(CustomLoader loader)XLua.LuaEnv luaEnv;void Start () {luaEnv = new XLua.LuaEnv();luaEnv.AddLoader(MyLoader);luaEnv.DoString("require 'Test007'");}private void OnDestroy(){luaEnv.Dispose();}private byte[] MyLoader(ref string filePath){ string absPath = Application.streamingAssetsPath + "/" + filePath + ".lua.txt";string s= File.ReadAllText(absPath);return System.Text.Encoding.UTF8.GetBytes(s);}
}

C#访问Lua

方法1:通过Class类来方位lua中的函数变量方法和表

CSharpCallLua.lua.text

a=100str= "Hi" isDie=false
person={
name="zain",
age=100,
eat=function(self,a,b)
print("吃面条")
print(a+b)
end
}
function Test(a ,b)
print("test")
print(a+b)
c=20
z=a
x=b
return z,x,c
end 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
public class CSharpCallLua : MonoBehaviour {XLua.LuaEnv luaEnv = null;// Use this for initializationvoid Start () {luaEnv = new XLua.LuaEnv();luaEnv.DoString("require 'CSharpCallLua'");int a=   luaEnv.Global.Get<int>("a"); //获取到lua里面的全局变量print(a);Preson p = luaEnv.Global.Get<Preson>("person");print(p.name + "---" + p.age);IPreson p2 = luaEnv.Global.Get<IPreson>("person");print(p2.age + "--" + p2.name);p2.eat(12, 12);//运行lua中得function 方法1 使用delegateTest test = luaEnv.Global.Get<Test>("Test");int x = 0;int c = 0;int z = test(12, 12, out x, out c);print(z);print(x);print(c);//   //运行lua中得function 方法2 映射到luafunctionLuaFunction fun = luaEnv.Global.Get<LuaFunction>("Test");object [] o =  fun.Call(12, 34);foreach (var item in o){print(item);}}[CSharpCallLua]delegate int  Test(int a,int b ,out int x,out int c);public void Eat(){}private void OnDestroy(){luaEnv.Dispose();}public class Preson{public string name;public int age;  }[ CSharpCallLua]interface IPreson{string name { get; set; }int age { get; set; }void eat(int a,int b);}}

方法2:通过Interface可以改变lua中 table表中的参数

lua  CSharpCallLua.lua.txt 里面声明


preson ={
name="Zain",
age=100 ,eat=function(thisself,a,b)
print(a+b)
print("eat吃东西")
end
}

CSharp脚本 CSharpCallLua脚本为

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using XLua;
public class CSharpCallLua: MonoBehaviour {public delegate byte[] CustomLoader(ref string filepath);//  public void LuaEnv.AddLoader(CustomLoader loader)XLua.LuaEnv luaEnv;void Start(){luaEnv = new XLua.LuaEnv(); luaEnv.DoString("require 'CSharpCallLua'");IPorson p2= luaEnv.Global.Get<IPorson>("preson");print(p2.name + "--" + p2.age);p2.eat(2,4);p2.age = 200;luaEnv.DoString("print(preson.age)");}private void OnDestroy(){luaEnv.Dispose();}[CSharpCallLua]interface IPorson{ string name { get; set; }int age { get; set; }void eat(int a, int b);}private byte[] MyLoader(ref string filePath){string absPath = Application.streamingAssetsPath + "/" + filePath + ".lua.txt";string s = File.ReadAllText(absPath);return System.Text.Encoding.UTF8.GetBytes(s);}
}

Unity XLua 官方教程学习相关推荐

  1. 大白小课程-跟着官方教程学习Scratch3.0-P04制作音乐

    本文是视频教程:大白小课堂:跟着官方教程学习Scratch3.0系列的讲义版本,方便大家查阅 视频地址:https://www.bilibili.com/video/av54055338/ 我们今天一 ...

  2. 【从零开始的大数据学习】Flink官方教程学习笔记(一)

    Flink官方教程学习笔记 学习资源 基础Scala语法 Scala数据结构专题 声明变量 代码块 函数(function) 方法(methods) Traits (接口) class(类) tupl ...

  3. PCL学习笔记(二):PCL官方教程学习

    PCL学习笔记(二):PCL官方教程学习 PCD文件制作 Features 表面法线提取 Keypoints 提取NARF关键点 KdTree Range Image How to create a ...

  4. GTSAM 官方教程学习

    GTSAM官方教程学习 0. 前言 1. 因子图 1.1 序 1.2 因子图 1.2.1 贝叶斯网络 1.2.2 因子图 2. 运动建模 2.1 因子图建模 2.2 创建因子图 2.3 因子图与变量 ...

  5. TensorFlow2.0 Guide官方教程 学习笔记20 -‘Effective TensorFlow 2‘

    本笔记参照TensorFlow Guide官方教程,主要是对'Effictive TensorFlow 2'教程内容翻译和内容结构编排,原文链接:Effictive TensorFlow 2 高效的T ...

  6. TensorFlow2.0 Guide官方教程 学习笔记17 -‘Using the SavedModel format‘

    本笔记参照TensorFlow官方教程,主要是对'Save a model-Training checkpoints'教程内容翻译和内容结构编排,原文链接:Using the SavedModel f ...

  7. Dynamic Quantization PyTorch官方教程学习笔记

    诸神缄默不语-个人CSDN博文目录 本文是PyTorch的教程Dynamic Quantization - PyTorch Tutorials 1.11.0+cu102 documentation的学 ...

  8. WGCNA:官方教程学习

    官方教程地址:Tutorials for WGCNA R package 数据地址:FemaleLiver 表达数据格式: 芯片数据 options(stringsAsFactors = FALSE) ...

  9. TensorFlow2.0 Guide官方教程 学习笔记10- Eager execution

    本笔记参照TensorFlow官方教程,主要是对'Eager execution'教程内容翻译和内容结构编排,原文链接:Eager execution 目录 一.创建环境和基本使用 二.动态控制流 三 ...

最新文章

  1. SAP QM 将业务上的偏差管理集成进入SAP系统?
  2. 极客邦科技旗下TGO鲲鹏会成立美国硅谷分会
  3. mysql replication 配置_MySQL Replication配置主从的教程
  4. MySQL高级 - SQL技巧 - SQL执行顺序及正则表达式
  5. leetcode1292. 元素和小于等于阈值的正方形的最大边长(二分法+前缀和)
  6. python怎么创建子类_Python:如何在创建时使用父类注册所有子类
  7. html5中的行高元素,详解HTML元素的height、offsetHeight、clientHeight、scrollTop等梳理
  8. java 拟合曲线_如何通过指数曲线拟合数据
  9. 人工智能产业链深度透析—基础层
  10. mysql 索引 数据页_数据库索引数据页
  11. 推桌子nyoj 220hdu1050 (贪心算法系列)
  12. 递归方式计算一个数的几次方
  13. 让canvas绘图更清晰
  14. Google地图中关于根据具体坐标定位真实地理位置
  15. java引用另一个程序图像,java – 在Android应用程序上显示图像的另一种方法
  16. ubuntu16启用daytime服务
  17. matlab 回归分析t检验,第三章 利用Matlab和SPSS进行线性回归分析
  18. python爬虫入门—selenuim自动登录qq邮箱
  19. linux系统查找dat文件命令,linux下的一些常用命令
  20. 计算机导论知识点总结与试题

热门文章

  1. 腾讯VS百度:在AI上下大赌注
  2. 我的DUILIB常用库
  3. Hadoop集群时间同步NTP
  4. 单片机设计_车牌识别系统(STM32 OV7670 TFT)
  5. 从gitlab上下载项目
  6. 【日常】联想笔记本如何开启电池养护模式
  7. Java基础总结--面试答案个人总结
  8. 网络运维超融合服务器,国家行政学院借助超融合打造IT新架构
  9. 人教版选修计算机英语,人教版高中英语选修计算机英语NetworksandtheInternet.ppt
  10. PSRAM芯片QPI接口APS6404L专用于智能手表存储