마우스를 갖다대면 타워 설명이 나오도록 만들었다.

설명부분이 마음에들진 않아서 어떻게 바꿔야할까 고민중..



설명부분은 텍스트를 입력하기위해 캔버스로 만들었다.

그리고 캔버스의 렌더러모드를 World Space로 바꾸어 게임오브젝트처럼 사용할수 있게 하였다.

(참고 : https://docs.unity3d.com/kr/current/Manual/UICanvas.html)



그렇게 캔버스를 프리팹화하여 onMouseEneter, onMouseExit 함수를 이용해 마우스가 들어오면 active를 켜고

마우스가 나가면 active를 끄는식으로 설정하였다.






타워의 선택은 처음에는 타워의 자식으로 빈오브젝트를 하나 넣어준 후 

콜라이더를 타워크기만큼 잡아주고 onMouseDown함수로 선택되게 하였다.


(이렇게 만들고보니 타워의 콜라이더는 타워크기만큼하고 

자식으로 원을 넣어서 충돌범위를 그렇게 잡을걸 하는 생각이 들더라.)


여튼 그렇게하니 각각의 선택과 해제는 잘되는데 

다른타워를 누르거나 화면밖을 누르면 선택이 꺼지도록 하는게 너무 문제가 되어 선택방식을 바꾸게 되었다.

우선 기존 타워에서 onMouseDown으로 동작하던 선택과 해제부분은 함수로 만들었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void select()
{
    if (isClicked == true)
    {
        isClicked = false;
        myRange.SetActive(false);
        myPopupMenu.SetActive(false);
    }
    else if (isClicked == false)
    {
        isClicked = true;
        myRange.SetActive(true);
        myPopupMenu.SetActive(true);
    }
}
cs



그리고 게임매니저에서 선택된 타워를 관리한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
private GameObject selectedTower = null;
 
void Update () {
    if(Input.GetMouseButtonDown(0))
    {
        ClickDetect();
    }
}
 
private void ClickDetect()
    {
        bool onHit = false;
 
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        // 시작부터 시작+방향까지 선을 그림. 그려지는선의색, 지속시간
        //Debug.DrawRay(ray.origin, ray.direction*100, Color.yellow, 1);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit))
        {
            string HitObj = (hit.transform.gameObject.tag);
            //print(HitObj + "맞음");
            // 맞은애가 타워면
            if (HitObj == "TowerSelect")
            {
                // 선택된타워가 널이아니면 켜져있는애를 끔.
                if (selectedTower != null)
                {
                    selectedTower.GetComponent<TowerClick>().select();
                }
 
                //이름은 selecetedTower인데 사실 towerRange가 들어와있음.
                selectedTower = hit.transform.gameObject;
                selectedTower.GetComponent<TowerClick>().select();
 
                onHit = true;
            }
        }
 
        // 타워가 맞지않았으면(즉 타워말고 다른데를 눌렀으면)
        if(onHit == false)
        {
            // 선택된 타워가 있으면 꺼줌
            if (selectedTower != null)
            {
                selectedTower.GetComponent<TowerClick>().select();
            }
 
            // 선택된 타워는 null로 초기화
            selectedTower = null;
        }
 
        /* Raycast 여러개 체크하려면
        RaycastHit[] allHit = Physics.RaycastAll(ray, 20.0f);
        foreach (RaycastHit hit in allHit)
        {
            // BLAH BLAH 
        }
        */
    }
cs

이후 타워를 선택하는 방법은 Raycast를 이용하기로 하였다.

Ray가 뭐냐면 광선을 쏘는데 Raycast를 이용하면 광선에 맞은 물체를 감지할 수 있다.

(참고 : https://docs.unity3d.com/kr/current/Manual/CameraRays.html)


그렇게 카메라에서 화면을 관통하는 광선을 쏘고 충돌한 오브젝트의 태그를 확인해 타워면

처음에는 selectedTower가 null이므로 변수에 넣어주고 위의 select함수를 실행하여 범위와 팝업창을 켜준다.

이후에 다른 타워를 선택하면 그 타워의 select함수를 실행해 꺼주고 다른타워를 잡고 켜주는식으로 동작한다.


Debug.DrawRay를 쓰면 생성된 광선을 눈으로 확인할수있다.

나머지는 주석 읽어보면 이해가실듯.




실행화면

td_towerselect.mp4


Posted by misty_
,