ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 내일배움캠프 81일차 TIL - 최종 프로젝트 개발 마무리 1
    TIL/Unity 2024. 8. 9. 23:28

     

    [한 줄 요약]

    조이스틱과 로딩 관련 리팩토링을 진행하였다.


    [학습 내용]

    최종 프로젝트 개발 마무리


    조이스틱 리팩토링

    다중 터치 버그 수정


    !! 문제 발생 !!

     

    * 내용

    다중 터치를 인식하지 못해서 조이스틱을 터치한 채 몬스터를 타겟할 수 없는 상황을 인지하였다. 움직이면서 공격을 진행하지 못하는 것은 유저 경험을 크게 떨어뜨릴 수 있기에 수정을 진행하였다.

     

    * 탐색

    먼저 InputAction을 점검해보았다. 유니티 공식문서를 참고하니, 다중 터치를 사용하기 위해서는 Action Type을 Pass Through로 변경해야 한다는 부분을 찾을 수 있었다. 링크

    공식 문서 중

     

    그래서 기존 Button으로 되어있던 Action Type을 PassThrough의 Button으로 변경하였다.

    변경 후 Action Type

     

    그리고 Input.touches를 사용하면 현재 프레임에 입력된 모든 터치에 대한 처리가 가능해지기 때문에 이것을 반복문으로 처리해주었다.

     

    그랬더니 다중 터치는 잘 작동하게 된 거 같은데, UI를 터치하면 이전에 잡아놓은 타겟이 풀린 후 UI의 기능이 동작하는 현상이 발견되었다.

    처음에는 위의 과정이 잘못된 줄 알고 한참을 해멨다. Action Type이 Button일 때는 UI가 정상작동하기 때문에 위의 과정을 계속 복기했다.

    그러던 중 로그를 여러 군데 찍어보자, 터치의 페이즈가 began, moved, ended 3가지로 나뉜다는 것을 알게 되었다. 그런데 그 중에 began 단계에서 UI를 터치했는지 검사하는 기능을 가진 IsPointerOverGameObject 메서드가 동작하지 않는 것을 알게 되었다. 그래서 UI를 터치했을 때 처음에 began 단계에서 UI임을 인식 못하고 맨 바닥을 클릭한 것으로 인식하여 타겟이 풀리게 된 것이다. 하필 UI 버튼도 눌렀다가 뗄 때 기능이 작동하기 때문에 타겟이 풀린 뒤 기능을 실행하려고 한 것이다.

     

    * 해결

    그래서 3가지 단계를 나누어 began 단계에서는 터치 위치를 잡는 기능을 배분하고, UI 검사와 레이캐스팅은 마지막 ended에서 하도록 하였다. 그렇게 하면 IsPointerOverGameObject가 잘 작동하고, 터치 위치는 처음 누르기 시작한 위치 기준이기 때문에 유저 경험도 떨어뜨리지 않을 것이다. 마지막으로 기능을 확인해보니 잘 작동하였다.

    if (Input.touchCount > 0)
    {
        for (int i = 0; i < Input.touches.Length; i++)
        {
            // 터치 시작 시 터치 위치 저장
            if (Input.touches[i].phase == UnityEngine.TouchPhase.Began)
            {
                pointerPos = _camera.ScreenToWorldPoint(Input.touches[i].position);
                pointerPosList.Add(pointerPos);
            }
            // 터치 종료 시 UI를 눌렀는지 검사
            if (Input.touches[i].phase == UnityEngine.TouchPhase.Ended)
            {
                if (EventSystem.current.IsPointerOverGameObject(Input.touches[i].fingerId))
                {
                    uiTouched = true;
                    continue;
                }
                // 터치 위치에서 타겟 찾기
                FindTarget();
            }
        }
    }

     

    자동 타겟팅

    아무리 모바일 환경이라도, 몬스터를 직접 터치하여 타겟을 잡는 것은 호불호가 크게 갈릴 것으로 예상이 되었다. 그래서 타겟이 잡혀있지 않을 때 공격 관련 UI를 터치하면 범위 내의 적을 자동으로 타겟팅 하도록 구현하였다.

    자동 타겟 대상을 가장 가까운 적으로 구현할까 하였으나, 그렇게 되면 이동하면서 공격 UI만 누르는 등의 방법을 통해 조작 난이도가 너무 쉬워질 거 같다는 판단이 들었다. 그래서 어느 정도 랜덤성을 가지고 최고의 효율로만 공격하지는 못하도록 하였다. 최고의 효율을 가지려면 유저가 직접 타겟을 정하는 수고로움을 어느 정도 감내하도록 하였다.

    자동 타겟팅

     

     

    로딩 리팩토링

    재화 저장

    골드와 크리스탈 등의 재화를 저장하는 기능을 추가하였다.

    이를 진행하면서 코드도 조금 개선하였다. 기존에는 게임 매니저가 재화 정보를 들고 있었고, 재화 관련 UI에서 모든 기능을 수행하였다. 이를 분리하여 재화 매니저를 만들고, 여기에 재화 정보를 담고, 재화 관련 기능을 옮겨 담았다. 그리고 UI에서는 단순히 UI 기능만 수행하도록 구현하였다.

     


    [회고]

    아직 고쳐야 할 부분이 많다. 그래도 큰 산은 몇 개 넘어간 거 같아 다행이다.