【问题标题】:Modifying the parent of an instantiated prefab throws error修改实例化预制件的父级会引发错误
【发布时间】:2019-06-11 00:15:08
【问题描述】:


在做任何事情之前,我已经环顾四周,因为这似乎是一个常见的错误并且有据可查。我知道尝试修改预制件的转换时会发生错误。我不认为我正在这样做。


我在预制对象上附加了以下脚本 - 它是用于纸牌游戏的卡片。脚本是拖放卡片。

只要在我玩游戏之前实例化卡片,它就可以很好地工作;如果我在游戏中实例化它并尝试移动它,我会收到以下错误:

Setting the parent of a transform which resides in a Prefab Asset is disabled to prevent data corruption


public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
    // HANDLES DRAG OF CARDS

    private Transform originalParent; // saving the original parent
    private Card card; // Card is a scriptable object, card holds data
    private Transform canvas; // a reference to the main canvas

    public void SetCanvas(Transform setCanvas)
    {
        canvas = setCanvas;
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        originalParent = transform.parent;
        transform.SetParent(canvas); // WHERE THE ERROR HAPPENS
    }

    public void OnDrag(PointerEventData eventData)
    {
        gameObject.transform.position = Input.mousePosition;
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        gameObject.transform.SetParent(originalParent);
    }
}


处理手牌的脚本如下;它实例化要在游戏中拖动的卡片。


public class HandManager : MonoBehaviour
{
    // MANAGES GENERAL BEHAVIOURS FOR THE HAND OF CARDS

    public GameObject cardPrefab; // a prefab reference to a card
    public Transform canvas; // a reference to the main UI canvas
    public Hand availableCards; // another scriptable object, which holds a "public List<Card> cards;"

    private void Start()
    {
        foreach (Card card in availableCards.cards)
        {
            SetUpCard(card);
        }
    }

    private void SetUpCard(Card cardData)
    {
        GameObject newCard= Instantiate(cardPrefab, transform); // instantiating new card
        newCard.GetComponent<CardManager>().SetCardData(cardData); // setting the card's data
        newCard.GetComponent<CardDrag>().SetCanvas(canvas);
    }
}


我一直在查找这个错误,并且总是说在尝试更改预制件的父级而不是预制件的 实例 的父级时会出现问题。


我没有看到问题,因为我相信我在 SetUpCard() 函数中正确地实例化了卡片;并且管理拖动的脚本附加到该实例。


有谁知道并且可以向我解释为什么即使CardDrag 附加到预制件,transform 指的是预制件而不是实例?


编辑:这是编辑器中看到的错误堆栈:

Setting the parent of a transform which resides in a Prefab Asset is disabled to prevent data corruption (GameObject: 'Card(Clone)').
UnityEngine.Transform:SetParent(Transform, Boolean)
CardDrag:OnBeginDrag(PointerEventData) (at 
Assets/_Scripts/UI/CardDrag.cs:37)
UnityEngine.EventSystems.EventSystem:Update()

谢谢!

【问题讨论】:

  • 你能发布错误的堆栈跟踪吗?它发生在哪个类和哪个行,这可能会提供有关您的哪些对象使用不正确的线索。
  • @CaTs 用信息编辑了问题。
  • 有人回答但删除了他们的回答...原来错误消息说我的画布是问题所在;确实是这样:出于某种原因,我弄乱了编辑器中的引用...
  • 您确定放入脚本中的公共转换画布是场景中的画布,而不是资产文件夹中的预制件吗?我之所以问,是因为没有 Inspector 的图片来查看您将什么拖到 HandManager 的公共插槽中。

标签: unity3d


【解决方案1】:

尝试更改预制件的父级而不是预制件实例的父级时。

错误信息有点不清楚,这意味着SetParent的参数是预制件的转换,所以这里的参数canvas是一个错误的转换,检查你的代码在方法SetCanvas或参考在HandManager

【讨论】:

    【解决方案2】:

    有人回答但已删除,因此我将再次为将来遇到问题的任何人回答并将问题设置为已回答。

    原来错误消息是说canvas 是问题所在,而且确实我在编辑器中弄乱了引用。

    感谢神秘人!

    【讨论】:

    • 对不起,我不小心点击了删除链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多