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()