Unity XLua 官方教程学习
一、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 官方教程学习相关推荐
- 大白小课程-跟着官方教程学习Scratch3.0-P04制作音乐
本文是视频教程:大白小课堂:跟着官方教程学习Scratch3.0系列的讲义版本,方便大家查阅 视频地址:https://www.bilibili.com/video/av54055338/ 我们今天一 ...
- 【从零开始的大数据学习】Flink官方教程学习笔记(一)
Flink官方教程学习笔记 学习资源 基础Scala语法 Scala数据结构专题 声明变量 代码块 函数(function) 方法(methods) Traits (接口) class(类) tupl ...
- PCL学习笔记(二):PCL官方教程学习
PCL学习笔记(二):PCL官方教程学习 PCD文件制作 Features 表面法线提取 Keypoints 提取NARF关键点 KdTree Range Image How to create a ...
- GTSAM 官方教程学习
GTSAM官方教程学习 0. 前言 1. 因子图 1.1 序 1.2 因子图 1.2.1 贝叶斯网络 1.2.2 因子图 2. 运动建模 2.1 因子图建模 2.2 创建因子图 2.3 因子图与变量 ...
- TensorFlow2.0 Guide官方教程 学习笔记20 -‘Effective TensorFlow 2‘
本笔记参照TensorFlow Guide官方教程,主要是对'Effictive TensorFlow 2'教程内容翻译和内容结构编排,原文链接:Effictive TensorFlow 2 高效的T ...
- TensorFlow2.0 Guide官方教程 学习笔记17 -‘Using the SavedModel format‘
本笔记参照TensorFlow官方教程,主要是对'Save a model-Training checkpoints'教程内容翻译和内容结构编排,原文链接:Using the SavedModel f ...
- Dynamic Quantization PyTorch官方教程学习笔记
诸神缄默不语-个人CSDN博文目录 本文是PyTorch的教程Dynamic Quantization - PyTorch Tutorials 1.11.0+cu102 documentation的学 ...
- WGCNA:官方教程学习
官方教程地址:Tutorials for WGCNA R package 数据地址:FemaleLiver 表达数据格式: 芯片数据 options(stringsAsFactors = FALSE) ...
- TensorFlow2.0 Guide官方教程 学习笔记10- Eager execution
本笔记参照TensorFlow官方教程,主要是对'Eager execution'教程内容翻译和内容结构编排,原文链接:Eager execution 目录 一.创建环境和基本使用 二.动态控制流 三 ...
最新文章
- SAP QM 将业务上的偏差管理集成进入SAP系统?
- 极客邦科技旗下TGO鲲鹏会成立美国硅谷分会
- mysql replication 配置_MySQL Replication配置主从的教程
- MySQL高级 - SQL技巧 - SQL执行顺序及正则表达式
- leetcode1292. 元素和小于等于阈值的正方形的最大边长(二分法+前缀和)
- python怎么创建子类_Python:如何在创建时使用父类注册所有子类
- html5中的行高元素,详解HTML元素的height、offsetHeight、clientHeight、scrollTop等梳理
- java 拟合曲线_如何通过指数曲线拟合数据
- 人工智能产业链深度透析—基础层
- mysql 索引 数据页_数据库索引数据页
- 推桌子nyoj 220hdu1050 (贪心算法系列)
- 递归方式计算一个数的几次方
- 让canvas绘图更清晰
- Google地图中关于根据具体坐标定位真实地理位置
- java引用另一个程序图像,java – 在Android应用程序上显示图像的另一种方法
- ubuntu16启用daytime服务
- matlab 回归分析t检验,第三章 利用Matlab和SPSS进行线性回归分析
- python爬虫入门—selenuim自动登录qq邮箱
- linux系统查找dat文件命令,linux下的一些常用命令
- 计算机导论知识点总结与试题