카테고리 없음

[Trouble shooting] 마우스 좌표 변환과 유니티 inputfield의 문제

리네엔 2024. 10. 14. 22:53

ScreentoWorld

문제상황

  • 동적으로 오브젝트들을 생성해주는데, 캐릭터가 생성되고나서 마우스 방향을 제대로 바라보지 못하는 문제가 발생

디버깅

  • ScreentoWorldPostion을 수행하고나면 카메라의 위치를 뱉는 문제를 찾음

원인추정 및 해결방안

  1. PixelPerfectcamera
  • 2년전 문서가 남아있음. 업데이트되면 잘 된다고 함. 해당 컴포넌트를 지워도 작동하지 않음.
  1. z축이 0으로 들어가는 문제
    Vector2 aim = value.Get<Vector2>();
    Vector2 worldPos = Camera.main.ScreenToWorldPoint(aim);
    aim = (worldPos - (Vector2)this.transform.position).normalized;
    CallLook(aim);
  • ScreenToWorldPoint에 vector2가 들어가면 z가 자동으로 0으로 잡혀서 제대로 계산되지 않는 문제가 있을 수 있을 수 있음을 찾음
  • Vector3로 바꾸어 z를 1을 넣어주면 잘 작동함

하지만, 강의 예제에서는 이와 같이 vector2로 넣어도 잘 작동함을 볼 수 있었음

  1. camera projection설정
  • camera projection이 Orthographic이 아닌 perspective으로 되어 있었음.
  • 이를 orthographic으로 변경하니 잘 작동함.

특수문자 포함 여부 검사

문제상황

  • 캐릭터의 이름을 설정할 때 특수문자가 있으면 설정할수 없도록 하고자 함.
  • 하지만 특수문자가 없어도 특수문자가 있다고 뜨는 문제 발생
using System.Text.RegularExpressions;
// 생략
    public static bool IsContainsSpecialCharacters(string str)
    {
        string pattern = @"[^a-zA-Z0-9가-힣]";
        return Regex.IsMatch(str, pattern);
    }

초기 분석

  1. 줄바꿈 문자
  • 이전에 윈도우에서 줄바꿈문자가 \n이 아니라 \r\n을 써서 문제가 생긴적이 있었음. 이에 착안하여 입력받은 이름에 \r \n 을 모두 replace로 삭제하고 시도함
  • 해결되지 않음. 여전히 특수문자가 없는 문자열을 특수문자가 있다고 함
  1. 정규식 문제
  • 정규식 문제 일리는 없을 것 같지만 혹시 몰라 인터넷에 있는 다른 특수문자 판별 방식을 가져와서 적용해봄
      public static bool IsContainsSpecialCharacters(string str)
      {
          string strCheck = Regex.Replace(str, @"[^a-zA-Z0-9가-힣]", "",RegexOptions.Singleline);
          return strCheck != str;
      }
  • 특수문자를 replace로 제거하고 원래 string이랑 같은지 비교하는 방법. 하지만 이로도 해결되지 않았음.

해결방안

  • gpt에게 상황을 자세하게 설명했더니 유니코드를 디버깅해보라는 답변을 받을 수 있었음.
      public static bool IsContainsSpecialCharacters(string str)
      {
          string strCheck = Regex.Replace(str, @"[^a-zA-Z0-9가-힣]", "",RegexOptions.Singleline);
          foreach (char c in str)
          {
              Debug.Log($"Character: {c}, Unicode: {(int)c}");
          }
          Debug.Log(str);
          Debug.Log("==========");
          foreach (char c in strCheck)
          {
              Debug.Log($"Character: {c}, Unicode: {(int)c}");
          }
          Debug.Log(strCheck);
          return strCheck != str;
      }
  • 두 문자열의 unicode를 비교해본 결과, 원본 string에 Unicode: 8203이라는 zero width space가 숨어있음을 알 수 있었음.
  • replace 함수로 해당 유니코드도 제거해주니 처음 방식과 바꾼 방식 모두 잘 작동함.