C# 在Unity游戏中使用插件的游戏资源的正确方法是什么?

C# 在Unity游戏中使用插件的游戏资源的正确方法是什么?,c#,unity3d,plugins,assetbundle,C#,Unity3d,Plugins,Assetbundle,我创建的游戏使用统一引擎,并希望强大的插件系统 插件作者可以使用Unity Asset Bundle向游戏添加新资源 插件作者可以使用C#runtime向游戏添加新代码,或者我甚至可以使用类似ModTool或UMod这样的资产商店中的插件 插件作者事件可以使用和扩展游戏中的代码,如果我将其编译为单独的.dll文件 但是 插件作者如何重用游戏中的资源(如特定的着色器、材质、纹理或预制体),而不复制它们 想象一下,作者想要创建特定场景并使用我的库中的许多现有对象,或者只是向它们的项目添加一些独特的着

我创建的游戏使用统一引擎,并希望强大的插件系统

  • 插件作者可以使用Unity Asset Bundle向游戏添加新资源
  • 插件作者可以使用C#runtime向游戏添加新代码,或者我甚至可以使用类似ModTool或UMod这样的资产商店中的插件
  • 插件作者事件可以使用和扩展游戏中的代码,如果我将其编译为单独的.dll文件
  • 但是

    插件作者如何重用游戏中的资源(如特定的着色器、材质、纹理或预制体),而不复制它们

    想象一下,作者想要创建特定场景并使用我的库中的许多现有对象,或者只是向它们的项目添加一些独特的着色器。唯一的方法,我现在看到的是导入插件完整的游戏作为资产包,删除所有多余的部分和出口作为插件资产包,但在这种情况下,所有的项目将被复制,批处理将被打破,插件的大小将膨胀


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

    首先,我想指出一件事,您可能知道。但我只是想确定一下

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

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

    另一种选择是让您希望插件具有访问权限的所有资源都位于StreamingAssets文件夹中。请注意,StreamingAssets文件夹中的资产将可供所有人使用,因此每个人也可以对其进行编辑

    统一文件:

    汇编:


    是的,我听说了,但是谢谢你流媒体资产不是真正的重用,不是吗?例如,应该为每个插件创建材质和纹理,因此批处理将不起作用,内存将被大量使用请解释一下公共参考资料。例如,插件作者希望将核心游戏中的汽车模型添加到插件中的停车场建筑中。他怎么能这样做?他与停车场大楼的联合项目已经启动,并编写了游戏,其中有很多汽车模型。他想让我试着以停车场大楼为例写出来。假设您有一个名为
    AllCars
    的游戏对象,其中包含一个游戏对象数组,每个游戏对象中都有一个预置:
    public GameObject[]carPrefabs您可以从assetbundle的脚本中访问此数组(因为它是公共的),以使用基础游戏中AllCars脚本中引用的资源实例化新车。例如:
    GameObject newCar=Instantiate(FindObjectOfType().carPrefabs[0],位置,旋转)
    然后会实例化一辆与阵列中第一辆车的型号搭配的GO吗?您指的是启动时间(在游戏期间)?编辑时间呢?插件的作者能在他的编辑器中看到这个汽车物体而不启动游戏吗。我假设这就是你要找的,如果我误解了,请道歉!恐怕我不知道如何让它在编辑器中可见。没关系。这是目前最好的解决方案。这并不理想,但它的解决方案。非常感谢。如果有人有其他想法,那就太好了。