【问题标题】:How to load scripts required by asset-bundle unity?如何加载资产捆绑统一所需的脚本?
【发布时间】:2020-01-30 04:02:08
【问题描述】:

我正在开发一个统一项目,其中游戏场景被下载并在运行时运行。我通过制作场景的资产包并加载它来使其工作,但我面临的问题是场景所需的脚本不包含在资产包中。我刚被困在这里,谁能帮我,我如何下载/加载所需的脚本我如何将它们包含在资产包中。以便我可以加载它们也在运行时。

抱歉英语不好。 谢谢。

【问题讨论】:

    标签: c# unity3d assetbundle


    【解决方案1】:

    您可以在资产包中添加任何类型的资产。 脚本(.cs 文件)将无法包含在资产包中。

    添加所有 脚本/materials/.. 您需要的方式取决于场景中包含的内容,将它们全部存储在一个文件夹中。然后,您可以将整个文件夹分配给 AssetBundle tag,就像您的场景一样。

    客户端需要下载的场景必须在同一个asset-bundle标签中。

    注意:如果您不能将它们全部存储在同一个文件夹中,只需为要添加到捆绑包中的每个资产(或子文件夹)手动分配其资产包标签。 p>

    现在您可以运行一个方法来为您创建捆绑包,如下所示:

    [MenuItem("Bundles/Create all bundles")]
    static void BuildAllAssetBundles()
    {
        BuildPipeline.BuildAssetBundles(Path.Combine(Application.dataPath, "AssetBundleLocation"), BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
    }
    

    There 是关于如何构建资产包的更多信息。

    现在所有需要的文件都应该存储在资产包文件中,“编辑”除了脚本文件。查看UnityEngine.AssetBundle 类以加载和卸载包/资产。


    编辑

    将脚本文件包含在资产包中的实际工作是将代码写入 TextAsset 文件 (.txt)。

    一旦从资产包加载,这些文件会给你一个字符串。

    AssetBundle ab = AssetBundle.LoadFromFile(Path.Combine(Application.dataPath, "StreamingAssets/exampleassetbundle")); // Your asset-bundle path
    TextAsset textAsset = ab.LoadAsset<TextAsset>(ab.GetAllAssetNames()[0]); // In my example I only have 1 file in the asset-bundle, the TextAsset
    string flatCode = textAsset.text;
    

    现在问题是,您必须将平面字符串代码编译为实际的 C# 类。 这称为运行时编译

    有很多关于如何做的教程,as this stackexchange post

    这有点棘手,但会做你想做的。

    注意: IOS 和 Android 可能不允许您在运行时编译代码,因此取决于您的目标平台,您需要进一步调查。

    【讨论】:

    • 我收到警告“脚本资产不能包含在 AssetBundles 中:“Assets/Scripts/ButtonController.cs”,附加图片也请检查。link
    • 确实如此。经过更多调查,任何资产都可以放入资产包中,但 .cs 文件(包括 MonoBehaviour)。将编辑我的帖子,告诉你我会怎么做。
    猜你喜欢
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 2013-03-11
    • 2020-09-10
    • 1970-01-01
    相关资源
    最近更新 更多