오늘의 목표는 연속 클릭시 발생하는 오류 조치와, 불러오기or챕터 선택 중에 결정하는 것, 아리스와 유즈의 헤일로 작업 마무리, 일부 감정 표현을 따와 애니메이션 적용, 메뉴, 오토 기능 추가, 스토리 20번까지 진행이었다.
아쉽게도 오늘은 전부 달성하지는 못했다. 엊그제 과식을 좀 해서 어제부터 속이 조금 불편했는데, 오늘은 꽤나 불편해서 병원에 다녀오고 좀 쉬었다. 주말이기도 하고 하루쯤 쉴까 싶기도 했는데, 쉬면서 다른 거 하는 것보다 개발하는 게 재밌어서 결국 짬짬이 손을 좀 댔다. 그래서 오늘 목표 중 앞의 3개 정도는 해냈다.
1. 연속 클릭 시 발생하는 오류 조치
어제 만들었던 변수 중에 isStoryProgressing이 있었는데, 한 글자씩 나오는 기능이 수행되고 있을 때는 true, 아니면 false으로 설정되는 변수다. 이 변수가 true일 때 StoryAction에서 액션 기능을 건너뛰도록 했다.
private IEnumerator StoryAction(int num)
{
if(!isStoryProgressing)
{
if (num == 0)
{
audioManager.PlaySFX("Silence");
}
else if (num == 1)
{
//audioManager.PlaySFX("Silence");
}
else if (num == 2)
{
//audioManager.PlaySFX("Silence");
}
else if (num == 3)
{
dialog.GetComponent<TMP_Text>().fontSize = 60;
audioManager.PlaySFX("Start");
}
else if (num == 4)
{
momoi.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("Halo").GetComponent<Image>()));
audioManager.PlayBGM("PixelTime");
isCanProgress = false;
yield return new WaitForSeconds(1.5f);
dialog.GetComponent<TMP_Text>().fontSize = 42.5f;
momoi.transform.Find("Talking").GetComponent<Animator>().Play("Talking");
momoi.GetComponent<Animator>().Play("Jumping");
audioManager.PlaySFX("Talking");
isCanProgress = true;
}
else if (num == 5)
{
midori.GetComponent<RectTransform>().anchoredPosition = new Vector2(625, 0);
momoi.GetComponent<RectTransform>().DOLocalMoveX(-700, 0.5f); // left side : -700
midori.transform.Find("CharacterImage").GetComponent<Image>().color = Color.white;
StartCoroutine(gameManager.FadeInImage(1f, midori.transform.Find("Halo").GetComponent<Image>()));
}
}
StoryText();
}
2. 불러오기or챕터 선택 중에 결정
불러오기는 어떤 캐릭터가 화면에 있는지, 보여지는지 상태와 좌표 등을 저장하고 불러와야하나, 고민을 많이 했다. 그러면 게임이 길어질테니 옵션창도 따로 만들어야 할 걸 생각하니 좀 힘들 것 같았다. 근데 그냥 블루 아카이브처럼 챕터 별로 나누면 메뉴도 단순해질 것이고, 불러오기에 대한 부담도 많이 줄어들 것 같아서 챕터 선택 방식으로 하기로 결정했다.
3. 아리스와 유즈의 헤일로 작업 마무리
다행히 유즈는 헤일로가 위에 떠있어서 쉽게 작업을 했고, 아리스는 안보이는 부분을 그리느라 좀 힘들었지만 어차피 거의 보이지 않는 부분이다보니 대충 그려서 넣어서 4명의 캐릭터 일러스트를 전부 등록했다.
여기서부터는 추가로 한 것이다.
1. 캐릭터 어두워지는 효과 추가
한 캐릭터가 대사를 말할 때 다른 캐릭터의 일러스트가 어두워지는 효과가 있는데, 이 효과를 따로 설정하지 않고 텍스트 박스를 출력할 떄 캐릭터 이름으로 구별하여 자동으로 적용되도록 했다. 좀 길어서 보기가 지저분한데 따로 빼는 것이 나을 지도 모르겠다.
private IEnumerator CoroutineSetTextBox(int num)
{
if (characterNameList.Count <= num) yield break;
// 이름 길이에 따라 소속 표시 위치 변경
if (characterName.GetComponent<TMP_Text>().text.Length != characterNameList[num].Length) // 이름 길이가 변경되었을 때만 동작
{
if (characterNameList[num].Length == 2)
{
departmentName.GetComponent<RectTransform>().anchoredPosition = new Vector2(-457, departmentName.GetComponent<RectTransform>().anchoredPosition.y);
}
else if (characterNameList[num].Length == 3)
{
departmentName.GetComponent<RectTransform>().anchoredPosition = new Vector2(-405, departmentName.GetComponent<RectTransform>().anchoredPosition.y);
}
}
// 얘기하고 있지 않은 학생의 이미지를 어둡게 변경
if (characterNameList[num] == "모모이")
{
momoi.transform.Find("CharacterImage").GetComponent<Image>().color = new Color(255, 255, 255, momoi.transform.Find("CharacterImage").GetComponent<Image>().color.a);
momoi.transform.Find("Halo").GetComponent<Image>().color = new Color(1, 1, 1, momoi.transform.Find("Halo").GetComponent<Image>().color.a);
midori.transform.Find("CharacterImage").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, midori.transform.Find("CharacterImage").GetComponent<Image>().color.a);
midori.transform.Find("Halo").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, midori.transform.Find("Halo").GetComponent<Image>().color.a);
aris.transform.Find("CharacterImage").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, aris.transform.Find("CharacterImage").GetComponent<Image>().color.a);
aris.transform.Find("Halo").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, aris.transform.Find("Halo").GetComponent<Image>().color.a);
yuzu.transform.Find("CharacterImage").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, yuzu.transform.Find("CharacterImage").GetComponent<Image>().color.a);
yuzu.transform.Find("Halo").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, yuzu.transform.Find("Halo").GetComponent<Image>().color.a);
}
else if(characterNameList[num] == "미도리")
{
momoi.transform.Find("CharacterImage").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, momoi.transform.Find("CharacterImage").GetComponent<Image>().color.a);
momoi.transform.Find("Halo").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, momoi.transform.Find("Halo").GetComponent<Image>().color.a);
midori.transform.Find("CharacterImage").GetComponent<Image>().color = new Color(1, 1, 1, midori.transform.Find("CharacterImage").GetComponent<Image>().color.a);
midori.transform.Find("Halo").GetComponent<Image>().color = new Color(1, 1, 1, midori.transform.Find("Halo").GetComponent<Image>().color.a);
aris.transform.Find("CharacterImage").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, aris.transform.Find("CharacterImage").GetComponent<Image>().color.a);
aris.transform.Find("Halo").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, aris.transform.Find("Halo").GetComponent<Image>().color.a);
yuzu.transform.Find("CharacterImage").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, yuzu.transform.Find("CharacterImage").GetComponent<Image>().color.a);
yuzu.transform.Find("Halo").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, yuzu.transform.Find("Halo").GetComponent<Image>().color.a);
}
else if(characterNameList[num] == "아리스")
{
momoi.transform.Find("CharacterImage").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, momoi.transform.Find("CharacterImage").GetComponent<Image>().color.a);
momoi.transform.Find("Halo").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, momoi.transform.Find("Halo").GetComponent<Image>().color.a);
midori.transform.Find("CharacterImage").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, midori.transform.Find("CharacterImage").GetComponent<Image>().color.a);
midori.transform.Find("Halo").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, midori.transform.Find("Halo").GetComponent<Image>().color.a);
aris.transform.Find("CharacterImage").GetComponent<Image>().color = new Color(255, 255, 255, aris.transform.Find("CharacterImage").GetComponent<Image>().color.a);
aris.transform.Find("Halo").GetComponent<Image>().color = new Color(1, 1, 1, aris.transform.Find("Halo").GetComponent<Image>().color.a);
yuzu.transform.Find("CharacterImage").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, yuzu.transform.Find("CharacterImage").GetComponent<Image>().color.a);
yuzu.transform.Find("Halo").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, yuzu.transform.Find("Halo").GetComponent<Image>().color.a);
}
else if(characterNameList[num] == "유즈")
{
momoi.transform.Find("CharacterImage").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, momoi.transform.Find("CharacterImage").GetComponent<Image>().color.a);
momoi.transform.Find("Halo").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, momoi.transform.Find("Halo").GetComponent<Image>().color.a);
midori.transform.Find("CharacterImage").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, midori.transform.Find("CharacterImage").GetComponent<Image>().color.a);
midori.transform.Find("Halo").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, midori.transform.Find("Halo").GetComponent<Image>().color.a);
aris.transform.Find("CharacterImage").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, aris.transform.Find("CharacterImage").GetComponent<Image>().color.a);
aris.transform.Find("Halo").GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f, aris.transform.Find("Halo").GetComponent<Image>().color.a);
yuzu.transform.Find("CharacterImage").GetComponent<Image>().color = new Color(1, 1, 1, yuzu.transform.Find("CharacterImage").GetComponent<Image>().color.a);
yuzu.transform.Find("Halo").GetComponent<Image>().color = new Color(1, 1, 1, yuzu.transform.Find("Halo").GetComponent<Image>().color.a);
}
characterName.GetComponent<TMP_Text>().text = characterNameList[num];
departmentName.GetComponent<TMP_Text>().text = departmentNameList[num];
dialog.GetComponent<TMP_Text>().text = "";
isStoryProgressing = true;
float textSpeed = textSpeedList[num];
for (int i = 0; i < dialogList[num].Length; i++)
{
dialog.GetComponent<TMP_Text>().text += dialogList[num][i];
yield return new WaitForSeconds(0.05f / textSpeed);
}
storyNum++;
isStoryProgressing = false;
}
2. 스토리 내에서 캐릭터 움직임을 구현하기 위해 DOTween 사용
스토리 하나하나마다 매 번 애니메이션을 만들 수는 없는 노릇이다보니 DOTween을 사용하기로 했다. 예전에 사용하기도 했었던 cocos에서는 tween을 기본적으로 사용했던 것 같은데, 유니티에는 따로 Asset Store에서 받아야만 했다. 아무튼, 덕분에 스토리 진행할 때 애니메이션을 추가하기가 많이 편할 것 같다. 그런데 코드가 약간 지저분한 것 같기도 해서 어떻게 바꿀 수 있는 좋은 방법이 있으려나, 싶은 생각이 든다.
// 스토리 진행시 텍스트 외에 캐릭터 움직임, 효과음 등을 관리하는 파트
private IEnumerator StoryAction(int num)
{
if(!isStoryProgressing)
{
if (num == 0)
{
audioManager.PlaySFX("Silence");
}
else if (num == 1)
{
//audioManager.PlaySFX("Silence");
}
else if (num == 2)
{
//audioManager.PlaySFX("Silence");
}
else if (num == 3)
{
dialog.GetComponent<TMP_Text>().fontSize = 60;
audioManager.PlaySFX("Start");
}
else if (num == 4)
{
momoi.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("Halo").GetComponent<Image>()));
audioManager.PlayBGM("PixelTime");
isCanProgress = false;
yield return new WaitForSeconds(1.5f);
dialog.GetComponent<TMP_Text>().fontSize = 42.5f;
momoi.transform.Find("Talking").GetComponent<Animator>().Play("Talking");
momoi.GetComponent<Animator>().Play("Jumping");
audioManager.PlaySFX("Talking");
isCanProgress = true;
}
else if (num == 5)
{
midori.GetComponent<RectTransform>().anchoredPosition = new Vector2(625, 0); // right side : 625
momoi.GetComponent<RectTransform>().DOLocalMoveX(-700, 0.5f); // left side : -700
midori.transform.Find("CharacterImage").GetComponent<Image>().color = Color.white;
StartCoroutine(gameManager.FadeInImage(1f, midori.transform.Find("Halo").GetComponent<Image>()));
}
else if (num == 6)
{
midori.gameObject.SetActive(false);
momoi.gameObject.SetActive(false);
aris.transform.Find("CharacterImage").GetComponent<Image>().color = Color.white;
aris.transform.Find("Halo").GetComponent<Image>().color = Color.white;
aris.GetComponent<RectTransform>().anchoredPosition = new Vector2(625, 0); // right side : 625
yuzu.transform.Find("CharacterImage").GetComponent<Image>().color = Color.white;
yuzu.transform.Find("Halo").GetComponent<Image>().color = Color.white;
yuzu.GetComponent<RectTransform>().anchoredPosition = new Vector2(-700, 0); // left side : -700
}
else if (num == 7)
{
}
else if (num == 8)
{
momoi.GetComponent<RectTransform>().anchoredPosition = new Vector2(0, 0);
momoi.gameObject.SetActive(true);
aris.gameObject.SetActive(false);
yuzu.gameObject.SetActive(false);
}
}
StoryText();
}
어제와 크게 변한 것은 없지만 오늘까지 완성된 부분이다.
어제 만들었던 스토리에서 시작해서 테스트하는 기능을 적용해서 빌드했다.
아직 유즈와 아리스가 나오는 부분에는 효과가 적용되지 않은 상태이다.
내일은 오늘 목표였던 일부 감정 표현을 따와 애니메이션 적용, 메뉴, 오토 기능 추가, 스토리 20번까지 진행 정도는 마치고 싶다. 그리고, 캐릭터의 일러스트를 변경하는 함수나 이동도 좀 더 편리하게 사용할 수 있는 함수를 만들면 괜찮지 않을까 생각도 든다. 그 다음에는 메인화면에서 챕터를 고르는 기능을 추가해야겠다.
'개발 > 개발일지' 카테고리의 다른 글
Tales Saga Chronicle Blast 개발일지 7 - 선택지 버튼 추가, 애니메이션 수정 등 / 중간 점검 녹화 (1) | 2023.01.17 |
---|---|
Tales Saga Chronicle Blast 개발일지 6 - AUTO/MENU 버튼, 애니메이션 추가 등 (0) | 2023.01.16 |
Tales Saga Chronicle Blast 개발일지 4 - 이미지 수정, 효과음, 대화, 일러스트, 애니메이션 등 (0) | 2023.01.14 |
Tales Saga Chronicle Blast 개발일지 3 - 이미지 수정, 효과음, 옵션 등 (2) | 2023.01.13 |
Tales Saga Chronicle Blast 개발일지 2 - 인트로 화면, 메인 화면 (0) | 2023.01.12 |