Profile

대혐수의 뒷동산

대혐수

[유니티] 주먹구구 탐정게임 만들기 - 아이템 끌기 기능 만들기.

 

  NGUI -> UGUI 변환 작업 계속...

 

  이번에 할 것은 인벤토리 만들기인데, 그 중 드래그 앤 드롭 기능 작업을 해야 한다.

 

  NGUI때에는 OnPress()를 사용했는데 UGUI로 바꾸고 나니 OnPress()가 작동하지 않았다. 그래서

 

void OnPress(bool itsPressed)
    {
       
        if (itsPressed)
        {
            Invoke("ItemPicking", 1.0f); //프레스 상태가 1초간 유지되면 유지되면 템집기           
        }
        else
        {
            CentralHub.Instance.InventoryManager.pickedItem.gameObject.SetActive(false);
            CentralHub.Instance.InventoryManager.itemRelease = true; //아이템 내려놓은 것으로 처리
        }

    }

  위와 같이 했던 것을

 

public void OnPointerDown(PointerEventData eventData)
    {
        Debug.Log("아이템누질러짐");
        Invoke("ItemPicking", 1.0f); //프레스 상태가 1초간 유지되면 유지되면 템집기           
    }


    public void OnPointerUp(PointerEventData eventData)
    {
        Debug.Log("내려놓");
        CentralHub.Instance.InventoryManager.pickedItem.gameObject.SetActive(false);
        CentralHub.Instance.InventoryManager.itemRelease = true; //아이템 내려놓은 것으로 처리
    }

 

  이렇게 고쳤다. 디버그.로그 메시지가 뜨는 걸 보면 눌리고 떼지는 건 되고 있다.

  그리고 눌렸을 때 Invoke하는 ItemPicking()이 뭐냐면, "붙들린" 아이템 이미지(pickedItem)를 setactivate하고 그 이미지의 좌표를 커서 좌표로 업데이트 해주는 것이다.

 

  (보충설명드리면, 이 탐정게임의 아이템 드래그드롭은 인벤토리의 아이템을 옮겨놓는 게 아니라, 그 복사본을 전달하는 식임)

 

  그런데 이게 작동을 안 함. 내 생각에 ItemPicking()에서 수행하는 내용을 Update()에서 처리해주면 될 거 같다(OnPress시절에는 그렇게 안 해도 되길래 그냥 Update에서 안 했음.)

 

  그래서 아이템이 눌렸을 때 "아이템을 잡음" 상태를 true로 바꿔주는 bool변수를 만들고, pickedItem이 활성화되면서 커서 좌표를 계속 제공해줄 수 있도록 해보겠다.

 

(해봤음)

 

  일단 업데이트는 되고, pickedItem이 커서 움직임을 따라 움찔움찔거리기는 하는데 계속 구석에만 처박혀있다.

  내생각엔 또 좌표계 문제인 거 같다 (으휴..)

 

(공부해봄)

  몇가지로 시도해봤는데, 그나마 제일 근접(?)했던 것이 pickedItem에 좌표를 부여하는 코드를

 

......pickedItem.transform.position = mousePos;

 

에서

 

......pickedItem.transform.localPosition = mousePos;

 

  로 바꾼 거였는데, 일단 화면 가운데에 pickedItem이 생기긴 하지만 마우스를 움직일 때 찔끔찔끔만 따라가는 현상이 나왔다.

  DEV Korea에 정확이 내 문제와 똑같은 게 있어서(링크) 확인해보니 범인은

 

Camera.main.ScreenToWorldPoint(new Vector2(Input.mousePosition.x, Input.mousePosition.y));

  이녀석이었다. 질문글에 달린 답변 덧글을 거칠게 요약하자면, 위 코드는 3D용이어서 2D와는 서로 사맛디 아니하여 그렇다는 것 같다. 답글이 일러준 대로

 

  mousePos = Input.mousePosition;

 

  이거로 바꿨더니 그냥 해결. 정말 소중한 데브코리아..

  그런데 NGUI시절에는

 

Camera.main.ScreenToWorldPoint(new Vector2(Input.mousePosition.x, Input.mousePosition.y));

 

  이걸로 됐었단 말이지 =_=;;; 지금 안 되는 건 이해가 간다 쳐도 그때 된 건 이해가 안 가네...

 

  아무튼 이번에도 별것도 아닌 일에 삽질하며 시간을 거하게 날렸으니 어서 다음 작업으로..