[25.04.22] TIL( 프로젝트 진행 중 문제 발생)

설민우·2025년 4월 22일

내일배움캠프 - Unity

목록 보기
27/85

! 프로젝트 진행 중 2가지 문제 사항이 발생했습니다!

1. string -> char[,] 변환시 일부 문자 누락 문제

문제 상황 :

        public static void PrintPanel()
        {
            Console.Clear(); // 추가!
            StringBuilder sb = new StringBuilder(); // 줄바꿈 고려

            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                     sb.Append(uiPanel[y, x]);
                }
                sb.AppendLine(); // 줄 바꿈
            }

            Console.Write(sb.ToString());
        }

        public static void UIUpdater(UIName name)
        {
            Console.Clear();

            var printUI = UITable.UITableDic[name];
            foreach (var value in printUI)
            {
                ChangeUiPanel(name, UITable.UIDic[value]);
            }

            // 출력
            PrintPanel();

            // 커서 위치 변경
            ReadLineAt(cusorPosition.Item1, cusorPosition.Item2);
        }
  • @"" 으로 저장되어진 stringTable 을 불러와서 char[,] 배열에 대입하는 과정에서 아래의 두 경우에 일부 누락이 발생했습니다.
  1. 초기화를 전체에 ' ' 빈칸으로 시켜준 경우
  2. null 값인 \0 값을 ' ' 로 치환 시키는 경우
  • 위의 과정은 그 과정을 거치지 않으면 pivot이 적용되지 않는 문제가 발생했기에 시도해 보았습니다.

시도해 본 것:

  • 사실상 위의 오류는, "char[,] 배열의 null 값 때문에 stringBulider에 append가 되지 않는, 공백이 아니라 null 값이었던 문제를 해결 하기 위해 시도해 보았던 방법입니다.

알게된 것:

  • C# 콘솔은 생각보다 다루기 어렵다는 것을 일단 재 확인했습니다. 특히 게임 개발용으로 만들어진게 아니기 때문에 뭔가를 수정하는것이 쉽지 않았습니다.

해결 방법:

  • 초기화를 하는 시도를 취소하고, pivotY는 제대로 적용이 되고 있었기에, pivotX를 적용하는 방식, Table 형식에 변경을 주었습니다.
                                                                          @@@@@@@@@@@@=                                                                                      /
                                                                        .  @        . :@@@@                                                                                  /
                                                                        @@@    -+         =@=                                                                                /
                                                                          @: @@@@@*:@@@@@- @@                                                                                /
                                                                          @@@     @@     @:@@                                                                                /
                                                                           .@@@@      .@@@@-                                                                                 /
                                                                          @  .@@@@ .@@+@@  @@                                                                                /
                                                                          @=@   #@= -@   @@@@                                                                                /
                                                                            @@          -@@                                                                                  /
                                                                              @  @@@@@ @                                                                                     /
                                                                          @@@@@@@%  :@@@@@@@.                                                                                /
                                                                        #@     @*@@  -@@@ :@@@@                                                                              /
                                                                       :@  @@@@@  :@%.@@@@@@-  %@                                                                            /
                                                                  @%  %@*   -  @@%@@@@ @      .@@+                                                                           /
                                                             :@@@.=@@@   @ @:   @==.-:@@   @@%@  @*                                                                          /
                                                             @ @@@  @@@  @  @- .@:= * @@  @@ @@=  @                                                                          /
                                                               @@ #  *@@@@  -@  @@*@@@@@  @    @   @                                                                         /
                                                              @  :@@@ + @@   @  @@@@@@@@ +.   #@   @                                                                         /
                                                               @@-   -@. %    .@@@@@@@@@@     +@    @+                                                                       /
                                                                @@@ .   -       @@@@@@@@      =@    @@                                                                       /
                                                                 -@@@@@@@      .@@:.+@@@       @   @+                                                                        /
                                                                        @@@@@+ -@ @@@  @  @@@@@@@@@                                                                          /
                                                                        @   @- =@ *    @  @:   @                                                                             /
                                                                        @   @- =@@@ .:.@  @#  =@                                                                             /
                                                                        @   @= =@=@@ :.@  @*  .@                                                                             /
                                                                        @@  @* +@ :@ ..@  @#  @@                                                                             /
                                                                        @@      @ +@ :=@     :@@                                                                             /
                                                                          @@@@@@= *@ : =@@@@@@                                                                               /
                                                                           @.    .@@+.::    @@                                                                               /
                                                                          *@@@*  @= @- @@@ @@                                                                                /
                                                                         -@@  @@@@@ @@@@@@@@@                                                                                /
                                                                        *@@ .=*%@@@  @@    %@@                                                                               /
                                                                          +@@%+=      :#@@#*                                                                                 /"
  • 해당 이미지의 왼쪽에 공백을 없애고, 붙여서 Pivot을 지정했을때에 문제가 발생했으므로, xLen을 무조건 빈칸으로 채우는 방식으로 구현했습니다.
  • 불필요한 공백을 적용하는 과정이 들어가긴하지만 Pivot 기능은 작동합니다.

2. ReadLine을 입력하면 콘솔창이 아래로 스크롤 되는 문제

문제 상황 :

        Console.SetCursorPosition(left + displayWidth, height - top);

를 통해 커서를 조작하고, ReadLine을 통해 키를 입력받을때, 엔터키를 치지 않아도 입력이 단 하나라도 들어오면
스크롤을 내려 ReadLine 의 커서가 있는곳이 최상단이 되도록 수정해버리는 문제

시도해 본 것:

  • 먼저 커서 위치를 고정시키고, 버퍼를 추가하여 Console창의 스크롤이 내려가지 않도록 시도해 보았으나 해결되지 않았습니다.

알게된 것:

  • 위의 문제는 콘솔창 자체의 특성으로, 스크롤이 길게 내려와 있을때 입력을 받게 되면 이를 최신화 하게 되는것이 강제적으로 들어가 있어서 수정이 불가능 한 것이었습니다.

해결 방법:

public static void ReadLineAt(int left, int top)
{
    string inputBuffer = "";
    int displayWidth = 0;

    while (true)
    {
        ConsoleKeyInfo keyInfo = Console.ReadKey(intercept: true);

        if (keyInfo.Key == ConsoleKey.Enter)
            break;

        if (keyInfo.Key == ConsoleKey.Backspace)
        {
            if (inputBuffer.Length > 0)
            {
                char lastChar = inputBuffer[^1];
                int charWidth = GetCharWidth(lastChar);
                displayWidth -= charWidth;
                inputBuffer = inputBuffer.Substring(0, inputBuffer.Length - 1);

                for (int i = 0; i < charWidth; i++)
                    uiPanel[height - top, left + displayWidth + i] = ' ';
            }
        }
        else if (!char.IsControl(keyInfo.KeyChar))
        {
            char c = keyInfo.KeyChar;
            int charWidth = GetCharWidth(c);

            if (left + displayWidth + charWidth <= width) // overflow 방지
            {
                inputBuffer += c;
                uiPanel[height - top, left + displayWidth] = c;

                if (charWidth == 2)
                    uiPanel[height - top, left + displayWidth + 1] = ' ';

                displayWidth += charWidth;
            }
        }

        PrintPanel();
        Console.SetCursorPosition(left + displayWidth, height - top);
    }
}
  • ReadLine 의 기능을 하는 함수를 별도로 재작해 두었습니다.
  • 모든 기능이 ReadLine과 일치하나, 매번 Print를 반복하여 새로운 화면을 보여주고, 커서의 위치는 버퍼를 통해 이동 시키도록 하였습니다.

결론

정말이지... 콘솔창을 이용해서 UI를 구현 해보려는 시도를 하면서 유니티의 UI가 선녀같이 보입니다...

profile
클라이언트 개발자를 지망하고 있습니다.

0개의 댓글