ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 영어 기능 지원#2 + 기타 업데이트
    Galaxy Ball/6. 기타 수정 + 추가 기능 2025. 1. 14. 00:21

    지난글에 이어 영어기능을 완전히 지원해보도록 하겠다

     

     {
        "id": 11,
        "textWithDelay": [
          {
            "text": "So...",
            "delay": 0.05
          },
          {
            "text": "You've seen the ending, why are you here again?",
            "delay": 0.05
          },
          {
            "text": "Did you just come to hang out?",
            "delay": 0.05
          },
          {
            "text": "...Ok",
            "delay": 0.05
          }
        ]
      }
    ]

     

    우선 나머지 대사 스크립트를 전부 번역해주었다

    이제 스토리 관련 대사는 전부 번역이 끝났다

     

    그리고 엔딩 크레딧의 경우는 하나의 TMPro에 크레딧에 들어갈 모든 텍스트들을 써준 형식이라

    번역하기 굉장히 번거러운 조건이 되버린다. 

     

     

    그래서 Ending씬과 영어 번역용 EEnding 씬을 따로 만들어준뒤

    씬을 넘기는 과정에서 조건에 따라 넘어갈 씬의 이름을 각각 다르게 해주었다

    이럴땐 스위치처럼 번역여부를 결정하는것이 참 편한것 같다

     

     

    그 다음으로 해줄것은 스테이지마다 할당된 우주에 관한 신기한 사실들. 이것들도 번역해주자

     

    그러다 번역하는 과정에서 한가지 문제가 생겼다. 언어 특성상 문장이 더 길어질 수 밖에 없는

    영어라 아무리 줄여봐도 영어의 양이 스테이지 박스 칸을 자꾸 넘어버리는것

     

    그래서 스크롤뷰를 이용하여 아예 플레이어가 스크롤을 할 수 있도록 해주었다

     

     

    Scroll View

    게임을 만들다 갑자기 필요해진 중요한 기능이다. 내가 설정한 텍스트 박스는 크기 제한이 있는데 텍스트는 그보다 많아 공간을 넘어갈때그렇다고 글씨크기를 줄이자니 너무 작아지고, 냅두자

    sangeun00.tistory.com

    (스크롤뷰 활용법 기초)

    이렇게하면 텍스트의 양이 많아져도 부담이 훨씬 덜어질 것이다

     

     

    메인 스테이지도 마찬가지. 스크롤뷰를 이용하여 텍스트양이 많아지면 얼마든지 스크롤 하여

    내릴수 있도록 하였다

     

     

    그렇게 우주에 관한 흥미로운 사실들도 전부 번역해주었다. 이로써 번역에 관한 모든것이 끝이 났다

     

     

    그리고 번역과는 관련없지만 하면서 보게 된 몇가지 불편한 부분들을 수정해주겠다

     

    게임 설정상 스테이지 행성과 플레이어가 겹쳐야지만 우주에 관한 흥미로운 사실과 플레이 창을 볼 수 있는데

    문제는 공전을 하고 있는 행성들은 끊임없이 움직여 텍스트를 읽으려면 계속해서 행성을 따라

    움직여야 한다는것. 이게 굉장히 불편하다

     

    using UnityEngine;
    
    public class StageState : MonoBehaviour
    {
        public GameObject StageStart;
        public GameObject StartButton;
        public GameObject Clearhere;
        public int stagenum;
        public static int chooseStage;
        private bool isclear;
        private StageGameManager gameManager;
        private SpriteRenderer spriteRenderer;
    
        public bool isturn = false; // 초기 움직임 상태
        public float rotationSpeed = 1f;
        public float radius = 5f;
        public float initialAngle;
    
        private Vector3 initialPosition;
        private float angle = 0f;
        private bool wasInitiallyMoving; // 처음에 움직이고 있었는지 여부 저장
    
        void Start()
        {
            string namePart = gameObject.name.Substring(5, 2); // 6번째와 7번째 문자를 추출
            this.stagenum = int.Parse(namePart);
            gameManager = StageGameManager.instance;
            float stageClearID = gameManager.StageClearID;
    
            spriteRenderer = GetComponent<SpriteRenderer>();
            initialPosition = transform.position; // 초기 위치 저장
            initialAngle = Random.Range(0f, 360f); // 초기 각도를 랜덤으로 설정
            angle = initialAngle; // 초기 각도로 설정
    
            wasInitiallyMoving = isturn; // 초기 움직임 상태 저장
        }
    
        void Update()
        {
            if (isturn)
            {
                // 원을 그리며 이동
                angle += rotationSpeed * Time.deltaTime;
                if (angle > 360f) angle -= 360f; // 각도가 360도를 넘지 않도록 조정
    
                float x = Mathf.Cos(angle) * radius;
                float y = Mathf.Sin(angle) * radius;
    
                transform.position = initialPosition + new Vector3(x, y, 0f);
            }
        }
    
        private void OnTriggerStay2D(Collider2D collision)
        {
            if (collision.gameObject.tag == "StageBall")
            {
                Debug.Log("스테이지 플레이창을 띄웁니다");
                StageStart.gameObject.SetActive(true);
                isturn = false; // 움직임 멈춤
    
                if (!isclear)
                {
                    StartButton.gameObject.SetActive(false);
                }
                else if (isclear)
                {
                    StartButton.gameObject.SetActive(true);
                }
                chooseStage = stagenum;
                Debug.Log("chooseStage : " + chooseStage);
            }
        }
    
        private void OnTriggerExit2D(Collider2D collision)
        {
            if (collision.gameObject.tag == "StageBall")
            {
                StageStart.gameObject.SetActive(false);
    
                // 처음부터 움직이던 상태였던 경우에만 다시 움직임을 시작
                if (wasInitiallyMoving)
                {
                    isturn = true;
                }
            }
        }
    }

     

    그래서 코드를 수정해주었다. 

     

    플레이어와 닿아 OnTriggerStay2D를 만족시키면 움직임을 멈춘다

    그리고 OnTriggerExit2D를 만족시키면 다시 행성을 움직이게 해준다

     

    하지만 이렇게 했을때 문제가 한가지 생기는데 그건 바로

    처음부터 정지상태였던 행성도 OnTriggerExit2D가 되는순간 멋대로 공전이 되는것

     


    그래서 wasInitiallyMoving이라는 bool 타입 변수를 하나 만들어 처음부터 공전상태였는지,

    아니면 정지상태였는지 여부를 가져와 저장하고, 이 처음 여부에 따라 OnTriggerExit2D가 되었을때

    다시 공전할지, 아니면 계속 정지상태를 유지할지 결정하게 해주었다

     

     

     

    이제 공전중 플레이어와 닿으면 정지후 떨어지는 순간 움직이며

    처음부터 정지상태였던 행성은 다시 떨어져도 정지 상태를 유지하는것을 확인할 수 있다

     

     

     

     

     

     

    한가지 수정해줄게 더 있다

    스테이지를 전부 클리어하고 최종보스까지 클리어한뒤 다시 스토리모드에 돌아오면

    이런 텍스트가 활성화된다. 하지만....

     

    StageClearID가 66을 만족시키면 씬을 시작할때마다 11번 텍스트를 활성화 시키는것

    그렇기에 스테이지를 클리어하고 스테이지 선택씬에 돌아올때마다 이 텍스트가 활성화되는것이다

    즉, 끊임없이 같은 텍스트를 반복해서 봐야한다는것. 

     

     

    추가로 2개의 프롤로그도 전부 번역을 마쳐주었다.

    이것 역시 isenglish 스위치 여부에 따라 번역여부가 결정될것이다

     

    이렇게 모든 한국어를 영어로 번역해주는데 성공했다ㅎ

Designed by Tistory.