在开始之前,我已经环顾四周,因为这似乎是一个常见错误,并且有据可查。我知道尝试修改预制件的转换时会发生错误。我不认为我正在这样做。
我在预制对象上附加了以下脚本-这是用于打牌的纸牌。脚本是拖放卡。
只要在我玩游戏之前实例化卡,它就可以很好地工作;如果我在游戏中实例化它并尝试移动它,则会收到以下错误:
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()
谢谢!
答案 0 :(得分:2)
当尝试更改预制实例的父代而不是预制实例的父代时。
错误消息有点含糊,这意味着SetParent
的参数是来自预制的转换,因此此处canvas
的参数是错误的转换,请检查方法{{ 1}}或SetCanvas
中的引用。
答案 1 :(得分:1)
有人回答但被删除了,所以我再次为将来遇到问题的任何人回答,并将问题设置为回答。
原来错误消息是说canvas
是问题所在,实际上我已经在编辑器中弄乱了引用。
感谢神秘的人!