ScreentoWorld
문제상황
- 동적으로 오브젝트들을 생성해주는데, 캐릭터가 생성되고나서 마우스 방향을 제대로 바라보지 못하는 문제가 발생
디버깅
- ScreentoWorldPostion을 수행하고나면 카메라의 위치를 뱉는 문제를 찾음
원인추정 및 해결방안
- PixelPerfectcamera
- 2년전 문서가 남아있음. 업데이트되면 잘 된다고 함. 해당 컴포넌트를 지워도 작동하지 않음.
- 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로 넣어도 잘 작동함을 볼 수 있었음
- 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);
}
초기 분석
- 줄바꿈 문자
- 이전에 윈도우에서 줄바꿈문자가 \n이 아니라 \r\n을 써서 문제가 생긴적이 있었음. 이에 착안하여 입력받은 이름에 \r \n 을 모두 replace로 삭제하고 시도함
- 해결되지 않음. 여전히 특수문자가 없는 문자열을 특수문자가 있다고 함
- 정규식 문제
- 정규식 문제 일리는 없을 것 같지만 혹시 몰라 인터넷에 있는 다른 특수문자 판별 방식을 가져와서 적용해봄
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 함수로 해당 유니코드도 제거해주니 처음 방식과 바꾼 방식 모두 잘 작동함.