[유니티 C#] 문자열 종류 구분, 긴 글에서 현재 몇 번째 절? 문단?
https://kimkitty.net/archives/1688
Kim Kitty's Blog
김키티의 아수라장 - C#,PC게임,이슈,트렌드
kimkitty.net
해당 포스트를 참조했습니다.
2023.06.01 - [유니티] - [유니티 C#] string 문자열에 여러 컬러 넣기, 자동으로 다음 문장으로 넘어가기
[유니티 C#] string 문자열에 여러 컬러 넣기, 자동으로 다음 문장으로 넘어가기
https://redasol.tistory.com/6 [유니티 C#] string 문자열에서 특정 문자 사이에 컬러 넣기 네이버 블로그 백업 글 입니다. https://blog.naver.com/keutana/223109341991 [유니티 C#] string 문자열에서 특정 문자 사이에
redasol.tistory.com
이전 글에서 이어집니다, 이번 포스팅은 정말 간단한 방법을 사용해서 세련되지 않습니다.
3번 기능까지 만들고 플레이하다보니 몇 번째 문단을 작성 중인지 궁금해졌다.
성경이라면 현재 몇 번째 절인지, 애국가로 치면 현재 몇 번째 소절인지 궁금해졌다.
이전에 3번 기능으로 영어로 테스트한 상태에서 다시 시작해보자
먼저 지금 치고있는 문장이 영어인지, 한글인지 구분하는 기능을 작성하고 성경의 창세기 1장을 텍스트로 넣어 놨으므로 영어라면 각 절이 바뀔때마다 제시 문장 위에 "창세기 1-1, 창세기 1-2" 이렇게 표현하려고 했다.
또 너무 텍스트 파일내에서 너무 길게 한 줄로 들어온 문자열은 일정 길이만큼 자르고 표현하고 있어 제시 문장이 하나 넘어갈 때마다 숫자를 늘릴 수 없었다.
먼저 제시 문장객체를 복사하고 그 위에 두며 색을 회색으로 바꿨다. 복사한 객체를 제목 문장이라고 하자
제목 문장은 다음과 같이 코드로 정의할 수 있을 것이다.
titleText = GameObject.Find("TitleText").GetComponent<TMP_Text>();
titleText.text = saveFirstTilteText = problemList[0];
byte[] bytearry = System.Text.Encoding.Default.GetBytes(titleText.text);
int tempvalue = Convert.ToInt32(bytearry[0].ToString());
if(tempvalue > 127)
{
// 한글
titleType = 0;
}
else if(tempvalue <= 122 && tempvalue >= 65)
{
// 영어
titleType = 1;
}
제목 문장과 제목 문장의 첫 시작 원본 string을 저장할 saveFirstTitleText를 선언
문제 리스트의 첫 문자열은 타자 연습의 제목이므로 저장
byte[] bytearry = System.Text.Encoding.Default.GetBytes(titleText.text); 이 구문 밑으로는 한글이냐 영어이냐 판별하는 구문이다.
참조한 포스트에 의하면 다음 표의 아스키 코드 값으로 한글과 영어를 판별할 수 있었다.
구분 | Value |
한글 | 128 이상 |
영문(소) | 97~122 |
영문(대) | 65~90 |
숫자 | 48 ~ 57 |
Encoding은 System.Text 의 네임스페이스를 선언해야하고 Convert는 System 을 선언해야 사용할 수 있다.
이렇게 한글과 영어인지 판별해놓았지만 일단은 영어(성경)으로 테스트하고 있으니 영어를 기준으로 보자.
IEnumerator CheckInputField()
{
int num = 0;
while(true)
{
yield return null;
if(string.Equals(inputField.text, insideProblemText))
{
nowListNum++;
if(nowListNum >= problemList.Count)
{
UnityEditor.EditorApplication.isPlaying = false;
break;
}
else
{
insideProblemText = problemList[nowListNum];
showingProblemText.text = insideProblemText;
inputField.text = "";
inputField.ActivateInputField();
if(titleType == 1 && (insideProblemText[0] < 58 && insideProblemText[0] > 47 ))
{
num++;
titleText.text = saveFirstTilteText;
titleText.text = titleText.text + "-" + num.ToString();
}
}
}
if(nowListNum >= problemList.Count)
{
UnityEditor.EditorApplication.isPlaying = false;
break;
}
}
}
CheckInputField 함수에 내용을 추가했다.
whilte문 시작전에 int num = 0; 로 인트값을 선언하고
if(titleType == 1 && (insideProblemText[0] < 58 && insideProblemText[0] > 47 )) 이 구문으로 영어이며 문제 문장의 첫 시작 글자가 숫자일 경우를 판별한다.
숫자라면 num을 하나 올리고 제목 문장을 변경한다.
이렇게 설정하면 다음 사진들처럼 된다.
각 절이 숫자로 시작하면 제목 문장뒤에 번호가 붙는다.
어느 한 절이 너무 길어서 중간을 잘라 제시 문장을 두 개로 나눠도 상관없이 숫자로 시작해야 작동하는 걸 확인 할 수 있었다.
이렇게 만든 기능의 문제점은 문자열의 첫 글자가 반드시 숫자여야 된다는 것이고, 문자열의 중간을 그냥 잘라버려서 단어가 잘려서 나오는 것이다.
문자열의 첫 글자가 숫자가 아니여도 할 수 있는 방법이 있을텐데 지금 생각나는 방법은 텍스트 파일을 읽을 때 Dictionary 를 이용해 키를 문자열로 Value를 문장의 절 숫자로 설정하면 가능할 것 같다는 생각이 든다.
Dictionary를 이용하면 문자열이 너무 길어 중간에 짤라도 Value값은 중복이 되므로 어떻게든 가능하리라 보는데....
영어나 한글에서 문자열이 너무 길어 중간에 자를때 단어 단위로 자르게 할 방법을 찾아야겠다.