오늘은 프롤로그를 기필코 마칠 것이라고 목표를 잡았는데, 이루어냈다. 약 6시간 정도 걸린 것 같다. 44번째 스토리에서 끝이 났고 24개의 스토리를 만들었으니 스토리 하나 진행시킬 때 약 8분정도 걸린 것 같다. 스토리를 만드는 게 생각보다 진전도 없고 바뀐 것도 별로 없는 것 같은 느낌이 들어서 힘들기도 했지만, 시작한 이상 제대로 만들고 싶어서 계속 붙잡고 있었다. 길진 않지만 그래도 프롤로그를 완성시켜서 기분이 좋다.

 

1. BGM 변경

테일즈 사가 크로니클이 블루 아카이브 내에서 진행되는 게임이다보니, BGM을 똑같은 것으로 사용하고 싶었는데 어제는 무슨 BGM인지 찾지 못했다. 그런데 오늘 BGM들을 하나하나 듣고 비교하면서 똑같은 BGM으로 교체했다. 덕분에 블루 아카이브 BGM들의 이름을 꽤 알게 됐다.

 

2. 선택지로 갈린 스토리 알맞게 변경

선택지를 1개짜리, 2개짜리를 그냥 진행하도록 우선 해두었고, 오늘 개발을 진행한 부분에서는 선택지에 따라 결과가 바뀌는 부분이 있어서 그 부분을 구현하고 갈린 스토리들을 따로 진행하고 연결하는 부분을 구현했다.

public IEnumerator SelectedSelection(int num)
    {
        yield return new WaitForSeconds(0.5f); // 버튼이 눌린 후 진행되도록 잠시 대기
        storyNum++;
        if(num == 0)
        {
            story.transform.Find("Episode/UI/Selection1").gameObject.SetActive(false);
        }
        else if(num == 1)
        {
            story.transform.Find("Episode/UI/Selection1-1").gameObject.SetActive(false);
            story.transform.Find("Episode/UI/Selection1-2").gameObject.SetActive(false);

            // 선택지를 고르면 알맞은 번호로 이동
            if(storyNum == 14) // A키를 입력한다.
            {
                storyNum = 23;
            }
            else if (storyNum == 30) // A키 입력
            {
                storyNum = 30;
            }
        }
        else if(num == 2)
        {
            story.transform.Find("Episode/UI/Selection1-1").gameObject.SetActive(false);
            story.transform.Find("Episode/UI/Selection1-2").gameObject.SetActive(false);

            // 선택지를 고르면 알맞은 번호로 이동
            if (storyNum == 14) // B키를 입력한다.
            {
                storyNum = 14;
            }
            else if (storyNum == 30) // 푸니젤리에게 조심스럽게 접근한다.
            {
                storyNum = 36;
            }
        }

        isCanProgress = true;
        StoryProgress();
    }

 

 

오늘은 스토리 위주로 개발했다보니 그 부분을 올리는 것도 좋을 것 같다. 오늘은 22~44 부분을 추가했다. 보기에 좀 지저분해보이기도 하는데 나름대로 깔끔하게 보이려고 노력은 했다. 조금 더 개선할 수 있을 것 같기도 하다. 특히 애니메이션 실행 부분을 개선하면 좋을 것 같다고 생각한다.

private IEnumerator StoryAction(int num)
    {
        if(!isStoryProgressing)
        {
            isCanProgress = false;
            if (num == 0)
            {
                audioManager.PlaySFX("Silence");
            }
            else if (num == 1)
            {
                //audioManager.PlaySFX("Silence");
            }
            else if (num == 2)
            {
                dialog.GetComponent<TMP_Text>().fontSize = 60;
                audioManager.PlaySFX("Start");
            }
            else if (num == 3)
            {
                momoi.SetActive(true);
                momoi.transform.parent.GetComponent<RectTransform>().anchoredPosition = new Vector2(0, 0);

                StartCoroutine(gameManager.FadeInImage(1f, story.transform.Find("Episode/EpisodeBackground").GetComponent<Image>()));
                StartCoroutine(gameManager.FadeInImage(1f, momoi.transform.Find("CharacterImage").GetComponent<Image>()));
                StartCoroutine(gameManager.FadeInImage(1f, momoi.transform.Find("HaloParent/Halo").GetComponent<Image>()));

                audioManager.PlayBGM("PixelTime");
                yield return new WaitForSeconds(1.5f);
                dialog.GetComponent<TMP_Text>().fontSize = 42.5f;
                momoi.transform.Find("TalkingParent/Talking").GetComponent<Animator>().Play("Talking");
                momoi.GetComponent<Animator>().Play("Jumping");

                audioManager.PlaySFX("Talking");
            }
            else if (num == 4)
            {
                midori.SetActive(true);
                midori.transform.parent.GetComponent<RectTransform>().anchoredPosition = new Vector2(600, 0); // midori right side : 625
                midori.transform.Find("CharacterImage").GetComponent<Image>().color = Color.white;
                midori.transform.Find("HaloParent/Halo").GetComponent<Image>().color = Color.white;

                momoi.transform.parent.GetComponent<RectTransform>().DOLocalMoveX(-700, 0.5f); // momoi left side : -700
            }
            else if (num == 5)
            {
                midori.gameObject.SetActive(false);
                momoi.gameObject.SetActive(false);
                aris.gameObject.SetActive(true);
                yuzu.gameObject.SetActive(true);

                SetCharacterImage(yuzu, 8);
                SetCharacterImage(aris, 0);
                aris.transform.Find("CharacterImage").GetComponent<Image>().color = Color.white;
                aris.transform.Find("HaloParent/Halo").GetComponent<Image>().color = Color.white;
                aris.transform.parent.GetComponent<RectTransform>().anchoredPosition = new Vector2(600, 0); // aris right side : 580
                yuzu.transform.Find("CharacterImage").GetComponent<Image>().color = Color.white;
                yuzu.transform.Find("HaloParent/Halo").GetComponent<Image>().color = Color.white;
                yuzu.transform.parent.GetComponent<RectTransform>().anchoredPosition = new Vector2(-700, 0); // left side : -700
                yuzu.GetComponent<Animator>().Play("Shiver");
                yuzu.transform.Find("MessParent/Mess").GetComponent<Animator>().Play("Mess");
                audioManager.PlaySFX("Mess");
            }
            else if (num == 6)
            {
                SetCharacterImage(aris, 7);
                aris.transform.Find("ShineParent/Shine").GetComponent<Animator>().Play("Shine");

                audioManager.PlaySFX("Shine");
            }
            else if (num == 7)
            {
                SetCharacterImage(momoi, 3);
                momoi.transform.parent.GetComponent<RectTransform>().anchoredPosition = new Vector2(0, 0);
                momoi.gameObject.SetActive(true);
                aris.gameObject.SetActive(false);
                yuzu.gameObject.SetActive(false);

                momoi.GetComponent<Animator>().Play("Jumping");
                momoi.transform.Find("TalkingParent/Talking").GetComponent<Animator>().Play("Talking");

                audioManager.PlaySFX("Talking");
            }
            else if (num == 8) // 선택지
            {
                ShowSelection("자리에 앉는다.");
                yield break;
            }
            else if (num == 9) // Window Fade Out
            {
                story.transform.Find("Episode/WindowFadeOut").gameObject.SetActive(true);
                coroutineWindowFadeOut = StartCoroutine(gameManager.FadeInImage(0.5f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                StartCoroutine(gameManager.FadeOutMusic());
                yield return new WaitForSeconds(1);
                audioManager.PlaySFX("TSCStart");
                yield return new WaitForSeconds(1);
                SetDialogOn(false);
                momoi.transform.gameObject.SetActive(false);
                story.transform.Find("Episode/EpisodeBackground").GetComponent<Image>().sprite = episodeBackgroundImage.backgroundArray[2];
                StopCoroutine(coroutineWindowFadeOut);
                StartCoroutine(gameManager.FadeOutImage(0.5f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                yield return new WaitForSeconds(2);

                SetDialogOn(true);
            }
            else if (num == 10)
            {
                SetDialogOn(false);
                yield return new WaitForSeconds(0.5f);
                audioManager.PlayBGM("Theme101");
                StartCoroutine(AppendTextOneByOne(story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>(), "< 코스모스 세기 2354년, 인류는 업화의 불길에 휩싸였다. >\n\n", 1));
                yield return new WaitForSeconds(2.5f);
                ShowSelection("“……동화적 색채?”");
                yield break;
            }
            else if (num == 11)
            {
                SetDialogOn(true);
            }
            else if (num == 12)
            {
                ShowSelection("“…….”", "버튼을 입력한다.");
                yield break;
            }
            else if (num == 13)
            {
                SetDialogOn(false);
                StartCoroutine(AppendTextOneByOne(story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>(), "< 튜토리얼을 시작합니다. >\n\n", 1));
                yield return new WaitForSeconds(2);
                StartCoroutine(AppendTextOneByOne(story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>(), "< 먼저 B 키를 눌러, 눈앞의 무기를 장착해보세요. >\n\n", 1));
                yield return new WaitForSeconds(2.5f);
                ShowSelection("A 키를 입력한다.", "B 키를 입력한다.");
                yield break;
            }
            // B 버튼 루트 시작
            else if (num == 14)
            {
                audioManager.StopBGM();
                audioManager.PlaySFX("SelectButton");
                yield return new WaitForSeconds(1);
                audioManager.PlaySFX("8bitBomb");
                SetDialogOn(true);
            }
            else if (num == 15)
            {
                ShowSelection("“???”");
                yield break;
            }
            else if (num == 16)
            {
                SetDialogOn(false);
                // 게임 오버
                story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>().text = "";
                audioManager.PlaySFX("GameOver");
                StartCoroutine(gameManager.FadeInText(0.5f, story.transform.Find("Episode/WindowText_GameOver").GetComponent<TMP_Text>()));
                yield return new WaitForSeconds(4);
                ShowSelection("“?!”");
                yield break;
            }
            else if (num == 17)
            {
                SetDialogOn(true);
                audioManager.PlaySFX("Laughing");
            }
            else if (num == 18) // WindowFadeOut
            {
                SetCharacterImage(momoi, 3);

                story.transform.Find("Episode/WindowFadeOut").gameObject.SetActive(true);
                coroutineWindowFadeOut = StartCoroutine(gameManager.FadeInImage(0.5f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                yield return new WaitForSeconds(2);
                momoi.transform.gameObject.SetActive(true);
                story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>().text = "";

                //GameOver 글씨 투명하게 변경
                ColorUtility.TryParseHtmlString("#FF656B00", out Color color);
                story.transform.Find("Episode/WindowText_GameOver").GetComponent<TMP_Text>().color = color;

                story.transform.Find("Episode/EpisodeBackground").GetComponent<Image>().sprite = episodeBackgroundImage.backgroundArray[1];
                StopCoroutine(coroutineWindowFadeOut);
                StartCoroutine(gameManager.FadeOutImage(0.5f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                yield return new WaitForSeconds(2);


                momoi.GetComponent<Animator>().Play("Jumping");
                momoi.transform.Find("LaughingParent/Laughing").GetComponent<Animator>().Play("Laughing");
                audioManager.PlaySFX("Laughing");
                audioManager.PlayBGM("MischievousStep");
            }
            else if (num == 19)
            {
                ShowSelection("“…….”");
                yield break;
            }
            else if (num == 20)
            {
                aris.SetActive(true);
                SetCharacterImage(aris, 9);

                momoi.transform.parent.GetComponent<RectTransform>().DOLocalMoveX(-700, 0.5f); // momoi left side : -700
                aris.transform.Find("SweatParent/Sweat").GetComponent<Animator>().Play("Sweat");
                audioManager.PlaySFX("Sweat");
            }
            else if (num == 21)
            {
                ShowSelection("다시 시도한다.");
                yield break;
            }
            else if (num == 22)
            {
                story.transform.Find("Episode/WindowFadeOut").gameObject.SetActive(true);
                coroutineWindowFadeOut = StartCoroutine(gameManager.FadeInImage(0.5f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                StartCoroutine(gameManager.FadeOutMusic());
                yield return new WaitForSeconds(1);
                audioManager.PlaySFX("TSCStart");
                yield return new WaitForSeconds(1);
                SetDialogOn(false);
                momoi.transform.gameObject.SetActive(false);
                aris.transform.gameObject.SetActive(false);
                story.transform.Find("Episode/EpisodeBackground").GetComponent<Image>().sprite = episodeBackgroundImage.backgroundArray[2];
                StopCoroutine(coroutineWindowFadeOut);
                StartCoroutine(gameManager.FadeOutImage(0.5f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                yield return new WaitForSeconds(2);
                StartCoroutine(AppendTextOneByOne(story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>(), "< 무기 장착에 성공했습니다. >\n\n", 1));
                audioManager.PlaySFX("Message");
                yield return new WaitForSeconds(2f);
                SetDialogOn(true);
            }
            // B 버튼 루트 종료

            // A버튼 루트
            else if (num == 23)
            {
                story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>().text = "";
                //audioManager.StopBGM();
                StartCoroutine(AppendTextOneByOne(story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>(), "< 무기 장착에 성공했습니다. >\n\n", 1));
                audioManager.PlaySFX("Message");
                yield return new WaitForSeconds(2f);
                SetDialogOn(true);
                audioManager.PlaySFX("Talking");
            }
            else if (num == 24)
            {
                audioManager.PlaySFX("Sweat");
            }
            else if (num == 25)
            {
                audioManager.PlaySFX("Shine");
            }
            else if (num == 26)
            {

            }
            else if (num == 27)
            {

            }
            // A버튼 루트 종료
            else if (num == 28)
            {
                SetDialogOn(false);
                audioManager.PlayBGM("MechanicalJungle");
                story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>().text += "<#FF656B>";
                StartCoroutine(AppendTextOneByOne(story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>(), "< 전투 발생! 전투 발생! >\n\n", 1));
                yield return new WaitForSeconds(2);
                story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>().text += "</color>";
                StartCoroutine(AppendTextOneByOne(story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>(), "< 야생의 푸니젤리가 나타났다! >\n\n", 1));
                yield return new WaitForSeconds(2);
                SetDialogOn(true);
            }
            else if (num == 29)
            {
                ShowSelection("A버튼 입력, < 비검 츠바메가에시, 한 번에 적을 2회 공격한다. >", "푸니젤리에게 조심스럽게 접근한다.");
                yield break;
            }
            // A버튼을 누른다 루트 시작
            else if (num == 30)
            {
                SetDialogOn(false);
                audioManager.StopBGM();
                StartCoroutine(AppendTextOneByOne(story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>(), "< 탕!! >\n\n", 1));
                audioManager.PlaySFX("8bitBang");
                yield return new WaitForSeconds(2);
                StartCoroutine(AppendTextOneByOne(story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>(), "< 명중, 당신의 캐릭터가 즉사했다. >\n\n", 1));
                audioManager.PlaySFX("KnockDown");
                yield return new WaitForSeconds(2);

                // 게임 오버
                story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>().text = "";
                audioManager.PlaySFX("GameOver");
                StartCoroutine(gameManager.FadeInText(0.5f, story.transform.Find("Episode/WindowText_GameOver").GetComponent<TMP_Text>()));
                yield return new WaitForSeconds(4);

                ShowSelection("“??!!”");
                yield break;
            }
            else if (num == 31)
            {
                StartCoroutine(gameManager.FadeInText(0.5f, story.transform.Find("Episode/WindowText_GameOver2").GetComponent<TMP_Text>()));
                audioManager.PlayBGM("FadeOut");
                audioManager.PlaySFX("RobotTalk");
                yield return new WaitForSeconds(4);

                SetCharacterImage(momoi, 7);

                momoi.transform.parent.GetComponent<RectTransform>().anchoredPosition = new Vector2(-700, 0);
                story.transform.Find("Episode/WindowFadeOut").gameObject.SetActive(true);
                coroutineWindowFadeOut = StartCoroutine(gameManager.FadeInImage(0.5f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                yield return new WaitForSeconds(2);
                momoi.transform.gameObject.SetActive(true);
                story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>().text = "";

                //GameOver 글씨 투명하게 변경
                ColorUtility.TryParseHtmlString("#FF656B00", out Color color);
                story.transform.Find("Episode/WindowText_GameOver").GetComponent<TMP_Text>().color = color;
                ColorUtility.TryParseHtmlString("#5DC48100", out color);
                story.transform.Find("Episode/WindowText_GameOver2").GetComponent<TMP_Text>().color = color;
                story.transform.Find("Episode/EpisodeBackground").GetComponent<Image>().sprite = episodeBackgroundImage.backgroundArray[1];
                StopCoroutine(coroutineWindowFadeOut);
                StartCoroutine(gameManager.FadeOutImage(0.5f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                yield return new WaitForSeconds(2);

                momoi.transform.Find("SilenceParent/Silence").GetComponent<Animator>().Play("Silence");
                audioManager.PlaySFX("Silence");
                SetDialogOn(true);
            }
            else if (num == 32)
            {
                midori.transform.parent.GetComponent<RectTransform>().anchoredPosition = new Vector2(600, 0);
                midori.transform.gameObject.SetActive(true);
                SetCharacterImage(midori, 7);

                midori.transform.Find("SweatParent/Sweat").GetComponent<Animator>().Play("Sweat");
                audioManager.PlaySFX("Sweat");
            }
            else if (num == 33)
            {
                momoi.SetActive(false);
                midori.SetActive(false);
                aris.SetActive(true);
                SetCharacterImage(aris, 10);

                aris.transform.parent.GetComponent<RectTransform>().anchoredPosition = new Vector2(0, 0);
                aris.GetComponent<Animator>().Play("Shiver");
                aris.transform.Find("MessParent/Mess").GetComponent<Animator>().Play("Mess");
                audioManager.PlaySFX("Mess");
            }
            else if (num == 34)
            {
                ShowSelection("다시 시도한다.");
                yield break;
            }
            else if (num == 35) // Window Fade Out(게임 부분으로)
            {
                story.transform.Find("Episode/WindowFadeOut").gameObject.SetActive(true);
                coroutineWindowFadeOut = StartCoroutine(gameManager.FadeInImage(0.5f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                StartCoroutine(gameManager.FadeOutMusic());
                yield return new WaitForSeconds(1);
                audioManager.PlaySFX("TSCStart");
                yield return new WaitForSeconds(1);
                SetDialogOn(false);
                momoi.transform.gameObject.SetActive(false);
                aris.transform.gameObject.SetActive(false);
                story.transform.Find("Episode/EpisodeBackground").GetComponent<Image>().sprite = episodeBackgroundImage.backgroundArray[2];
                StopCoroutine(coroutineWindowFadeOut);
                StartCoroutine(gameManager.FadeOutImage(0.5f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                yield return new WaitForSeconds(2);

                StartCoroutine(AppendTextOneByOne(story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>(), "< 무기 장착에 성공했습니다. >\n\n", 1));
                audioManager.PlaySFX("Message");
                yield return new WaitForSeconds(2f);

                audioManager.PlayBGM("MechanicalJungle");
                story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>().text += "<#FF656B>";
                StartCoroutine(AppendTextOneByOne(story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>(), "< 전투 발생! 전투 발생! >\n\n", 1));
                yield return new WaitForSeconds(2);
                story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>().text += "</color>";
                StartCoroutine(AppendTextOneByOne(story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>(), "< 야생의 푸니젤리가 나타났다! >\n\n", 1));
                yield return new WaitForSeconds(2);

                ShowSelection("푸니젤리에게 조심스럽게 접근한다.");
                yield break;
            }
            // 푸니젤리에게 조심스럽게 접근한다. (공통 루트)
            else if (num == 36)
            {
                SetDialogOn(false);
                yield return new WaitForSeconds(2);
                StartCoroutine(AppendTextOneByOne(story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>(), "< 오류 발생! 오류 발생! >\n\n", 1));
                audioManager.StopBGM();
                audioManager.PlaySFX("RobotTalk");
                yield return new WaitForSeconds(2);
                StartCoroutine(AppendTextOneByOne(story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>(), "< 심각한 오류 발생으로 시스템을 긴급 정지합니다. >\n\n", 1));
                audioManager.PlaySFX("RobotTalk");
                yield return new WaitForSeconds(2);
                ShowSelection("“!?”");
                yield break;
            }
            else if (num == 37)
            {
                SetDialogOn(true);
                audioManager.PlaySFX("Explode");
            }
            else if (num == 38)
            {
                SetCharacterImage(momoi, 4);
                momoi.transform.parent.GetComponent<RectTransform>().anchoredPosition = new Vector2(-700, 0);

                story.transform.Find("Episode/WindowFadeOut").gameObject.SetActive(true);
                coroutineWindowFadeOut = StartCoroutine(gameManager.FadeInImage(0.5f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                yield return new WaitForSeconds(2);
                SetDialogOn(false);
                momoi.SetActive(true);
                story.transform.Find("Episode/WindowText").GetComponent<TMP_Text>().text = "";

                story.transform.Find("Episode/EpisodeBackground").GetComponent<Image>().sprite = episodeBackgroundImage.backgroundArray[1];
                StopCoroutine(coroutineWindowFadeOut);
                StartCoroutine(gameManager.FadeOutImage(0.5f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                yield return new WaitForSeconds(2);
                // 흙먼지 연출?

                SetDialogOn(true);
                momoi.GetComponent<Animator>().Play("Shiver");
                momoi.transform.Find("MessParent/Mess").GetComponent<Animator>().Play("Mess");
                audioManager.PlaySFX("Mess");

                audioManager.PlayBGM("MischievousStep");
            }
            else if (num == 39)
            {
                SetCharacterImage(midori, 7);
                midori.transform.parent.GetComponent<RectTransform>().anchoredPosition = new Vector2(600, 0);

                midori.SetActive(true);
                midori.GetComponent<Animator>().Play("Jumping");
                midori.transform.Find("TalkingParent/Talking").GetComponent<Animator>().Play("Talking");
                audioManager.PlaySFX("Talking");
            }
            else if (num == 40)
            {
                SetCharacterImage(yuzu, 8);
                SetCharacterImage(aris, 4);
                momoi.SetActive(false);
                midori.SetActive(false);
                aris.SetActive(true);
                yuzu.SetActive(true);
                yuzu.transform.parent.GetComponent<RectTransform>().anchoredPosition = new Vector2(-700, 0);
                aris.transform.parent.GetComponent<RectTransform>().anchoredPosition = new Vector2(600, 0);

                yuzu.GetComponent<Animator>().Play("Shiver");
                yuzu.transform.Find("MessParent/Mess").GetComponent<Animator>().Play("Mess");
                audioManager.PlaySFX("Mess");
            }
            else if (num == 41)
            {
                SetCharacterImage(aris, 4);
                aris.GetComponent<Animator>().Play("Shiver");
                aris.transform.Find("MessParent/Mess").GetComponent<Animator>().Play("Mess");
                audioManager.PlaySFX("Mess");
            }
            else if (num == 42)
            {
                ShowSelection("정신이 흐려진다……");
                yield break;
            }
            else if (num == 43)
            {
                audioManager.StopBGM();
                SetDialogOn(false);
                story.transform.Find("Episode/WindowFadeOut").gameObject.SetActive(true);
                // 화면 깜빡이는 연출
                coroutineWindowFadeOut = StartCoroutine(gameManager.FadeInImage(0.5f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                yield return new WaitForSeconds(0.5f);

                StopCoroutine(coroutineWindowFadeOut);
                coroutineWindowFadeOut = StartCoroutine(gameManager.FadeOutImage(0.3f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                yield return new WaitForSeconds(0.5f);

                StopCoroutine(coroutineWindowFadeOut);
                coroutineWindowFadeOut = StartCoroutine(gameManager.FadeOutImage(0.01f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                yield return new WaitForSeconds(0.2f);

                StopCoroutine(coroutineWindowFadeOut);
                coroutineWindowFadeOut = StartCoroutine(gameManager.FadeInImage(0.5f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                yield return new WaitForSeconds(0.5f);

                StopCoroutine(coroutineWindowFadeOut);
                coroutineWindowFadeOut = StartCoroutine(gameManager.FadeOutImage(0.3f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                yield return new WaitForSeconds(0.5f);

                StopCoroutine(coroutineWindowFadeOut);
                coroutineWindowFadeOut = StartCoroutine(gameManager.FadeOutImage(0.01f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                yield return new WaitForSeconds(0.2f);

                StopCoroutine(coroutineWindowFadeOut);
                coroutineWindowFadeOut = StartCoroutine(gameManager.FadeInImage(0.5f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                yield return new WaitForSeconds(2);

                // 앞을 가리는 WindowFadeOut 감추기
                story.transform.Find("Episode/EpisodeBackground").GetComponent<Image>().sprite = episodeBackgroundImage.backgroundArray[0];
                story.transform.Find("Episode/EpisodeBackground").GetComponent<Image>().color = Color.black;
                StartCoroutine(gameManager.FadeOutImage(4f, story.transform.Find("Episode/WindowFadeOut").GetComponent<Image>()));
                yuzu.SetActive(false);
                aris.SetActive(false);
                audioManager.PlaySFX("KnockDown");
                yield return new WaitForSeconds(1);

                // 쓰러지는 소리
                SetDialogOn(true);
                dialog.GetComponent<TMP_Text>().fontSize = 60;
                audioManager.PlaySFX("Confuse");
            }
            else if (num == 44) // 메인화면으로 이동
            {
                gameManager.StoryEnd();
            }
            // 1장 종료
        }
        isCanProgress = true;

        StoryText();
    }

 

 

3. Silence, Mess 애니메이션 추가

말풍선에 "..." 표시가 나오며 생각하거나 침묵하는 것 같은 애니메이션과 엉킴 모션이 움직이는 애니메이션을 추가했다. 엉킴모션은 움직이는 Spine이 있어야 하지 않으려나 싶었는데, 자세히 보니 그냥 Scale과 Rotation만 조금 만져주면 비슷하게 될 것 같아서 대충 만져보니 비슷한 느낌으로 나왔다. 완벽히 똑같지는 않지만... 이것 외에도 대화창 오른쪽 아래 삼각형이나, 대화 도중 캐릭터가 검은색으로 등장하거나 사라지는 연출 등도 빼먹었다. 나중에 완성하고나서 디테일적인 부분을 수정할까 생각 중이다.

 

 

결과적으로 오늘 완성된 부분은 다음과 같다.

선택지는 블루 아카이브처럼 어떤 것을 선택하느냐에 따라 큰 영향을 주지는 않게 만들었다. 모모이가 시키는대로 하면 스토리 전체를 다 볼 수 있을 것이다. 그래서 그 부분을 녹화했다.

지금은 스토리가 종료되면 메인화면으로 돌아가는데, 추후 챕터를 고르는 화면을 만들고 그 화면으로 돌아가도록 변경할 예정이다. 이 화면에서 다시 1장으로 들어가도 정상적으로 진행되도록 수정을 할 것이다.

그 다음은 2장을 만들 예정이다. 2장은 언뜻 보기에 다른 세계로 간다는 설정이기 때문에 블루 아카이브의 기본 일러스트와는 다른 일러스트를 쓸 생각이다. 그래서 AI그림을 활용해서 블루 아카이브랑 비슷한 느낌의 그림을 뽑아내야겠다. 표정은 직접 그릴 수 없으니 블루 아카이브에서 사용된 캐릭터들의 표정을 활용해야겠다. 또, 2, 3, 4장에서 플레이 할 게임들의 구상을 하고 리소스를 어떻게 만들 것인지에 대해서도 생각해야겠다. 내일 저녁에 부산으로 내려갈 예정이니 아마 일요일 혹은 월요일까지는 개발보다는 기획과 시나리오를 짜게 될 것 같다. 그래서 아마 10번째 개발 일지는 일요일이나 월요일 쯤에 올릴 것 같다. 생각해보니 처음에는 개발, 잡담, 번역 세 개를 골고루 올리려고 했는데 개발에 집중하다보니 밸런스가 완전히 깨졌다. 이 부분을 조금 적어보는 것도 괜찮을 것 같다.

+ Recent posts