쫑가 과정

2d 클릭 1) 오브젝트 클릭 본문

Unity2D/구현

2d 클릭 1) 오브젝트 클릭

쫑가 2022. 1. 24. 20:23

원하는 구현

오브젝트를 한번 클릭하면 오브젝트 이름이 나온다.

더블 클릭하면 오브젝트로 확대된다.

주의! 많은 오브젝트를 사용할 거라 각 오브젝트 별 스크립트가 아닌 오브젝트를 만들면 알아서 적용되게 한다.

 

클릭 표시 그리고 이름 띄우기.

레이캐스트2d로 마우스 클릭하면 해당 위치를 가져오고 선택된 표시를 한다.

클릭 위치에 collider가 있다면 오브젝트 이름을 가져와 오브젝트 밑에 보이게 한다.

 

1. 마우스 클릭 좌표.

    void MouseClickDown()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Vector2 worldPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            hit = Physics2D.Raycast(worldPoint, Vector2.zero);

            BoolOnonSelected();   
        }
    }

마우스 좌 클릭시 해당 위치 RaycastHit2D 정보를 가져온다.

 

2. 클릭 위치 오브젝트 감지.

    void BoolOnonSelected()
    {
        if (hit.collider != null)
        {
            //Vector2 targetPosition = GameObject.Find($"{hit.collider.name}").transform.position;
            targetPosition = hit.transform.position;
            
            InstantiateSelectRing();
        }
        else
        {
            onSelected = false;
            Destroy(GameObject.FindGameObjectWithTag("SelectedRing"));
            nameBox.SetActive(false);
        }
        
    }

RaycasHit2D 정보에 collider가 있다면 해당 오브젝트 위치를 받아온다.

없다면 선택됨을 취소하고 선택 표시를 파괴, 이름을 안 보이게 한다.

 

3. 선택 표시하기.

    void InstantiateSelectRing()
    {
        if (!onSelected && !GameObject.FindGameObjectWithTag("SelectedRing"))
        {
            onSelected = true;
            nameBox.SetActive(true);
            Instantiate(seletedRingPrefabs, targetPosition, transform.rotation);
        }
        else if (onSelected && GameObject.FindGameObjectWithTag("SelectedRing"))
        {
            GameObject.FindGameObjectWithTag("SelectedRing").transform.position = targetPosition;
        }
    }

만약 선택됨이 false고 선택표시 태그를 가진 오브젝트를 찾을 수 없다면(아무 오브젝트도 클릭되지 않음)

선택됨을 키고, 이름 UI를 보이게 하고, 선택 표시 오브젝트를 복제 생성한다.

 

선택됨이 true고 선택 표시 태그 오브젝트가 존재한다면 (오브젝트가 클릭된 상태에서 다른 오브젝트 클릭)

태그 오브젝트의 위치를 마우스 클릭된 오브젝트 위치로 바꾼다.

 

4. 이름 UI 위치

void UIName()
    {
        nameText.text = hit.collider.name;
        rectTransform.position = Camera.main.WorldToScreenPoint(targetPosition) - new Vector3(0, 60);
    }

텍스트를 클릭된 오브젝트 이름으로 변경,

UI 위치를 클릭된 위치를 기준으로 원하는 위치로 변경.

 

플레이어 오브젝트, 노트북 오브젝트

Name UI - Button - TextMeshpro로 생성 (prefab 된 것은 무시해도 됨)

선택 표시 오브젝트를 복제할 것이므로 prefab 한다.

사실 복제를 사용 안 해도 됨. 숨기고 나타나기 기능해도 될 듯.

(처음에 여러 가지 한 번에 선택 가능하게 하려고 했기에 복제를 선택)

 

사용한 변수들

bool onSelected;
Camera mainCamera;
RectTransform rectTransform;
Vector2 targetPosition;
RaycastHit2D hit;
    
[SerializeField] GameObject seletedRingPrefabs;
[SerializeField] GameObject nameBox;
[SerializeField] TextMeshProUGUI nameText;

 

'Unity2D > 구현' 카테고리의 다른 글

2D sorting / 2d 오브젝트 렌더러 우선순위 정하기.  (1) 2022.02.16
적 AI. 플레이어 따라가기.  (0) 2022.02.03
2d 클릭 2) 더블 클릭  (0) 2022.01.26
Comments