一、搭建场景环境
下载xlua插件:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/faq.md
将红框中的文件拷贝到自己的项目中去。
打开Unity,File -> Build Setting -> Player Setting ->Scriptsing Define Symbols ,然后在里面输入宏“HOTFIX_ENABLE”。
打开测试场景,xlua工具栏里按步骤点击生成脚本后再注入。
运行测试,点击按钮后不会报错且由C#输出切换成lua输出则成功。
二、加载lua文件
利用NetBox2临时搭建简单服务器,需要将lua文件和AssetBundle资源放入同一文件夹内。
1 void Start () { 2 StartCoroutine(LoadResourcesLuaScript()); 3 } 4 5 /// <summary> 6 /// 服务器下载lua脚本并写入本地文件夹 7 /// </summary> 8 /// <returns></returns> 9 IEnumerator LoadResourcesLuaScript() 10 { 11 UnityWebRequest request = UnityWebRequest.Get(@"http://localhost/fish.lua.txt"); 12 yield return request.SendWebRequest(); 13 string str = request.downloadHandler.text; 14 File.WriteAllText(@"E:\xxx\fish.lua.txt", str, System.Text.Encoding.UTF8); 15 UnityWebRequest request1 = UnityWebRequest.Get(@"http://localhost/fishDispose.lua.txt"); 16 yield return request1.SendWebRequest(); 17 string str1 = request1.downloadHandler.text; 18 File.WriteAllText(@"E:\xxx\fishDispose.lua.txt", str1, System.Text.Encoding.UTF8); 19 }
从服务器上下载lua文件。
1 using UnityEngine; 2 using XLua; 3 using System.IO; 4 5 public class HotFixScript : MonoBehaviour 6 { 7 //xlua环境核心类 8 private LuaEnv env; 9 10 private void Awake() 11 { 12 env = new LuaEnv(); 13 env.AddLoader(MyLoader); 14 env.DoString("require 'xxx'"); 15 } 16 17 /// <summary> 18 /// 读取指定lua文件内容 19 /// </summary> 20 /// <param name="filePath">文件名</param> 21 /// <returns></returns> 22 private byte[] MyLoader(ref string filePath) 23 { 24 //文件路径 25 string absPath = @"E:\xxx\" + filePath + ".lua.txt"; 26 //读取lua路径中指定lua文件的内容并数据类型转化 27 return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(absPath)); 28 } 29 30 private void OnDisable() 31 { 32 //置空补丁 33 env.DoString("require 'xxxx'"); 34 } 35 36 private void OnDestroy() 37 { 38 //释放 39 env.Dispose(); 40 } 41 }
加载指定lua文件内容,另一个lua文件作用是取消运行时需要置空补丁,否则会报错。
1 using UnityEditor; 2 using System.IO; 3 4 public class CreateAssetBundles 5 { 6 [MenuItem("AssetBundles/BuildAssetBundles")] 7 public static void BuildAllAssetBundles() 8 { 9 string dir = "AssetBundles"; 10 if (!Directory.Exists(dir)) 11 { 12 Directory.CreateDirectory(dir); 13 } 14 BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64); 15 } 16 17 [MenuItem("AssetBundles/DeleteAssetBundles")] 18 public static void DeleteAllAssetBundles() 19 { 20 string dir = "AssetBundles"; 21 if (Directory.Exists(dir)) 22 { 23 Directory.Delete(dir, true); 24 } 25 } 26 }
顺便补充下AssetBundle文件生成和移除。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; using XLua; [Hotfix] public class LoadABRes : MonoBehaviour { public static Dictionary<string, GameObject> PrefabRes = new Dictionary<string, GameObject>(); [LuaCallCSharp] public void LoadResources(string resName,string filePath) { StartCoroutine(LoadResourceCorotine(resName, filePath)); } [LuaCallCSharp] public static GameObject GetGameObject(string goName) { return PrefabRes[goName]; } /// <summary> /// 服务器下载资源 /// </summary> /// <param name="resName"></param> /// <param name="filePath"></param> /// <returns></returns> IEnumerator LoadResourceCorotine(string resName, string filePath) { UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(@"http://localhost/AssetBundles/" + filePath); yield return request.SendWebRequest(); AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle; GameObject obj = ab.LoadAsset<GameObject>(resName); //将资源添加到字典里 PrefabRes.Add(resName, obj); } }
从服务器上下载AssetBundle资源。
分类:
Lua
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律