Unity: Drag핸들러와 Drop, Rigidbody의 Constraints의 Freeze

이재형·2024년 5월 31일
0
post-thumbnail
post-custom-banner

Unity 공부

배운 내용

1. Drag핸들러와 Drop

설명: 인터페이스에 드래그앤 드롭으로 구현을 해보았다.
1. IBeginDragHandler > 드래그를 시작할 때 실행이 된다.
2. IEndDragHandler > 드래그가 끝날 때 실행이 된다.
3. IDragHandler > 드래그가 진행되는 동안 실행이 계속 된다.
4. IDropHandler > 마우스 클릭이 아닌 놓았을 때 실행된다.
진행 순서: IBeginDragHandler > IDropHandler > IEndDragHandler
보면 Drop 이후 드래그End가 실행이 되므로 헷갈리지 않도록 조심해야한다.


2. Rigidbody의 Constraints의 Freeze Position

사진: 충돌체의 움직임을 고정시킨 사진

설명:
플레이어의 이동을 Rigidbody에서 velocity로 이동을 했을 때 다른 충돌체 오브젝트에 Rigidbody가 컴포넌트가 되어있고 Constraints의 Freeze가 체크되어있으면 충돌할 때 오브젝트가 밀려야하는데 Freeze가 체크되어 있어서 역으로 플레이어가 밀려나는 상태가 일어남


프로젝트 개발

진행 사항

1. 인벤토리 내 아이템(드래그 앤 드롭) 이동

// 드래그 시작
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. 없음

profile
한국사람
post-custom-banner

0개의 댓글