Develop/유니티

[유니티 C#] 문자열 종류 구분, 긴 글에서 현재 몇 번째 절? 문단?

레다솔 2023. 6. 2. 10:49
728x90
반응형

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값은 중복이 되므로 어떻게든 가능하리라 보는데....

영어나 한글에서 문자열이 너무 길어 중간에 자를때 단어 단위로 자르게 할 방법을 찾아야겠다.

728x90
반응형