설명: 인터페이스에 드래그앤 드롭으로 구현을 해보았다.
1. IBeginDragHandler > 드래그를 시작할 때 실행이 된다.
2. IEndDragHandler > 드래그가 끝날 때 실행이 된다.
3. IDragHandler > 드래그가 진행되는 동안 실행이 계속 된다.
4. IDropHandler > 마우스 클릭이 아닌 놓았을 때 실행된다.
진행 순서: IBeginDragHandler > IDropHandler > IEndDragHandler
보면 Drop 이후 드래그End가 실행이 되므로 헷갈리지 않도록 조심해야한다.
설명:
플레이어의 이동을 Rigidbody에서 velocity로 이동을 했을 때 다른 충돌체 오브젝트에 Rigidbody가 컴포넌트가 되어있고 Constraints의 Freeze가 체크되어있으면 충돌할 때 오브젝트가 밀려야하는데 Freeze가 체크되어 있어서 역으로 플레이어가 밀려나는 상태가 일어남
// 드래그 시작
public void OnBeginDrag(PointerEventData eventData)
{
Debug.Log("드래그 시작");
// 아이템 정보 플레이어한테 전달
GameManager.Instance.Player.currentData = this.data;
GameManager.Instance.Player.dataQuantity = slotQuantity;
GameManager.Instance.Player.dataDelayTime = delayTime;
}
// 드래그 끝났을 때
public void OnEndDrag(PointerEventData eventData)
{
Debug.Log("드래그 끝");
data = GameManager.Instance.Player.currentData;
slotQuantity = GameManager.Instance.Player.dataQuantity;
delayTime = GameManager.Instance.Player.dataDelayTime;
DelayCheck();
Set();
}
// 드래그 중
public void OnDrag(PointerEventData eventData)
{
// 해당 아이템 아이콘의 위치를 마우스 위치와 동일하게
}
// 이동할 슬롯의 정보
public void OnDrop(PointerEventData eventData)
{
Debug.Log("아이템 드랍");
// 플레이어의 currentData가 있는지 확인
if (GameManager.Instance.Player.currentData == null) return;
// 아이템의 정보가 같은지 확인
if (GameManager.Instance.Player.currentData == this.data)
{
// 후 개수 확인
if (GameManager.Instance.Player.dataQuantity + this.slotQuantity < this.data.maxCount)
{
// 개수를 추가할 수 있으면 개수 추가
this.slotQuantity += GameManager.Instance.Player.dataQuantity;
GameManager.Instance.Player.ItemClear();
}
}
// 드롭한 장소에 데이터가 없다면
else if (data == null)
{
data = GameManager.Instance.Player.currentData;
slotQuantity = GameManager.Instance.Player.dataQuantity;
delayTime = GameManager.Instance.Player.dataDelayTime;
GameManager.Instance.Player.ItemClear();
}
// 아이템의 정보가 다르면 위치 변경
else
{
ItemData cloneData = data;
int cloneInt = slotQuantity;
float cloneDelayTime = delayTime;
data = GameManager.Instance.Player.currentData;
slotQuantity = GameManager.Instance.Player.dataQuantity;
delayTime = GameManager.Instance.Player.dataDelayTime;
GameManager.Instance.Player.currentData = cloneData;
GameManager.Instance.Player.dataQuantity = cloneInt;
GameManager.Instance.Player.dataDelayTime = cloneDelayTime;
}
DelayCheck();
Set();
}
설명:
드래그 시작: 드래그 시작한 슬롯의 Item정보를 플레이어의 Item정보에 값을 넣어준다.
드랍: 플레이어 Item정보를 현재 드랍할 슬롯의 Item에 추가하고 해당 슬롯의 Item을 플레이어의 Item정보로 값을 변경해준다.
드래그 끝: 값을 변경했으므로 처음 드래그 시작한 Item슬롯에 플레이어의 Item로 변경해준다.
1.
1. 없음
1. 없음