본문 바로가기

TIL

[TIL]2024-3-11 / 53일차 - 최종 프로젝트 2주차 1일차

 

 

그래픽 세팅 옵션

 

오늘은 알고리즘 코드카타를 풀지 못했다...

 

1. 오늘의 기술 면접 문답 - struct와 class를 비교해서 설명해주세요.

답안: 

Struct와 Class는 우선 형태(Type)의 차이가 있다. Struct는 값 타입이고 Class는 참조 타입이다. 
Struct는 값(Value) 그 자체를 가지고 있으며, 변수에 값이 할당될 때 복사되어 메모리에서 스택에 저장됩니다.
Class는 객체의 참조(Reference)가 변수에 할당되며, 변수가 실제 객체가 저장된 메모리 주소를 가리키는 방식으로 메모리에서는 힙(Heap)에 저장됩니다.
그렇기에 Struct는 복사된 각 값이 서로 독립적이어서 변경되어도 다른 변수에 영향을 주지 않지만, 
Class는 같은 객체를 참조하는 여러 변수가 있을 시 하나를 변경하면 다른 변수도 변경됩니다.

 


2. 오늘의 작업 - 그래픽 옵션

 

오늘은 저번 금요일에 튜터님에게 피드백 받은 부분들을 수정하고

추가적인 UI 작업을 하던 중 팀원에게 그래픽 옵션을 만들어 달라는 요청을 받아 작업에 들어갔다.

 

그래픽 옵션에는 전체 화면 설정 / 수직 동기화 설정 / 해상도 설정이 들어가기로 했다.

 

앞에 둘은 단순히 체크 박스 형태로 했으나 해상도 설정에서 좀 더 기능을 추가한 것이,

우선 보기 좋게 드롭다운 형태로 만들었다

 

 

그리고 해상도와 RefreshRate에서 모든 옵션이 뜨는 것이 많이 거추장스러워서

다른 강좌를 찾아보고 그 중에서 유저에게 호환되는 옵션만 뜨도록 하는 방법에 대해 알려주는 강의가 있어 그것을 참고하였다.

private void Start()
    {
        _resolutions = Screen.resolutions;
        _filteredResolutions = new List<Resolution>();
        
        _resolutionDropDown.ClearOptions();
        _currentRefreshRateRatio = Screen.currentResolution.refreshRateRatio;

        for (int i = 0; i < _resolutions.Length; i++)
        {
            if (_resolutions[i].refreshRateRatio.Equals(_currentRefreshRateRatio))
            {
                _filteredResolutions.Add(_resolutions[i]);
            }
        }

        List<string> options = new List<string>();
        for (int i = 0; i < _filteredResolutions.Count; i++)
        {
            string _resolutionOption = _filteredResolutions[i].width + _x + _filteredResolutions[i].height + _comma +
                                       _filteredResolutions[i].refreshRateRatio + _Hz;
            options.Add(_resolutionOption);
            if (_filteredResolutions[i].width == Screen.width && _filteredResolutions[i].height == Screen.height)
            {
                _currentResolutionIndex = i;
            }
        }
        
        _resolutionDropDown.AddOptions(options);
        _resolutionDropDown.value = _currentResolutionIndex;
        _resolutionDropDown.RefreshShownValue();
    }

    public void SetResolution(int resolutionIndex)
    {
        Resolution resolution = _filteredResolutions[resolutionIndex];
        Screen.SetResolution(resolution.width, resolution.height, true);
    }

 

현재 사용자의 RefreshRate에 맞는 해상도 옵션만 저장되는 리스트를 만들어 이것으로 드롭다운 메뉴에 추가해주는 방식이다.

 

그리고 그래픽 탭이 생김에 따라 메인메뉴 상태에서는 게임옵션 창이 텅 비어버리는데

이 부분은 안내문을 추가하기로 했다.

 

 

 

Screen에 대한 변경 정보나 QualitySettings를 건드리는 부분은 게임을 꺼도 저장되는 모습을 보고 따로 이를 저장하는 메소드는 만들지 않아도 되었다.

 

 

빌드에서 작동하는 모습

 


 

이를 만들면서 트러블 슈팅으로

 

 

드롭다운을 이용할 때에 레이케스트가 막히는 문제 발생 → 이를 위해 캔버스로 소트 오더와 레이케스트를 달아주었더니

위와 같이 잘 보이게 되었으나

 

실제 씬의 플레이로 가게 되니

이런 식으로 드롭다운 부분을 누르는 순간 해당 부분만이 랜더링 되는 문제가 발생

 

 

검색을 통해서도 정확한 원인은 알 수 없으나

다른 자식들의 캔버스를 모두 없애고 부모 캔버스의 소트 오더를 0에서 높이면 해결되었다. 처음 문제되었던 소트 오더 방법은 드롭다운 그래픽 옵션 메뉴의 레이아웃 그룹에서 Reverse Arrange로 순서 문제는 해결되었다.

 

 

부모가 자식 캔버스의 소트 오더보다 낮거나 높은 것이 상관이 있던 것이 아닌

오직 소트 오더가 0일 때에만 발생하는 문제로, 드롭다운이 생성될 때 생겨나는 블로커 오브젝트가 문제의 원인으로 추측될 뿐 정확한 원인은 모르게 해결되었다.

 


 

또한 끄기 직전에 버그를 발견했는데 창 모드 상태에서 해상도를 바꿀 시에는 전체 화면으로 돌아가는 버그를 발견하였다.

내일 해결해야 할 것 같다.