【问题标题】:Unity instantiated gameobject throws an error and acts like a prefabUnity 实例化的游戏对象抛出错误并像预制件一样工作
【发布时间】:2019-10-18 11:17:53
【问题描述】:

我正在尝试使用按钮 UI 元素统一创建一个滚动库存系统。我为一个不是预制的按钮制作了一个模板,并使用该模板实例化了一个游戏对象,这应该是模板的克隆。相反,它就像一个预制件并给了我一个错误。

我碰巧找到了一个运行良好的tutorial。我按照本教程一直到必须设置实例化游戏对象的父级。导师做到了这一点,没有任何麻烦。我没有尝试联系制作本教程的人,因为此时它已经超过 2 年了,并且该频道至少有 7 个月没有活跃。我尝试更改他的代码并删除按钮预制件。我在此站点上找到了 similar problem,但该解决方案对我不起作用。

[SerializeField]
private GameObject itemTemplate, inventoryTabWeapons;

private GameObject item;

public void GenerateItem(string name)
{
   item = Instantiate(itemTemplate) as GameObject;
   item.SetActive(true);
   item.transform.SetParent(inventoryTabWeapons.transform, false); //This line is where the error brings me to.
}

我想在这里发布结果的截图,但我显然没有足够的声望点。

预期结果: 该按钮应成为 ListContent 的子项,ListContent 在检查器中设置为inventoryTabWeapons。

实际结果: 该按钮不是任何东西的子元素。

我收到以下错误:

禁用设置驻留在预制资产中的转换的父级以防止数据损坏

这段代码没有使用任何预制件,唯一改变其父级的资产是模板的克隆,所以这个错误对我来说没有意义。

【问题讨论】:

  • 实例化功能仅适用于预制件。你不能实例化不是预制的东西。
  • @SeanCarey 使用 [SerializeField] 时,您可以通过检查器拖放任何游戏对象并使用该游戏对象进行实例化。当按钮是预制件并且我通过检查器拖放预制件时,同样的错误也适用。
  • 不,你错了。你不能实例化不是预制的东西。这就是您的代码不起作用的原因。
  • @SeanCarey 当我看到您的第一条评论时,我尝试将按钮变成预制件并将检查器中的预制件拖到正确的组件上。绝对没有任何改变。在同一个项目中有几个实例,我确实使用了这种方法,而没有将游戏对象变成预制件,并且它起作用了。按照你刚才的评论,我又试了一次,它没有失败。恐怕这不能解决我的问题。

标签: c# unity3d


【解决方案1】:

确保 itemTemplatePrefab 是 PREFAB,并确保 inventoryTabWeapons 不是预制件,而是场景中的实际游戏对象。然后将您的代码重写为以下内容:

[SerializeField]
private GameObject itemTemplatePrefab, inventoryTabWeapons;

public void GenerateItem(string name)
{
    var item = Instantiate(itemTemplatePrefab);
    item.SetActive(true);
    item.transform.SetParent(inventoryTabWeapons.transform, false);
}

所以 itemTemplatePrefab 是预制件,inventoryTabWeapons 不是预制件。

【讨论】:

  • itemTemplatePrefab 现在是预制件,inventoryTabWeapons 不是预制件。正如您向我展示的那样,我已经重新编写了代码。错误仍然存​​在。
【解决方案2】:

当我昨晚退出编辑器并在今天早上重新打开它时,错误突然消失了,尽管我已经尝试退出并重新打开编辑器。我得到了几个不同的错误,我设法解决了这些错误。我想我的问题的解决方案只是等待。

【讨论】:

    【解决方案3】:

    我不知道为什么会发生这种情况,并且在网上找到一个好的线程并不容易,但我发现在对象启动时缓存转换似乎可以防止它被破坏(通过垃圾收集器或 Unity) .

    所以在你的情况下,我会重新写成这样:

    [SerializeField]
    private GameObject itemTemplatePrefab, inventoryTabWeapons;
    // rename as pleased.
    private Transform _tranformCache
    
    private void Start()
    {
       _transformCache = inventoryTabWeapons.transform;
    }
    
    public void GenerateItem(string name)
    {
        // .. previous code ..
        item.transform.SetParent(_transformCache, false);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多