xlua使用

[复制链接]
发表于 2026-2-10 17:01:33 | 显示全部楼层 |阅读模式
1. 安装

到 github 移动三个文件夹已往即可
Assets -》Plugins
Assets -》Xlua
Tools
移动到 unity内里的Assets目次即可
会在工具栏出现Xlua即安装乐成
2. 引入底子类


ABMgr.cs
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.Events;
  5. public class ABMgr : SingletonAutoMono<ABMgr>
  6. {
  7.    
  8.    
  9.     private AssetBundle mainAB = null;
  10.     //依赖包获取用的配置文件
  11.     private AssetBundleManifest manifest = null;
  12.     //AB包不能够重复加载 重复加载会报错
  13.     //字典 用字典来存储 加载过的AB包
  14.     private Dictionary<string, AssetBundle> abDic = new Dictionary<string, AssetBundle>();
  15.     /// <summary>
  16.     /// 这个AB包存放路径 方便修改
  17.     /// </summary>
  18.     private string PathUrl
  19.     {
  20.    
  21.    
  22.         get
  23.         {
  24.    
  25.    
  26.             return Application.streamingAssetsPath + "/";
  27.         }
  28.     }
  29.     /// <summary>
  30.     /// 主包名 方便修改
  31.     /// </summary>
  32.     private string MainABName
  33.     {
  34.    
  35.    
  36.         get
  37.         {
  38.    
  39.    
  40. #if UNITY_IOS
  41.             return "IOS";
  42. #elif UNITY_ANDROID
  43.             return "Android";
  44. #else
  45.             return "PC";
  46. #endif
  47.         }
  48.     }
  49.     /// <summary>
  50.     /// 加载AB包
  51.     /// </summary>
  52.     /// <param name="abName"></param>
  53.     public void LoadAB( string abName )
  54.     {
  55.    
  56.    
  57.         //加载AB包
  58.         if (mainAB == null)
  59.         {
  60.    
  61.    
  62.             mainAB = AssetBundle.LoadFromFile(PathUrl + MainABName);
  63.             manifest = mainAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
  64.         }
  65.         //我们获取依赖包相关信息
  66.         AssetBundle ab = null;
  67.         string[] strs = manifest.GetAllDependencies(abName);
  68.         for (int i = 0; i < strs.Length; i++)
  69.         {
  70.    
  71.    
  72.             //判断包是否加载过
  73.             if (!abDic.ContainsKey(strs[i]))
  74.             {
  75.    
  76.    
  77.                 ab = AssetBundle.LoadFromFile(PathUrl + strs[i]);
  78.                 abDic.Add(strs[i], ab);
  79.             }
  80.         }
  81.         //加载资源来源包
  82.         //如果没有加载过 再加载
  83.         if (!abDic.ContainsKey(abName))
  84.         {
  85.    
  86.    
  87.             ab = AssetBundle.LoadFromFile(PathUrl + abName);
  88.             abDic.Add(abName, ab);
  89.         }
  90.     }
  91.     //同步加载 不指定类型
  92.     public Object LoadRes(string abName, string resName)
  93.     {
  94.    
  95.    
  96.         //加载AB包
  97.         LoadAB(abName);
  98.         //为了外面方便 在加载资源时 判断一下 资源是不是GameObject
  99.         //如果是 直接实例化了 再返回给外部
  100.         Object obj = abDic[abName].LoadAsset(resName);
  101.         if (obj is GameObject)
  102.             return Instantiate(obj);
  103.         else
  104.             return obj;
  105.     }
  106.     //同步加载 根据type指定类型
  107.     public Object LoadRes(string abName, string resName, System.Type type)
  108.     {
  109.    
  110.    
  111.         //加载AB包
  112.         LoadAB(abName);
  113.         //为了外面方便 在加载资源时 判断一下 资源是不是GameObject
  114.         //如果是 直接实例化了 再返回给外部
  115.         Object obj = abDic[abName].LoadAsset(resName, type);
  116.         if (obj is GameObject)
  117.             return Instantiate(obj);
  118.         else
  119.             return obj;
  120.     }
  121.     //同步加载 根据泛型指定类型
  122.     public T LoadRes<T>(string abName, string resName) where T:Object
  123.     {
  124.    
  125.    
  126.         //加载AB包
  127.         LoadAB(abName);
  128.         //为了外面方便 在加载资源时 判断一下 资源是不是GameObject
  129.         //如果是 直接实例化了 再返回给外部
  130.         T obj = abDic[abName].LoadAsset<T>(resName);
  131.         if (obj is GameObject)
  132.             return Instantiate(obj);
  133.         else
  134.             return obj;
  135.     }
  136.    
  137.     //异步加载的方法
  138.     //这里的异步加载 AB包并没有使用异步加载
  139.     //知识从AB包中 加载资源时 使用异步
  140.     //根据名字异步加载资源
  141.     public void LoadResAsync(string abName, string resName, UnityAction<Object> callBack)
  142.     {
  143.    
  144.    
  145.         StartCoroutine(ReallyLoadResAsync(abName, resName, callBack));
  146.     }
  147.     private IEnumerator ReallyLoadResAsync(string abName, string resName, UnityAction<Object> callBack)
  148.     {
  149.    
  150.    
  151.         //加载AB包
  152.         LoadAB(abName);
  153.         //为了外面方便 在加载资源时 判断一下 资源是不是GameObject
  154.         //如果是 直接实例化了 再返回给外部
  155.         AssetBundleRequest abr = abDic[abName].LoadAssetAsync(resName);
  156.         yield return abr;
  157.         //异步加载结束后 通过委托 传递给外部 外部来使用
  158.         if (abr.asset is GameObject)
  159.             callBack(Instantiate(abr.asset));
  160.         else
  161.             callBack(abr.asset);
  162.     }
  163.     //根据Type异步加载资源
  164.     public void LoadResAsync(string abName, string resName, System.Type type, UnityAction<Object> callBack)
  165.     {
  166.    
  167.    
  168.         StartCoroutine(ReallyLoadResAsync(abName, resName, type, callBack));
  169.     }
  170.     private IEnumerator ReallyLoadResAsync(string abName, string resName, System.Type type, UnityAction<Object> callBack)
  171.     {
  172.    
  173.    
  174.         //加载AB包
  175.         LoadAB(abName);
  176.         //为了外面方便 在
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表