본문 바로가기

유니티/Hunting게임[2D]

2D 미니게임 만들기 연습 2 ] 클릭시 반응하는 물체 만들기

앞서 마우스 커서를 새로 만들었다.

 

이제 마우스로 클릭했을 때, 반응하는 물체들을 만들어 보도록 하자

 


 

1. 대상 클릭 시 반응하는 물체 생성

 

우선 Circle을 만들어 준다.

1. 대상 물체 생성

오른쪽 Inspector에 Rigidbody2D와 Circle Collider2D 컴포넌트를 추가 해 주고, 테스트를 위해 중력의 영향을 받지 않게 설정 해 준다.

(RigidBody2D - Body Type - Kinematic 으로 설정)

 

그리고 우리는 모든 물체가 마우스 클릭 시 반응을 하게 만들 것이 아니고, 특정 물체를 클릭했을 때만 반응이 와야 하기에 레이어를 하나 생성 해 준다.

 

2. 레이어 생성

11번 레이어에 Touchable이라는 이름의 레이어를 생성 해 준다.

 

그리고 1번 포스팅에서 적어 놓았던 MousePointer.cs 코드에 RayCast를 이용하여 클릭 여부를 알 수 있게 하는 부분(이곳을 참고하였음)을 추가 해 주면 아래와 같은 코드가 나오게 된다. (Update 부분만 가져왔다)

 

void Update()
    {
        mousePos = Input.mousePosition;
        mousePos = UnityEngine.Camera.main.ScreenToWorldPoint(mousePos);
        pointerRed.transform.position = mousePos;
        Ray2D ray = new Ray2D(mousePos, Vector2.zero); // 원점 ~ 포인터

        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log(mousePos);

            float distance = Mathf.Infinity; // Ray 내에서 감지할 최대 거리

            RaycastHit2D hitDrawer = Physics2D.Raycast(ray.origin, ray.direction, distance, 1 << LayerMask.NameToLayer("Touchable")); // Touchable 레이어만 잡는다.

            if (hitDrawer)
            {
                Debug.Log("터치!");
                Debug.Log(1 << LayerMask.NameToLayer("Touchable"));
                Debug.Log(LayerMask.NameToLayer("Touchable"));
            }

        }

    }

코드에 대한 설명은 아래 부분을 펼쳐 보면 된다.

 

더보기

Update에 있는 첫 3줄은 1번 포스팅과 같기에 설명을 건너뛰겠다.

 

4번째 줄에는 Ray2D로 레이저를 쏘게 된다고 생각하면 되고 (쏘게 될 방향, 레이저 시작 지점)의 Parameter를 가진다.

Ray2D에 대한 더 자세한 내용은 여기를 참고하면 된다.

 

레이를 설정 하였으면 이제 마우스 클릭이 일어났을 때, Ray 내에서 감지 할 최대 거리를 float 변수로 미리 만들어 주게 된다. (무한으로 설정하였다)

 

이제 Raycast를 설정 해 준다. 시작 지점, 방향, 거리, 인식 할 레이어를 설정 해 준다.

 

여기서 인식 할 레이어 부분에서는 비트 연산자가 사용되었다.

 

1 << LayerMask.NameToLayer("Touchable") ---- ⓐ

 

왜냐하면 레이어는 레이어의 번호 그대로 사용하는 것이 아니기 때문이다. (참고한 사이트)

 

2에서 레이어 번호만큼의 제곱을 해 준 수를 사용한다.

(ex - 11번 레이어 → 2^11 = 2048)

 

따라서 는 00000000001에서 왼쪽으로 비트연산자를 LayerMask.NameToLayer("Touchable") 만큼 이동시키라는 의미이며, LayerMask.NameToLayer("Touchable") 여기서는 레이어의 번호가 나오게 된다.

 

즉, 대신에 2048을 넣어도 작동하게 됨을 볼 수 있다.

 

아무튼 해당 레이어에 속하는 물체를 마우스로 클릭했을 때, hitDrawer는 true가 되게 되며 조건문 속에 세부적인 행동을 설정할 수 있게 된다. 이 것에 대한 것은 점수, 애니메이션 등과 연계하여 사용 될 예정이다.

 

 

3. 해당 물체 클릭 시 나오는 문구

 

이제 마우스로 해당 물체를 클릭 해 보면 위 사진과 같이 Log가 나오게 됨을 볼 수 있다.

 

그런데 마우스로 가만히 있는 물체를 클릭하는 것은 너무 재미가 없다. 따라서 역동적인 움직임을 다음 포스팅에서 만들어 보도록 하겠다.