본문 바로가기

TIL

[TIL]2024-4-12 / 69일차 - 최종 프로젝트 6주차 5일차


1.오늘의 알고리즘 코드카타 - 성격 유형 검사하기

 

답안 :

 

// 처음엔 switch문을 이용해 케이스를 정해야 하나 생각하며 풀어갔지만
// 내용이 많이 거칠어져서 보기에도 구조적으로도 별로인 것 같아
// 인터넷을 찾아보다 더 깔끔하고 정리가 잘된 내용을 발견하여 이를 기반으로 정리

// 문제 키워드 =
// 4가지 지표, 각 2개의 유형 존재, 총 16개 성격유형
// 검사 선택지 7개, 1가지 지표
// 질문에 따라 같은 답변이 네오와 어피치형으로 바뀔 수 있다
// 유형점수가 같으면 사전 순으로 빠른 것
// survey : 4가지 지표 2개 유형 문자열 배열, choices : 각 질문별 선택한 선택지 정수 배열
// 검사자의 결과 지표번호 순서대로 리턴
        
public class Solution
{
    public string solution(string[] survey, int[] choices)
    {
        string answer = "";
        string[,] keys = new string[4, 2]
        {
            // 4가지 지표 2가지 유형 초기화
            {"R", "T" }, {"C", "F" }, {"J","M"}, {"A","N"}
        };
        int[,] values = new int[4, 2];

        for (int i = 0; i < survey.Length; i++)
        {
            string sSurvey = "";
            int choice = 0;

            if (choices[i] > 4) // 선택지가 동의쪽이면
            {
                sSurvey = survey[i][1].ToString(); //survey의 두번째 캐릭터를 sServey에 저장
                choice = (-1) * (4 - choices[i]); // choice에 양수(1,2,3 중 하나)를 저장
            }
            else // 비동의 쪽이면
            {
                sSurvey = survey[i][0].ToString(); // survey의 첫번째 캐릭터를 sServey에 저장
                choice = 4 - choices[i]; // choice에 양수(0,1,2,3 중 하나)를 저장
            }
            
            for (int j = 0; j < 4; j++) // 첫번째 인덱스
            {
                for (int k = 0; k < 2; k++) // 두번째 인덱스
                {
                    if (keys[j, k] == sSurvey) // key배열의 요소와 sServey에 들어온 캐릭터가 일치하면
                    {
                        values[j, k] += choice; // 해당 인덱스 value배열 위치에 choice값 추가 
                    }
                }
            }
        }

        for (int i = 0; i < 4; i++) // 주어진 점수를 가지고 구성하기
        {
            if (values[i, 0] >= values[i, 1]) // value배열의 첫번째 캐릭터의 값이 두번째보다 크면
                answer += keys[i, 0]; // 정답에 키값에 첫번째 캐릭터 추가
            else if (values[i, 0] < values[i, 1]) // 작으면
                answer += keys[i, 1]; // 두번째 캐릭터 추가
        }
        return answer;
    }
}

 


2. 오늘의 기술면접 질문 - 디자인 패턴(Singleton, Observer 등) 사용하는 이유는 무엇인가요?

    꼬리질문 - 프로젝트에 디자인패턴을 적용해 본 경험이 있나요? 왜 그 디자인패턴을 선택해서 구현하였나요?

             꼬리질문 - Unity를 사용하면서 경험해볼 수 있는 대표적인 디자인패턴이 무엇인지 설명해주세요.

 

디자인 패턴이란? - 객체지향 프로그래밍 설계를 할 때 발생하는 문제를 예방하기 위한 설계 패턴

디자인 패턴 사용 이유 - 유지보수와 문서화의 용이함, 클래스의 명세 정확도, 객차 간 상호작용 또는 설계 의도를 정의하도록 도와주기 때문이고 여러 사람들이 동시에 개발을 해야 할 때 생길 수 있는 설계 해석의 차이도 해당 패턴을 통해 통일하기 용이함이 있어 이러한 문제들을 겪고 미리 예방하도록 만들어 놓은 코딩 방법론이다.

디자인 패턴 주의점 - 알고리즘이 아닌 상황에 따른 설계 방법, 즉 방법론이기 때문에 디자인 패턴의 집착하여 오히려 간결할 수 있는 구조를 복잡하게 만들 수 있다. 특히나 싱글톤 패턴의 오남용이 흔히 일어남으로 과유불급이 일어나지 않도록 주의해야 한다.

프로젝트에 적용 경험 - 매니저를 관리할 때 싱글톤을 항상 사용하고 있는 중, 데이터를 관리하기 용이하게 사용하기 위함이다. 모든 메서드를 스태틱 변수화 하지 않고 전역변수 1개만 스태틱을 사용하기 위함. (메모리 관리) / 또 플레이어 관리를 할 때 옵저버 패턴을 이용해 구현하였다. 플레이어에서는 특정 변화 사실만을 전달하고 이를 개별 기능을 가지고 있는 클래스에서 처리하면 되는 다대일 의존 관계를 만들어서 분할 관리 하고 있다. 이를 통해 코드 간략화 및 관리의 용이성을 의도했다. / 이외에도 현재 에디터 기능을 구현하는 데에 있어 뒤로가기 기능을 위해 커맨드 패턴을 사용하기도 했다.

경험해볼 수 있는 대표적인 디자인 패턴 - 위에서 말한 두 가지, 싱글톤과 옵저버 패턴이 가장 흔하게 접할 수 있었다. 옵저버의 경우 우리가 쓴 것 처럼 플레이어 관리에 자주 사용했었고, 나는 편의상 매니저를 항상 싱글톤화 하여 사용하기 때문이다.


3. 오늘의 작업

오늘은 회의를 많이 하여 결국 6주차 만에 유저 테스트 준비는 불가능하다고 인정하여

차라리 인게임적인 부분을 더 채워넣고 7주차에 테스트를 준비하도록 조정하여야 했다.

 

이미 일정이 많이 미뤄지고 있고

이 부분은 예정에 없던, 에디터의 기능 추가가 많은 부분 또 관여하고 있다고 생각한다.

가장 큰 이유는 네트워크 동기화가 예상 외에 제약점이 많다는 점이지만

이를 제외하고서라도 인게임 적인 요소를 빨리 추가를 못하는 점 또한 에디터에서 생각 해야 하는 점들이 많아

섣불리 무언가를 추가하고 만들어 두기가 어렵다는 점도 있었다.

 

이러다보니 전체적으로 일정을 맞추지 못하고 있고

제대로된 MVP가 만들어지지 못하고 대부분 게임 외적인 부분의 작업만이 진행되고 있는 상황이라

눈에 보이는 결과물이 많이 없는 이 전체적인 상황이, 팀의 분위기가 많이 다운되어가고 번아웃이 오고 있는 상황이다.

이를 타게 하기 위해서 해야 할 리스트 등을 더 시각적으로 만들어 채워나가도록 하려고 있지만

나 또한 개인적인 사정들로 여러모로 어려운 상태라

곧 마지막 주차가 다고오고 있다는 심적 부담감을 느낄 지금이 프로젝트의 고비인 것 같다.

 

아무튼 작업은 유저 테스트 이전 미뤄뒀던 자잘한 수정을 해야했다.

 

우선 이전에도 작성한 바 있던 기능인 감정표현 기능이 네트워크 동기화 이후 생성이 캐릭터와 겹쳐서 생성되던 버그가 있는데

이를 단순히 생성 트랜스폼 위치를 변경해줌으로서 해결했다.

하지만 여기서 의외의 버그를 찾게 되었는데

 

버튼을 클릭해 감정표현을 사용한 후 얼마간에 시간 동안은 감정표현 창을 띄워두면 스페이스바(점프)를 눌러서도

감정표현이 사용된다는 사실이다.

 

이 때문에 어느 로직이 문제인가 정말 이것저것 하나하나 다 살펴보았지만, 문제되는 로직을 찾기가 어려웠고

이에 시간을 많이 쓰던 중 단순히 유니티의 버그란 것을 알게 되었다.

 

 

각 버튼에 있는 Navigation 부분을 Automatic이 기본값으로 되어있는데 이것이 버그를 일으켜

None으로 바꾸어주자 문제가 사라졌다.

 

정확한 문제 발생 원리는 모르나 해당 해결법을 알려준 이의 말을 빌리자면 

You can set the Navigation part of the UI.Button to None so it doesn’t keep focus. 
It acts like a form so you can easily navigate from one UI element to another 
(like when you tab to other fields etc.) Mine was defaulted to automatic.

https://discussions.unity.com/t/button-is-being-triggered-by-spacebar-after-clicked-once/125767

 

 

 

이를 제외하고도 튜토리얼 맵을 준비하기 위해

맵 에디터에 대한 준비를 하고 있으며

튜토리얼용 이미지들을 준비하고 있다.

 

 

이외에도 상호작용 버튼 스프라이트 등 자잘한 추가 작업들도 있었다.

 

EEEEEEEEEEEEE