• Unity ab包加载文本 puerts 自定义loader


    输出ab包
    他会把你创建的ab包都打包
    也就是在这里的创建的都打包
    在这里插入图片描述

    string assetBundleDirectory = Path.Combine(Application.streamingAssetsPath, "OutAssetBundles");
    if (!Directory.Exists(assetBundleDirectory))
    {
    	Directory.CreateDirectory(assetBundleDirectory);
    }
    BuildPipeline.BuildAssetBundles(assetBundleDirectory,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    加载ab包里的文本文件
    文本类型是 UnityEngine.TextAsset
    c# 输出类型是 ab.LoadAsset( xxx ).GetType()

    string str = Path.Combine(Application.streamingAssetsPath, "OutAssetBundles", "myab2");
    var ab = AssetBundle.LoadFromFile(str);
    if (ab == null)
    {
        Debug.Log("Failed to load AssetBundle!");
        return;
    }
    UnityEngine.TextAsset a = ab.LoadAsset<UnityEngine.TextAsset>("Main.mjs");
    Debug.Log(a.text);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    官方的Asset Bundle Browser工具有一个bug
    如果你的ab包删掉了 并且Browser工具里还引用着 就会报错
    需要重启ide
    设置ab包 可以直接设置在文件夹里
    如果你直接输出ab包里的 GetAllAssetNames 名字
    那么会输出路径 我看到的名字也会小写
    不过用你自己的名字也是可以获得的

    UnityEngine.TextAsset 也可以放在属性里
    可以把文本文件拖进去
    在这里插入图片描述
    在这里插入图片描述
    puerts引擎会加载这些文本
    所以自定义loader也必须加进来
    在这里插入图片描述
    热更新的话 可以把mjs文件放到ab包里

    debugpath = "";//这个一般输出完整路径
    filepath = Path.GetFileName(filepath);
    return Main.ab.LoadAsset<UnityEngine.TextAsset>(filepath).text;
    
    • 1
    • 2
    • 3

    就可以运行了!
    怎么断点呢?
    .vscode里创建一个文件launch.json

    {
        "version": "0.2.0",
        "configurations": [{
            "name": "Puerts Debug",
            "type": "node",
            "request": "attach",
            "protocol": "inspector",
            "port": 18080
        }]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    port 就是调式的接口 创建JsEnv的时候用

    private int JavaScriptDebugPort = 18080;
    jsEnv = new JsEnv(new MyLoader(), JavaScriptDebugPort);
    
    • 1
    • 2

    还记得 debugpath 吗
    务必让他是绝对路径 不然调试不了
    在c#里直接 写 \路径是不行的 可以直接在前面加一个 @
    举个例子 @“aaaa\bbb\ccc”
    直接上代码
    好 逻辑分三类
    1 puerts自己的js文件 在Resources里这个就不动了 也许以后升级会用到
    2 ab包的 这个是热更新用的
    3 本地的 设计到调试 所以要把路径正确转换

    using System.Collections.Generic;
    using System.IO;
    using Puerts;
    using UnityEditor;
    using UnityEngine;
    
    public class MyLoader : ILoader, IModuleChecker
    {
        public bool FileExists(string filepath)
        {
            return true;
        }
    
        public string ReadFile(string filepath, out string debugpath)
        {
            debugpath = filepath;
            if (filepath.StartsWith("puerts/"))
            {
                var textAsset = Resources.Load<UnityEngine.TextAsset>(filepath.Replace(".mjs", ""));
                if (textAsset != null)
                {
                    // Debug.Log("读的Resources里的:" + filepath);
                    return textAsset.text;
                }
            }
            if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer)
            {
                // Debug.Log("加载ab包里的:" + filepath);
                //手机上则直接加载ab包里的
                string abPath = "assets/src/tsproj/js/" + filepath;
                return Main.ab.LoadAsset<UnityEngine.TextAsset>(abPath).text;
            }
            else
            {
                string path = Path.Combine("Assets", "src", "tsproj", "js", filepath);
                FileInfo fileInfo = new FileInfo(path);
                debugpath = fileInfo.FullName;
                using (StreamReader sr = fileInfo.OpenText())
                {
                    string res = sr.ReadToEnd();
                    sr.Close();
                    return res;
                }
            }
        }
    
        public bool IsESM(string filepath)
        {
            return true;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    调试前的时候要设置 Application.runInBackground 看下面代码

    Application.runInBackground = true;
    jsEnv = new JsEnv(new MyLoader(), JavaScriptDebugPort);
    jsEnv.WaitDebugger();
    jsEnv.ExecuteModule("Main.mjs");
    
    • 1
    • 2
    • 3
    • 4

    好 现在开始调试
    第一步先运行unity
    这个 jsEnv.WaitDebugger();
    运行到这里的时候 unity就卡死了
    这时候你就可以打开vscode的调试了 就是下面这个 点那个绿箭头
    在这里插入图片描述
    接下来就可以在vscode里断点了

    WaitDebugger 是同步的
    他的要求是
    必须先启动unity 然后再运行vscode调试
    他的优点是 可以断点任何一行代码

    WaitDebuggerAsync 是异步的
    两种情况
    1 使用 await
    await jsEnv.WaitDebuggerAsync();
    运行到这里时还是会卡住 但是他的好处是 不规定启动顺序 先unity 还是先vscode 都行 随便整

    2 不使用 await
    如果你不需要 WaitDebuggerAsync 卡住
    那么可以把 await 去掉
    因为 WaitDebuggerAsync 需要时间 断点第一时间不会起作用
    这个也不规定启动顺序
    所以日常开发 除非要求前面的代码断点 否则用这个是最合适的

    在vscode里调试 需要手动写 WaitDebugger 代码
    但是在chrome里调试 是不需要写任何代码的 比如 WaitDebugger

    用chrome调试
    打开Chrome浏览器地址栏,输入

    chrome://inspect
    
    • 1

    在这里插入图片描述
    在这里插入图片描述
    加入你自己的地址
    18080就是unity里自己输入的端口
    点done
    然后点
    Open dedicated DevTools for Node
    就可以了
    在这里插入图片描述
    直接断点就行了 非常方便

    手机远程调试在这里
    https://www.bilibili.com/read/cv14172266

    ab包药注意的几点
    1.
    ab包 分平台 window 和 android 不一样 所以要做区分
    2.
    ab包加载有一个特点
    要么你输入完全的路径
    也就是遍历 ab.GetAllAssetNames(); 里输出的那个
    要么就只输入名字 不管你文件在哪个路径下 她都能找到
    绝对不能只有半个路径 或者 相对路径
    所以 最好的办法是全路径

  • 相关阅读:
    狂神redis笔记04
    LeetCode每日一练 —— 27. 移除元素
    Vue(四)——全局事件总线, 消息订阅与发布 ,nextTick
    国标GB28181视频平台EasyGBS国标视频云平台级联到EasyCVR,上级平台无法播放通道视频的问题解决方案
    『FPGA通信接口』LVDS接口(4)LVDS接收端设计
    Shell 编程之免交互
    【Linux operation 49】实现ubuntu-22.04.1允许root用户登录图形化桌面
    指针进阶(3)
    django+drf_haystack+elasticsearch+ik+高亮显示
    Nginx Note03——异步非阻塞机制
  • 原文地址:https://blog.csdn.net/qq_38913715/article/details/128095215