如何在Unity脚本中使用公共变量放入资产包

时间:2014-05-30 19:36:05

标签: c# scripting unity3d assetbundle

我已经搜索过这个问题并发现了很多相关的信息,但有些不一致,并且没有明确的答案。

在Unity项目中,我使用具有脚本(C#)的游戏对象创建资产包。我已经学会了如何做到这一点,并且有效。

我的问题是,我最终需要保留在构建资产包之前分配的脚本中的公共变量的值。也就是说,我的预制件有一个带有公共变量的脚本。我为每个实例使用不同的公共值多次实例化。我需要通过资产包来度过这一切。

我现在的流程是:

  1. 从游戏对象中删除脚本。
  2. 将脚本构建为程序集
  3. 将游戏对象和程序集打包到资产包中
  4. 将捆绑包下载到新项目
  5. 解包资产包并实例化游戏对象
  6. 使用AddComponent()
  7. 将脚本程序集附加到游戏对象

    问题是第1步。我在捆绑之前从游戏对象中删除脚本,因为如果我不这样做,它会在解包时抱怨引用的脚本丢失。而且,由于步骤6使用AddComponent来附加它,如果该脚本已经是附加组件,我真的不能这样做。因此,在捆绑之前删除它们可以解决这些问题。

    我错过了什么?我的方法在哪里出错?我读到捆绑时公共值保存在游戏对象的脚本引用中,但当我删除脚本组件时,当然会丢失它。

    那么,请问,如何通过资产捆绑流程维护公共价值?在捆绑之前我不应该删除脚本组件吗?如果是这样,我应该如何以不同方式管理脚本?我需要捆绑脚本程序集和源文件吗? (我目前只捆绑组件),并且在连接组件时不会产生冗余吗?

1 个答案:

答案 0 :(得分:0)

Unity不会在程序包中存储程序集。它仅存储脚本的序列化数据(这是您的公共变量,以及具有[SerializeField]属性的变量)。但它也为每个脚本类型存储脚本程序集的哈希值,因此您必须在同一项目中使用主可执行文件构建包,以避免错过引用。

因此,您不必从GameObjects中删除脚本,但是当代码更改时,您必须在同一个Unity项目中构建bundle并重建它们。