UI가 아닌 오브젝트를 클릭해서 이동하는 것을 구현 하고 싶었다.

 

현재 드래그 이동이 아닌 클릭 후 카드를 움직이는 방식으로 구현하였다.

 

public class TestInputController : MonoBehaviour
{
    [SerializeField] private LayerMask cardLayerMask;
    private GameObject cardObject = null;
    private bool isCardSelect = false;

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            //화면 좌표계에 있기에 월드 좌표로 변환
            Vector2 worldPos = Camera.main.ScreenToWorldPoint(Mouse.current.position.ReadValue());
            RaycastHit2D hit = Physics2D.Raycast(worldPos, Vector2.zero, 0f, cardLayerMask);

            if (!isCardSelect && hit.collider != null)
            {
                Debug.Log(hit.transform.name);
                cardObject = hit.collider.gameObject;
                isCardSelect = true;
            }
            else if (isCardSelect)
            {
                cardObject = null;
                isCardSelect = false;
            }
        }

        if (cardObject != null)
        {
            Vector3 pos = Camera.main.ScreenToWorldPoint(Mouse.current.position.ReadValue());
            pos.z = 0;
            cardObject.transform.position = pos;
        }
    }
}

현재 Update() 문으로 구현을 해서 최적화에 좋지 않을것이다. 

1.마우스 클릭 Class를 생성후, event를 등록시켜서 필요할때만 호출 시키는 형식으로 리팩토링이 필요하다. 

2.InputSystem을 활용하여 event로 연동 시킨다.

 

이 두가지 방법 중 하나를 택해서 진행하게 될것같다. 

 

Card Class 안에 IPointerHandler를 상속시켜 쉽게 진행 할 수도 있었겠지만, 

Card에는 카드가 게임에서 사용되는 효과,연출이 담겨 있어야 되고 

Card를 조작하는 것은 InputController에서 담당을 해야 SRP(단일 책임 원칙)을 지킬 수 있을것 같아

이렇게 구현 하였다. 

 

 if (Input.GetMouseButtonDown(0))
        {
            //화면 좌표계에 있기에 월드 좌표로 변환
            Vector2 worldPos = Camera.main.ScreenToWorldPoint(Mouse.current.position.ReadValue());
            RaycastHit2D hit = Physics2D.Raycast(worldPos, Vector2.zero, 0f, cardLayerMask);

이부분은 InputManager 와 InputSystem 둘다 사용 중이기에 하나를 택해서 바꿔서 진행해야 된다. 

 

InputSystem의 현재 마우스 좌표를 반환하는 메서드, 반환값은 Vector2
Layer를 Card로 선언하여 RayCastHit를 이용하여 체크후 이동시킨다.

 

+ Recent posts