카드를 새로 뽑거나, 특정한 이벤트에 의해 카드가 패로 들어오는 경우가 생길 수도 있다. 그런 경우 손패에 쉽게 카드를 추가하기 위해 코드를 추가해줬다.
public class HandCardGroup
{
//~변수들~
public void AddCard(DraggableUIObject drag)
{
if (!cards.Contains(drag))
{
cards.Add(drag);
}
if (cards.Count > GetActiveChildCount())
{
if (offSlots.Count > 0)
{
offSlots[0].gameObject.SetActive(true);
offSlots.RemoveAt(0);
}
else
{
GameObject newSlot = Instantiate(cardSlotPrefab, transform);
}
cardSlots = transform.GetComponentsInChildren<CardSlot>();
}
for (int i = 0; i < cardSlots.Length; i++)
{
if (cardSlots[i].isEmpty)
{
drag.transform.SetParent(cardSlots[i].transform);
drag.SetLocalPosZero();
break;
}
}
}
}
카드의 이벤트는 모두 매니저로 옮겨줬으니 카드슬롯매니저에서 DrawNewCard()
라는 코드를 만들어 호출하면 손패에 카드가 추가되고, 카드에 이벤트도 연결해주면 된다.
public class CardSlotManager
{
[SerializeField] private HandCardGroup handCardGroup;
[SerializeField] private PlayCardGroup playCardGroup;
public void DrawNewCard(DraggableUIObject drag)
{
handCardGroup.AddCard(drag);
drag.pointerDownAction += OnCardPointerDown;
drag.pointerUpAction += OnCardPointerUp;
}
}
그리고 외부에서 호출을 해주면!
public class Test : MonoBehaviour
{
public CardSlotManager hand;
public GameObject cardPrefab;
private void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
DraggableUIObject drag = Instantiate(cardPrefab).GetComponent<DraggableUIObject>();
hand.DrawNewCard(drag);
}
}
}
으악 이게 무슨일이야
사실 간단하게 해결이 가능한 오류긴 함. 외부에서 새로운 게임오브젝트를 Instantiate
해서 UI로 끌어오는 방식을 사용했는데, 이러면 생성시에 월드좌표를 가지고 있기 때문에 부모를 UI의 오브젝트로 변경한 시점에 기대한 것과 스케일, 위치, 회전등이 달라지게 된다. 그래서 유니티 Transform
은 worldPositionStays
라는 bool 값을 가지고있음. 부모가 변경될 때 월드좌표를 유지할 것인지, 로컬 좌표를 유지할 것인지를 결정해주는 변수인데, 부모를 설정해줄 때 parent
뒤에 간단한 bool값 하나 추가로 쉽게 조정이 가능하다. 보통 UI오브젝트는 localScale
로 조정을 하는 경우가 많으니 꼭 false로 변경해주도록 하자.
drag.transform.SetParent(cardSlots[i].transform, false);
이제야 잘 돌아가는구먼.