【问题标题】:How to properly use prefabs from AsssetBundles?如何正确使用 Asset Bundles 中的预制件?
【发布时间】:2022-07-11 04:31:12
【问题描述】:

我最近遇到了 AssetBundles 并尝试在我的项目中实现它。我有一个非常简单的游戏,控制一个你应该收集硬币的角色。我在制作预制件的地方创建了 AssetBundle,并将游戏场景(背景、玩家、地形等)中的所有内容放入 AssetBundle 中。然而,当从包中加载对象到游戏场景时,尽管在检查器中具有相同的大小和变换参数,但在开始游戏时它们比它们的原始预制件大。而加载的角色,不仅体积是原来的十倍,而且在游戏过程中还需要重新调整脚本依赖,用摇杆控制。就预制件大小差异而言,我认为它与加载屏幕有关,因为捆绑包中的所有内容都按比例缩放到其大小(见图 1),但我不知道为什么会发生这种情况,也不知道如何解决它。

加载预制件的脚本:

public class LoadAssetBundles : MonoBehaviour
{

    AssetBundle loadedAssetBundle;
    public string path;
    public string assetName;

    void Start()
    {
        LoadAssetBundle(path);
        InstantiateObjectFromBundle(assetName);
    }

    void LoadAssetBundle(string bundleUrl)
    {
        loadedAssetBundle = AssetBundle.LoadFromFile(bundleUrl);

    }

    void InstantiateObjectFromBundle(string assetName)
    {
        var prefab = loadedAssetBundle.LoadAsset(assetName);
        Instantiate(prefab);
    }

}

【问题讨论】:

    标签: unity3d assetbundle


    【解决方案1】:

    尝试将预制根(最外层的游戏对象)比例设置为 1,它们会重新缩放其中的精灵。

    如果你的画布上有一个 CanvasScaler,画布比例可能会低于 1,小的像:0.02321f,你的对象似乎有一个像 107.f 之类的高比例,这可能是造成差异的原因。 实例化时,尝试传递一个父变换(您要放置预制件的位置)并更改 bool instantiateInWorldSpace(开/关)并查看它如何影响您的预制件。

    public static Object Instantiate(Object original, Transform parent, bool instantiateInWorldSpace);
    

    检查文档:https://docs.unity3d.com/ScriptReference/Object.Instantiate.html

    【讨论】:

    • 你能告诉我如何在我的脚本中实现它吗?
    • @VitaliyRadchuk 我可以给你一些建议:首先定义你的预制件在你的场景中的位置(谁将成为它的父母)。他们在您的场景中使用 Singleton(搜索此主题)公开此父级“GameObject.transform”。当您调用 InstantiateObjectFromBundle 时,您将这个“玩家的父变换”作为参数传递。当它调用 Instantiate 时,您将转换作为“父”参数传递(就像我上面写的那个函数)。 Unity 将直接克隆您的预制件作为“玩家的父变换”子项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多