修改实例化预制件的父项会引发错误

时间:2019-06-11 00:15:08

标签: unity3d


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


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

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

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);
    }
}


我一直在查找此错误,并且总是说在尝试更改预制的父代而不是预制的 instance 父代时会出现此问题。


但是我没有看到问题,因为我相信我正在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()

谢谢!

2 个答案:

答案 0 :(得分:2)

  

当尝试更改预制实例的父代而不是预制实例的父代时。

错误消息有点含糊,这意味着SetParent的参数是来自预制的转换,因此此处canvas的参数是错误的转换,请检查方法{{ 1}}或SetCanvas中的引用。

答案 1 :(得分:1)

有人回答但被删除了,所以我再次为将来遇到问题的任何人回答,并将问题设置为回答。

原来错误消息是说canvas是问题所在,实际上我已经在编辑器中弄乱了引用。

感谢神秘的人!