【发布时间】: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