ZERO_BEYOND

博客园 首页 联系 订阅 管理
  56 随笔 :: 0 文章 :: 1 评论 :: 15460 阅读

一、搭建场景环境

下载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资源。

posted on   ZERO_BEYOND  阅读(198)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示