一.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 基础的更多相关文章

  1. XLua基础

    一.Lua文件加载 1).Resources加载xluaTest文件 2).通过loader加载  3).自定义Loader(相当于Resources加载和loader加载结合)    先自定义Loa ...

  2. XLua 网络加载(基础操作)

    LoadGameMethod  网上资源加载更新:加载场景中另建协程用来加载; public void LoadGameMethod() { StartCoroutine(start());      ...

  3. C++基础——模拟事务 (1)COMMAND模式

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  4. 【腾讯Bugly干货分享】手游热更新方案xLua开源:Unity3D下Lua编程解决方案

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/2bY7A6ihK9IMcA0bOFyB-Q 导语 xL ...

  5. xLua中导出Dotween

    前言 在xlua的lua脚本中使用dotween,官方的文档中有提到可以导出,但未介绍详细的步骤,相信比较多的朋友有需要,刚好项目中也在使用xlua和dotween,所以做个笔记. 基础知识: xLu ...

  6. xlua中lua对象到c#对象的转型

    lua中的类型 基础类型 #define LUA_TNIL 0 #define LUA_TBOOLEAN 1 #define LUA_TLIGHTUSERDATA 2 #define LUA_TNUM ...

  7. 热更新解决方案--xlua学习笔记

    一.热更新方案简介 在Unity游戏工程中,C#代码(编译型语言)资源和Resources文件夹下的资源打包后都不可以更改,因此这部分内容不能进行热更新,而lua代码(解释型语言)逻辑不需要进行预编译 ...

  8. 深入xLua实现原理之Lua如何调用C#

    xLua是腾讯的一个开源项目,为Unity. .Net. Mono等C#环境增加Lua脚本编程的能力.本文主要是探讨xLua下Lua调用C#的实现原理. Lua与C#数据通信机制 无论是Lua调用C# ...

  9. xLua自定义加载器

    xLua入门基础 环境配置 github下载xLua文件: xLua是腾讯开发,据说比较先进: 下载下来后将Plugins和XLua文件夹考进项目: Plugins多平台权限:XLua和C#交互: t ...

随机推荐

  1. Linux学习之CentOS(一)--CentOS6.6下Mysql数据库的安装与配置

    在这里我是通过yum来进行mysql数据库的安装的,通过这种方式进行安装,可以将跟mysql相关的一些服务.jar包都给我们安装好,所以省去了很多不必要的麻烦!!! [root@larry ~]# c ...

  2. 也来谈幂等和CAS

    什么是幂等? 一个方法,不管你执行多少次,保证执行的结果总是相同的.这种方法或者服务就是幂等的. 什么是CAS? CAS是Compare And Set的缩写,顾名思义,就是先比较再设置,这种方式避免 ...

  3. android 真心话大冒险 摇色子

    android 真心话大冒险  摇色子 软件

  4. Android GreenDao 中文表名,中文字段DAO生成乱码的问题

    在gradle.properties 文件中加入编码类型 # Project-wide Gradle settings. # IDE (e.g. Android Studio) users: # Gr ...

  5. mysql delete数据时报Error Code 1175

    我们在学校mysql的时候,在更新或者删除数据的时候,会遇到以下错误: Error Code: . You are using safe update mode and you tried to up ...

  6. java:stack栈: Stack 类表示后进先出(LIFO)的对象堆栈

    //Stack 类表示后进先出(LIFO)的对象堆栈 //它提供了通常的 push 和 pop 操作,以及取栈顶点的 peek 方法.测试堆栈是否为空的 empty 方法.在堆栈中查找项并确定到栈顶距 ...

  7. 计算地球上两个坐标点(经度,纬度)之间距离sql函数

    go --计算地球上两个坐标点(经度,纬度)之间距离sql函数 --作者:lordbaby --整理:www.aspbc.com CREATE FUNCTION [dbo].[fnGetDistanc ...

  8. 基于T4的生成方式

    一.什么是T4模板 T4是对“Text Template Transformation Toolkit”(4个T)的简称.是一个基于文本文件转换的工具包.T4的核心是一个基于“文本模板”的转换引擎(以 ...

  9. hihocoder -1283 hiho密码(水题)

      时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho根据最近在密码学课上学习到的知识,开发出了一款hiho密码,这款密码的秘钥是这样生成的:对于一种有N个字母的语言 ...

  10. 树套树Day1线段树套平衡树bzoj3196

    您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)5.查 ...