일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 노션꿀팁
- JSX
- 블루투스마이크
- 깃허브 커밋
- 노션활용
- animatorcontroller
- 마이크작동
- React
- button onclick
- unrelated histories
- 1인 게임개발
- 갤럭지버즈+
- 노션관계형
- 커밋
- 유니티
- notion
- 깃허브오류
- 노션가계부
- 깃허브
- 깃허브 #깃명령어
- 노션
- Relation
- 노션으로 가계부쓰기
- 마이크작동안됨
- props
- RPG게임
- unity
- flutter오류#flutter#flutter초기세팅
- button
- Today
- Total
광산김가네
[모각코][Unity/유니티]0821 TIL_퀘스트 기능 구현 마무리 , 서브메뉴, 저장기능 만들기 본문
[모각코][Unity/유니티]0821 TIL_퀘스트 기능 구현 마무리 , 서브메뉴, 저장기능 만들기
어둠의 그림자 2021. 8. 22. 17:35오늘은 저번시간에 이어서 퀘스트 기능 구현, 그리고 서브메뉴와 저장기능을 생성해보겠습니다.
1. 퀘스트 기능
1-a) keynotfound ,talkData 논리적오류 해결_ GetTalk 함수 수정(talkmanager.cs)
퀘스트 기능 구현 진행중,
npc외의 다른 스프라이트에 조사를하면(스페이스바를 누르면)
코드 진행흐름 중간중간에 debug.log를 넣어서 문제가 있는 코드를 고치려고했다.
코드 진행순서))
spacbar input (player.cs ) -> Action함수 호출(gamemanager.cs) -> Talk(id,npc)함수 호출(gamemanager.cs)
[Talk함수]
- talkText.text = talkData(GetTalk 함수로 선언;talkmanager.cs)//퀘스트관련 대화 추출
- questTalk.text = questManager.CheckQuest(id); (questmanager.cs)//퀘스트 제목 추출
- talkIndex,questIndex 변화
int questTalkIndex = questManager.GetQuestTalkIndex(id);
string talkData = talkManager.GetTalk(id+questTalkIndex , talkIndex);
여기서 위에 코드에서 GetTalk의 인자로 id+questTalkIndex를 넣어줬는데 이때 npc외의 다른 스프라이트들은 따로 questTalkIndex를 설정해주지않아 keyerror가 발생했다.
또한, 퀘스트진행에 필요하지않은 npc에게 조사(스페이스바)를 했을때 talkData에 데이터가 없을때 앞서 저장한 대화를 불러오기위해 GetTalk의 함수를 아래와 같이 수정해주었다.
public string GetTalk(int id, int talkIndex)
{
if(!talkData.ContainsKey(id)){
if(!talkData.ContainsKey(id-id%10))
return GetTalk(id-id%100,talkIndex);//Get First Talk
else
return GetTalk(id-id%10,talkIndex);//Get First Quest Talk
}
if(talkIndex == talkData[id].Length)
return null;
else
return talkData[id][talkIndex];
}
1-b) 퀘스트 넘어가기, 아이템 줍기 기능
퀘스트를 추가로 생성했을때에, 앞서 생성한 퀘스트에서 다음퀘스트로 넘어가지 못하는 에러와,
퀘스트 관련된 오브젝트의 활성화 여부를 관리해줄수있는 기능이 필요햇다.
따라서 questId와 questActionIndex의 변수를 초기화시켜주는 NextQuest()함수와 퀘스트 오브젝트를 관리해주는 ControlObject()함수를 추가로 생성해주고, CheckQuest()함수에서 실행시켜주었다.
+) <루도 도와주기>퀘스트에서 아이템을 주은것처럼 구현하기위해 index에 따라 오브젝트의 활성화를 조절해주었다.
void NextQuest(){
questId += 10;
questActionIndex = 0;
}
public void ControlObject(){
switch(questId){
case 10:
if(questActionIndex==2)
questObject[0].SetActive(true);
break;
case 20:
if(questActionIndex ==0)
questObject[0].SetActive(true);
else if(questActionIndex==1)
questObject[0].SetActive(false);
break;
}
public string CheckQuest(int id){
//Control Quest Object
if( id == questList[questId].npcId[questActionIndex])
questActionIndex++;
ControlObject();
if (questActionIndex == questList[questId].npcId.Length)
NextQuest();
return questList[questId].questName;
}
1-c) 퀘스트 기본 구성
//퀘스트 데이터 생성함수
void GenerateData()
{
talkData.Add(1000,new string[]{"안녕?:0",
"여긴 무인도야:1",
});
talkData.Add(2000,new string[]{"여어:1",
"이곳을 나갈수있을까..:0"});
talkData.Add(100,new string[]{"평범한 나무이다"});
talkData.Add(10,new string[]{"평범한 꽃이다",});
//Quest Talk
talkData.Add(10+1000, new string[] {"안녕?:0",
"무인도에 온걸 환영해ㅎㅎ:1",
"내 옆에 있는 루도한테 한번 말을 걸어볼래?:0"});
talkData.Add(11+2000, new string[] {"ㅎㅇㅎㅇ내가 루도야:0",
"이곳에 처음왔구나?:1",
"그좀 도와줄게 있는데..:0"
,"저기있는 꽃좀 갖다줄래?:1"});
talkData.Add(20+1000, new string[] {"꽃이 어딨냐고?:3",
"누구한테 줄려고..:2",
"밑에 쭉 내려가봐:1",});
talkData.Add(20+2000, new string[] {"찾으면 꼭꼭 갖다줘:1"
,});
talkData.Add(20+10, new string[] {"꽃을 발견했다",});
talkData.Add(21+2000, new string[] {"찾았구나!고마워:2",});
}
2.서브메뉴_저장, 게임종료, 계속하기 기능 추가
이렇게 특정한 입력을 주면 게임진행을 저장,계속, 혹은 종료할수있는 서브메뉴를 구현해보았다.
2-a) ui 설정
위의 그림과 같이 대화창을 생성할때 생성된 canvas에 menu set라는 빈 오브젝트를 생성하여 필요한 버튼, panel, 텍스트를 생성해주었다.
2-b) button onClick 및 스크립트 수정
button onClick 기능
button ui 스프라이트에 내재되어있는 기능으로 위의 사진처럼 스크립트에서 설정해준 함수와 연결시켜줄수있고, 기본적인 함수(ex. SetActive 함수)를 설정해줄수있다.
위의 기능으로 계속하기(-> menuSet을 비활성화 시키기), 종료하기(-> gamemanager.gaemExit함수를 호출) 버튼을 설정해주었다.
저장하기 기능의 경우 PlayerPrefs에 저장해주고, 데이터를 불러와야하는 등의 과정이 있기때문에 스크립트에 추가해주었다.
gamemanger.cs
public void GameSave(){
PlayerPrefs.SetFloat("PlayerX", player.transform.position.x);
PlayerPrefs.SetFloat("PlayerY", player.transform.position.y);
PlayerPrefs.SetInt("QuestId", questManager.questId);
PlayerPrefs.SetInt("QuestActionIndex", questManager.questActionIndex);
PlayerPrefs.Save();
}
public void GameLoad(){
if(!PlayerPrefs.HasKey("PlayerX"))
return;
float x = PlayerPrefs.GetFloat("PlayerX");
float y = PlayerPrefs.GetFloat("PlayerY");
int questId = PlayerPrefs.GetInt("QuestId");
int questActionIndex = PlayerPrefs.GetInt("QuestActionIndex");
player.transform.position = new Vector3(x,y,0);
questManager.questId = questId;
questManager.questActionIndex = questActionIndex;
questManager.ControlObject();
}
//종료하기 버튼을 눌렀을때 해당 함수를 호출해주었다
public void GameExit()
{
Application.Quit();
}
'TIL(Today I Learn)' 카테고리의 다른 글
[Flutter]오류 해결방법 모음 (0) | 2022.01.20 |
---|---|
[모각코][Unity/유니티]0825 TIL_인벤토리 기능 구현하기 (0) | 2021.08.27 |
[모각코][Unity/유니티]0818 TIL_퀘스트 기능 구현하기 (0) | 2021.08.20 |
[모각코][Unity/유니티]0814 TIL_애니메이션 구현, 맵 탐색 기능 추가 (0) | 2021.08.16 |
[모각코][Unity/유니티]0811 TIL_npc_ 대화창 구현하기 (0) | 2021.08.13 |