XLua 基础
一.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;
public class Lua_CustomLoader : MonoBehaviour { // Use this for initialization
void Start() {
LuaEnv env = new LuaEnv();
env.AddLoader(MyLoader);
env.DoString("require 'xluaTest001'");
env.Dispose();
}
/// <summary>
///
/// </summary>
/// <param name="filepath">文件路径名</param>
/// <returns>加载器加载的lua文件</returns>
public byte[] MyLoader(ref string 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;
public class 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>
public byte[] MyLoader(ref string 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 frame
void Update() {
}
}
2.)访问全局的table表
//先建立一个类,与lua中的表对应
class MyPerson
{
public string name;
public int age;
public bool 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]
delegate int Add(int a, int b);
Add func = env.Global.Get<Add>("AddFunc");//AddFunc 为lua中的方法名
int result= func(,);
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(, );
foreach (object item in res)
{
Debug.Log(item);
}
env.Dispose();
}
/// <param name="filepath">文件路径名</param>
/// <returns>加载器加载的lua文件</returns>
public byte[] MyLoader(ref string 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; public class 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)
XLua 基础的更多相关文章
- XLua基础
一.Lua文件加载 1).Resources加载xluaTest文件 2).通过loader加载 3).自定义Loader(相当于Resources加载和loader加载结合) 先自定义Loa ...
- XLua 网络加载(基础操作)
LoadGameMethod 网上资源加载更新:加载场景中另建协程用来加载; public void LoadGameMethod() { StartCoroutine(start()); ...
- C++基础——模拟事务 (1)COMMAND模式
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- 【腾讯Bugly干货分享】手游热更新方案xLua开源:Unity3D下Lua编程解决方案
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/2bY7A6ihK9IMcA0bOFyB-Q 导语 xL ...
- xLua中导出Dotween
前言 在xlua的lua脚本中使用dotween,官方的文档中有提到可以导出,但未介绍详细的步骤,相信比较多的朋友有需要,刚好项目中也在使用xlua和dotween,所以做个笔记. 基础知识: xLu ...
- xlua中lua对象到c#对象的转型
lua中的类型 基础类型 #define LUA_TNIL 0 #define LUA_TBOOLEAN 1 #define LUA_TLIGHTUSERDATA 2 #define LUA_TNUM ...
- 热更新解决方案--xlua学习笔记
一.热更新方案简介 在Unity游戏工程中,C#代码(编译型语言)资源和Resources文件夹下的资源打包后都不可以更改,因此这部分内容不能进行热更新,而lua代码(解释型语言)逻辑不需要进行预编译 ...
- 深入xLua实现原理之Lua如何调用C#
xLua是腾讯的一个开源项目,为Unity. .Net. Mono等C#环境增加Lua脚本编程的能力.本文主要是探讨xLua下Lua调用C#的实现原理. Lua与C#数据通信机制 无论是Lua调用C# ...
- xLua自定义加载器
xLua入门基础 环境配置 github下载xLua文件: xLua是腾讯开发,据说比较先进: 下载下来后将Plugins和XLua文件夹考进项目: Plugins多平台权限:XLua和C#交互: t ...
随机推荐
- Qt之任务栏系统托盘图标
转自 --> http://blog.csdn.net/qivan/article/details/7506306 托盘图标,一个自己脑子出现很久的词,可惜自己都没动手去实现.最近看见的,听见 ...
- CSS控制表格嵌套
网页设计应用中,当我们不能完全放弃表格的使用时,为了达到预期的效果,不免要用到表格嵌套(特别是多层嵌套)方式来进行布局.可能很多同仁都遇到过这样的问题,为了达到显示效果要为每一个(每一层)的表格写不同 ...
- 仿联想商城laravel实战---2、后端页面搭建(验证码如何在页面中使用)
仿联想商城laravel实战---2.后端页面搭建(验证码如何在页面中使用) 一.总结 一句话总结: 放在img里面,img的src就是生产验证码的控制器路径: img src="/admi ...
- Python—is和==
首先要知道Python中对象包含的三个基本要素,分别是:id(身份标识).type(数据类型)和value(值). ==是python运算符中的比较操作符,用来比较判断两个对象的value(值)是否相 ...
- 与STL文件相关的各类学习地址
几个网址: 1.STL :https://en.wikipedia.org/wiki/STL_(file_format)#ASCII_STL 2.一个博客的文章地址: 三维图形数据格式 STL的 读取 ...
- Finding Similar Items 文本相似度计算的算法——机器学习、词向量空间cosine、NLTK、diff、Levenshtein距离
http://infolab.stanford.edu/~ullman/mmds/ch3.pdf 汇总于此 还有这本书 http://www-nlp.stanford.edu/IR-book/ 里面有 ...
- 关于IDT报错乱码总结
可算是把我折腾坏了.一筹莫展.最后才把这些问题搞好.有些事不知道做以前,怎么都想不到.发现了方法之后,原来也不过这样.我觉得自己记性太差.还是好好写下来吧.写下来顺便会帮我重新再梳理一遍.原先乱码是因 ...
- Idea_学习_07_Idea常用配置
二.参考资料 1.Android Studio 入门级教程(一)
- FileInputStream 原理总结 把文件作为字节流进行读操作
package io; import java.io.FileInputStream; import java.io.IOException; public class IOUtil { /** * ...
- 基于zepto使用swipe.js制作轮播图demo
在移动web开发中,由于手机界面较小,为了能展示更多的图片经常使用轮播图并且还需要考虑到手机流量的问题,通过请教他人以及百度,个人感觉swipe.js比较好用 它是一个纯javascript工具,不需 ...