IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity和Lua的相互调用(XLua框架) -> 正文阅读

[游戏开发]Unity和Lua的相互调用(XLua框架)

XLua是一套成熟的热更新框架,本编记录Unity和Lua的相互调用。

Unity调用Lua

用lua的require函数即可 ,require实际上是调一个个的loader去加载,有一个成功就不再往下尝试,全失败则报文件找不到。目前xLua除了原生的loader外,还添加了从Resource加载的loader,需要注意的是因为Resource只支持有限的后缀,放Resources下的lua文件得加上txt后缀。

 LuaEnv luaEnv = new LuaEnv();

 luaEnv.DoString("require 'fq'");

获取一个全局基本数据类型 访问LuaEnv.Global就可以了


        //获取lua中的全局变量
        int a=  luaEnv.Global.Get<int>("a");

        Debug.Log(a);

访问一个全局的table有四种方法

1.映射到普通class或struct

    class Person {
        public string name;

        public int age;
    
    }
        Person p = luaEnv.Global.Get<Person>("tab");

        print(p.name + "  " + p.age);

2.映射到一个interface,接口要加上? [CSharpCallLua]

    [CSharpCallLua]
    public  interface IPerson
    {
        string name { get; set; }

        int age { get; set; }

        void eat(int a,int b);
        
    }

    IPerson p1 = luaEnv.Global.Get<IPerson>("tab");

    print(p1.name);

    p1.eat(12,3);

3.映射到Dictionary<>,List<> 但是字典和数组各有优缺点,字典只会映射到带Key的,数组只会映射到不带Key的元素。

  Dictionary<string,object> dic=  luaEnv.Global.Get<Dictionary<string, object>>("tab");

        foreach (var item in dic)
        {
           print(item.Key );
        }

  List<object> list = luaEnv.Global.Get<List<object>>("tab");

        foreach (var item in list)
        {
            print(item);
        }

4.映射到LuaTable类,这种方式好处是不需要生成代码,但也有一些问题,比如慢,比方式2要慢一个数量级,比如没有类型检查。

   LuaTable tab = luaEnv.Global.Get<LuaTable>("tab");

       print(tab.Get<string>("name"));

访问一个全局的function两种方法

1.映射到delegate,这种是建议的方式,性能好很多,而且类型安全。缺点是要生成代码

 [CSharpCallLua]
 delegate void Add(int a, int b);

 Add act = luaEnv.Global.Get<Add>("add");
 act(7,8);
 act = null;

2.映射到LuaFunction,这种方式的优缺点刚好和第一种相反。

  LuaFunction luaFunction = luaEnv.Global.Get<LuaFunction>("add");

  luaFunction.Call(1, 8);

Lua调Unity

unity代码准备

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;


public class test1 : MonoBehaviour
{
 
    void Start()
    {
        LuaEnv luaEnv = new LuaEnv();

        luaEnv.DoString("require 'ffq'");

        luaEnv.Dispose();
    }

    public void Rrr()
    {
        print(1);
    } 
    void Update()
    {
        
    }
}

lua代码

 
 --lua访问静态的属性和方法
 local unity= CS.UnityEngine

 unity.GameObject("一个物体")

 local a=unity.GameObject.Find("Main Camera")

 a.name="相机"

 --lua访问成员变量和方法
 local c=a:GetComponent("Camera")

 unity.GameObject.Destroy(c);


 local L=  CS.test1()
 
 L:Rrr()

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:25:36  更:2022-04-01 00:28:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:09:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码