【问题标题】:What is correct way of using game resources from plugin in Unity game?在 Unity 游戏中使用插件中的游戏资源的正确方法是什么?
【发布时间】:2018-08-10 01:37:33
【问题描述】:

我使用 Unity 引擎创建游戏,想要强大的插件系统。

  1. 插件作者可以使用 Unity 资源包向游戏添加新资源
  2. 插件作者可以使用 C# 运行时向游戏添加新代码,或者我什至可以使用 Asset Store 中的此类插件,例如 ModTool 或 UMod
  3. 如果我将游戏中的代码编译为单独的 .dll 文件,插件作者事件可以使用和扩展代码

但是……

插件作者如何在不复制它们的情况下重复使用我的游戏中的资源(例如特定的着色器、材质、纹理或预制件)?

想象一下,那个作者想要创建特定的场景并使用我库中的大量现有对象,或者只是为他们的项目添加一些独特的着色器。我现在看到的唯一方法是将插件完整游戏作为 Asset Bundle 导入,删除所有冗余部分并作为插件 Asset Bundle 导出,但在这种情况下,所有项目都将被复制,批处理将被破坏,插件的大小将膨胀了。

这部分的主要问题是很多功能(除了核心之外的所有功能:例如单元、建筑物等)我希望将其视为单独的插件,它们重用一些核心代码和核心资源。

【问题讨论】:

    标签: c# unity3d plugins assetbundle


    【解决方案1】:

    首先我想指出一件事,你可能知道。但只是为了确保。

    assetbundle 中的脚本将是 textAsset,因此不会作为脚本执行 如果您希望您的assetbundle 具有可执行代码,则需要先将其预编译为程序集,然后使用单反射加载。请记住,这会使您的应用程序容易受到恶意代码的攻击。并且由于这种从资产包加载脚本在 Windows Store Apps 和 Windows Phone 上根本不支持,并且反射在 IOS 上不可用,限制了您可以定位的平台。

    只要您可以从资产包代码访问的场景中已经存在对所述资源的公开引用,重用基础游戏中已有的资源就不是问题。您可以通过拥有某种“主”组件来利用这一点,该组件包含对所有公共资源的引用。

    另一种选择是将您希望插件访问的所有资源都放在 StreamingAssets 文件夹中 请注意,StreamingAssets 文件夹中的资产对所有人都可用,因此每个人都可以编辑。

    统一文档:

    编译:

    【讨论】:

    • 是的,我听说过,但是谢谢! _ 流媒体资产不是真正的重用,不是吗?例如。应该为每个插件创建材质和纹理,因此批处理将不起作用并且会占用大量内存。 _请解释一下公共参考。例如,插件作者想在插件中将核心游戏中的汽车模型添加到他的停车场。他怎么能这样做?他打开了带有停车楼的 Unity 项目,并编写了包含大量汽车模型的游戏。他想
    • 我会试着用停车场建筑的例子来写出来。假设你有一个游戏对象,其脚本名为 AllCars,其中包含一个游戏对象数组,其中填充了每辆车的预制件:public GameObject[] carPrefabs; 你可以从你的资产包脚本中访问这个数组(因为它是公共的)来实例化一辆新车,使用基础游戏中的 AllCars 脚本中引用的资源。例如:GameObject newCar = Instantiate(FindObjectOfType<AllCars>().carPrefabs[0], position, rotation); 然后将使用数组中第一辆车的模型实例化一个 GO
    • 您是指启动时间(游戏期间)吗?编辑时间呢?插件作者可以在不启动游戏的情况下在他的编辑器中看到这个汽车对象吗?
    • 是的,那将是在发布期间。我假设这就是您要寻找的东西,如果我误解了,请道歉!恐怕我不知道如何让它在编辑器中可见。
    • 没关系。这是现在最好的解决方案。这并不理想,但它的解决方案。谢谢你。如果有人有其他想法,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    相关资源
    最近更新 更多