대화 때문에 걱정을 계속 했었는데
머리로 생각한대로 구현이 돼서 다행이다.
알림시스템과 레벨업
처음엔 알림을 한개로 했었는데 알림이 많을경우에 너무 오래 밀리는 현상이 있었다.
그래서 알림창 2개를 두고 알려주도록 바꿨다.
그리고 레벨업을 하면 화면에 레벨업이 크게 뜨고 효과음이 나오게 처리했다.
레벨이 Set될때 프로퍼티에서 바로 레벨업 함수를 쓸 수 있게 델리게이트로 넘겨주어 사용했다.
사냥터 진입 금지
첫번째 퀘스트를 받지 않으면 막아두고 퀘스트를 받으라는 알림을 뜨게 했다.
만약 이미 첫번째 퀘스트를 깨고 저장해서 불러올때는 awake때 깼는지를 확인하여 길을 열어준다.
대화 시스템 준비
예전에 구현을 살짝 해놨었지만 맘에 안들어서 다 지워버리고 다시 시작했다.
엑셀로 인덱스,캐릭터, 대화 내용을 적어서 csv파일로 만들었다.
일단 '\n' 로 행을 순서대로 다 잘라줘야 하기 때문에 엔터 대신에 ' ` ' 를 썼다.
csv파일은 쉼표로 열을 잘라주기 때문에 대화에 쉼표는 넣지 않았다.
*는 퀘스트를 물어보는 대화이다. 대화를 진행하다 *를 만나면 퀘스트를 진행할건지 물어보게 했다.
private void Awake()
{
TextAsset Dialogue = Resources.Load("Dialogue1") as TextAsset;
string[] firstData = Dialogue.text.Split('\n');
for(int i=1; i<firstData.Length;i++)
{
string[] SecondData = firstData[i].Split(',');
Story.Add(int.Parse(SecondData[0]), SecondData);
}
}
저번이랑 똑같은 코드다.
1.
csv파일을 불러와서 일단 엔터를 기준으로 다 잘라버린다
그러면 이제 1번 행부터 순서대로 FirstData에 들어간다.
2.
그리고 이 행을 쉼표를 기준으로 다 자르면 엑셀기준 A2,B2,C2 이런식으로 순서대로 값이 스트링 배열에 들어간다.
그래서 for문으로 돌면서 FirstData값을 가져와서
Story라는 <int,string[]>형 딕셔너리에 스트링배열의 첫번째값을 키로 쓸 수 있게 넣어주었다.
엑셀에 A1,A2..에 적어둔 인덱스가 키값이다.
즉, Story[key]로 스트링 배열을 받으면 그 스트링배열의 0번 인덱스가 키값이다.
그리고 for문을 0부터 돌면 엑셀의 첫번째 행(인덱스,캐릭터,대화)을 잘라서 int.parse를 하기때문에 데이터 타입이 안맞아서 에러가뜨니 주의 해야 한다.
그리고 이 스트링배열의 1번 인덱스를 대화창 왼쪽위에 이름으로 설정했다.
public void SetDialogue(int index)
{
MyChat = Story[index];
CharName.text = MyChat[1];
StartDialogue();
}
이런식으로 키값을 넣으면 자동으로 대화가 시작되게끔 구현했다.
저장할 수 있는 게임데이터에서 Storyprocess라는 변수를 만들어서 쓰고있는데,
나중에 저장하고 불러오더라도 그 진행상황 부터의 대화를 할 수 있다.
if (MyChat[ChatFirstIndex].Contains('*'))
{
IsQuest = true;
MissionButton.SetActive(true);
NextArrow.gameObject.SetActive(false);
}
string.Contain()를 사용하여 퀘스트를 검사했다.
이런식으로 대화에 *가 들어있으면 퀘스트를 물어보게끔 만들었다.
string A = MyChat[ChatFirstIndex].Replace('`', '\n');
그리고 아까 엔터를 대체해서 ' ` ' 를 썼는데, 이것을 Replace 함수를 써서 '\n'로 바꿔주어 출력하게 했다.
대화 시스템 구현
퀘스트1 거절
(리틀넛은 납치된 여자친구를 구하러 달에 온 설정이다)
이런식으로 대화를 출력해 주었고, 거절을 하면 대화인덱스를 그대로 냅둬서 거절했을때 멘트가 나오게 했다.
퀘스트1 수락
수락을하면 대화인덱스를 +1하여 위에 올려둔 SetDialogue함수를 호출 했다.
새로운 대화를 출력하고 퀘스트 UI가 오른쪽 상단에 뜨게 만들었다
안가면 뭐라한다.
퀘스트 UI
퀘스트는 대화 인덱스에서 +10을 인덱스로 써서 엑셀에 작성해놨다.
그래서 퀘스트가 있으면 퀘스트 탭 텍스트들은 [대화 인덱스 +10]을 딕셔너리 키로 써서 불러오면 된다.
퀘스트 완료 조건
퀘스트 조건을 어떻게 완료시켜야 할까 생각을 좀 해봤는데
일단은 두더지가 죽었다는것은 두더지가 오브젝트 풀로 반납이 되었다는 소리기 때문에,
퀘스트 매니저에 함수를 만들어두고
퀘스트가 있는 상황에서 두더지가 풀에 반납될때 콜백되도록 만들었다.
근데 맘에 안들어서 다른 방법을 생각중이다.
퀘스트 완료 대화(거절)
퀘스트를 완료하면 대화 인덱스가 늘어나기 때문에 바로 다음 대화를 출력한다.
퀘스트 완료 대화(새로운 퀘스트 수락)
두번째 퀘스트 부터는 설정을 제대로 안해놔서 퀘스트 UI가 이상하게 나온다.
마치며
퀘스트는 총 4개라서 대충 어거지로 짜면 결과는 금방 나온다.
하지만 퀘스트가 4개가 아니라 퀘스트가 100개여도 자동으로 처리가 될 수 있게끔 데이터랑 인게임을 구현을 해야 하기 때문에 생각이 많다.
대화는 다 만들어놨고 어차피 퀘스트 시스템은 조건만 넣어주면 끝이기 때문에
내일부터는 몬스터 맵 배치, 중간보스를 구현 할 예정이다.
이 진행속도라면 30일차 전에 계획한건 다 끝날지도 모르겠다.
그랬으면 좋겠다.
개인포폴 19일차 작업 끝
'개발일지 > Unity 개인 포트폴리오 개발일지' 카테고리의 다른 글
New 포폴 2,3일차 / 애니메이션에 열중하기 (0) | 2022.07.10 |
---|---|
R.I.P 리틀넛 .. 새로운 시작 (0) | 2022.07.08 |
개인포폴 18일차 / 오브젝트 풀링 & 상점 구현 (0) | 2022.07.04 |
개인포폴 17일차 / 장비장착 & 퀵슬롯 기능들 구현 (0) | 2022.07.03 |
개인포폴 16일차 / 자잘한 작업들 (0) | 2022.07.02 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!