一、xLua简介
xLua是基于Lua语言的开源插件,能够支持在Unity中嵌入Lua脚本(Lua脚本支持热更,适用于游戏的业务逻辑开发和维护)
xLua源码地址
二、构建方法
- 新建一个Unity项目(模板选择Universal 3D(URP))
- 下载xLua源码,将Assets目录及其子目录下的全部文件拷贝到Unity项目的Assets目录下
- 如出现编译错误“error CS0246: The type or namespace name 'MemberInfo' could not be found (are you missing a using directive or an assembly reference?)”,则打开报错的ExampleGenConfig.cs文件,把“using System.Reflection;”的注释去掉
- 创建Lua脚本:在Assets/Resource/Lua目录下(没有则自行创建),创建PlayerController.lua
local PlayerController =
{speed = 2
}function PlayerController:Update()self.direction = CS.UnityEngine.Vector3(0, 0, 0)if CS.UnityEngine.Input.GetKey(CS.UnityEngine.KeyCode.W) thenself.direction = self.direction + CS.UnityEngine.Vector3(0, 0, 1)endif CS.UnityEngine.Input.GetKey(CS.UnityEngine.KeyCode.S) thenself.direction = self.direction + CS.UnityEngine.Vector3(0, 0, -1)endif CS.UnityEngine.Input.GetKey(CS.UnityEngine.KeyCode.A) thenself.direction = self.direction + CS.UnityEngine.Vector3(-1, 0, 0)endif CS.UnityEngine.Input.GetKey(CS.UnityEngine.KeyCode.D) thenself.direction = self.direction + CS.UnityEngine.Vector3(1, 0, 0)endself.gameObject.transform.position = self.gameObject.transform.position + self.direction * self.speed * CS.UnityEngine.Time.deltaTime
end_G.PlayerController = PlayerController
- 创建LuaImporter:在Assets/Scripts/Editor目录下,创建LuaImporter.cs,使得Unity能够将.lua后缀的文件识别为文本文件
using System.IO;
using UnityEditor;
using UnityEditor.AssetImporters;
using UnityEngine;
using XLuaTest;[ScriptedImporter(1, ".lua")]
public class LuaImporter : ScriptedImporter
{public override void OnImportAsset(AssetImportContext ctx){var luaTxt = File.ReadAllText(ctx.assetPath);var assetsText = new TextAsset(luaTxt);ctx.AddObjectToAsset("main obj", assetsText);ctx.SetMainObject(assetsText);}
}
- 创建并使用Lua虚拟机:在Assets/Scripts目录下,创建LuaManager.cs脚本,作为lua脚本执行的入口
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;public class LuaManager : MonoBehaviour
{LuaEnv luaEnv;LuaTable luaTable;LuaFunction luaFunction;void Start(){// 创建Lua虚拟机luaEnv = new LuaEnv();// 指定Lua文件的加载方式luaEnv.AddLoader(LoadLuaFile);// 将C#对象存入Lua表中GameObject player = GameObject.Find("Player");luaEnv.DoString("require('Lua.PlayerController')");// 设置PlayerController的gameObject属性,并获取Update函数luaTable = luaEnv.Global.Get<LuaTable>("PlayerController");luaTable.Set("gameObject", player);luaFunction = luaTable.Get<LuaFunction>("Update");}void Update(){// 执行PlayerController:Update()函数luaFunction.Call(luaTable);}public static byte[] LoadLuaFile(ref string filepath){filepath = $"{filepath.Replace(".", "/")}";TextAsset file = Resources.Load(filepath) as TextAsset;return file.bytes;}
}
- 创建对象,挂载脚本:
打开SampleScene场景,创建三个对象:一个空对象,一个Capsule(将名称修改为Player),一个Plane,在空对象上挂载LuaManager脚本
- 测试:
启动游戏,可通过键盘WASD控制Player移动
三、打包
- 菜单栏选择XLua > Generate Code
- 菜单栏选择File > Build Settings,打开Build Settings面板,上方选择要打包的场景,左侧Platform栏选择目标平台(以Android为例),然后右下角选择Build,选择打包路径,等待打包完成即可