Unity3d 修改实例化预置的父级会引发错误

Unity3d 修改实例化预置的父级会引发错误,unity3d,Unity3d,在做任何事情之前,我已经环顾了四周,因为这似乎是一个常见的错误,并且有很好的文档记录。我知道当试图修改预设的转换时会发生错误。我不认为我在做那件事 我有以下脚本附加到一个预制对象-这是一个纸牌游戏卡。脚本是拖放卡 只要在我玩游戏之前对卡进行实例化,它就工作得很好;如果我在游戏中实例化它并尝试移动它,我会得到以下错误: 设置驻留在预制资源中的转换的父级将被禁用,以防止数据损坏 处理手中卡片的脚本如下:;它实例化了要在游戏中拖动的卡 谢谢 尝试更改预置的父对象而不是预置实例的父对象时 错误消


在做任何事情之前,我已经环顾了四周,因为这似乎是一个常见的错误,并且有很好的文档记录。我知道当试图修改预设的转换时会发生错误。我不认为我在做那件事


我有以下脚本附加到一个预制对象-这是一个纸牌游戏卡。脚本是拖放卡

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

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



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


谢谢

尝试更改预置的父对象而不是预置实例的父对象时


错误消息有点不一致,这意味着
SetParent
的参数是来自预置的转换,因此这里的参数
canvas
是错误的转换,请检查方法
SetCanvas
上的代码或
HandManager
中的引用,有人回答了,但删除了,因此,我再次为将来遇到我问题的任何人回答,并将问题设置为已回答

原来错误消息是说
canvas
是问题所在,事实上我把编辑器中的引用搞乱了


谢谢神秘人

您可以发布错误的堆栈跟踪吗?它出现在哪一类和哪一行,这可能会提供关于哪些对象被错误使用的线索。@CaTs用这些信息编辑了问题。有人回答了,但删除了他们的答案。。。结果显示错误消息说问题出在我的画布上;确实是这样的:出于某种原因,我把编辑器中的引用弄乱了……你确定你放入脚本中的公共变换画布是场景中的画布,而不是资产文件夹中的预制画布吗?我这样问是因为没有检查员的照片,无法看到您将什么拖到了HandManager的公共插槽中。对不起,我无意中单击了删除链接。
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);
    }
}
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()