2D TOPDOWN 오브젝트,NPC

재이리 ㅣ 2023. 4. 25. 19:00

오브젝트 및 NPC 를 생성해 주었다

좌부터 

NPC루나,루도, 상자,책상이다 

 

따로 DB를 쓰지않기 때문에 DICTONERY를 사용하여 상호작용할 대화등을 받아오기 위하여

    public int id;
    public bool isNpc;

스크립트에 정수형 Id와 bool 형 isNpc를 만들어 주어 각 오브젝트에 적용을 해주었다.

책상은 100

상자는 200

NPC루나는 1000

NPC루도는 2000

 

그리고 TalkManager 라는 스크립트를 생성하여 Dictionary를 생성해주어 해당하는 uid와 대화를 넣어주었다.또한

npc에서 10번 단위로 퀘스트를 넣어주어 대화를 진행할 수 있도록 하였다 .(근데 이방법은 웬만하면 db를 쓰는게 나을듯)

    void GenerateData()
    {

        //Talk Data
        //루나 :1000 루도 :2000
        //책상 :100 상자 :200
        talkData.Add(100, new string[] { "그냥 책상이다. " });
        talkData.Add(200, new string[] { "무언가가 들어있는 상자이다. " });
        talkData.Add(1000, new string[] { "안녕!! 내이름은 루나야 :0 ", "여기에 처음왔구나? :1","저쪽으로 가봐~:2" });
        talkData.Add(2000, new string[] { "반갑다! 내이름은 루도 :0 ", "상자를 눌러보렴 :1" });

        //Quest Data
        talkData.Add(10+1000, new string[] { "어서와 :0 ", "우리 마을의 전설에 대해 알아? :1", "루도한테 물어봐:2" });

        talkData.Add(11 + 2000, new string[] { "너 우리마을의 전설 들었니? :0 ", "맞아 내가 루나한테 말해줬어 :1", "그런데 그전에 내 동전좀 찾아줘 :2" });

       
        talkData.Add(20 + 2000, new string[] { "동전좀 찾아줘 부탁할게 :1" });

        talkData.Add(20 + 5000, new string[] { "동전을 찾았다" });
        talkData.Add(21 + 2000, new string[] { "찾아줘서 고마워 :2" });



        //Portrait Data
        portraitData.Add(1000 + 0, portraitArr[0]);
        portraitData.Add(1000 + 1, portraitArr[1]);
        portraitData.Add(1000 + 2, portraitArr[2]);
        portraitData.Add(1000 + 3, portraitArr[3]);

        portraitData.Add(2000 + 0, portraitArr[4]);
        portraitData.Add(2000 + 1, portraitArr[5]);
        portraitData.Add(2000 + 2, portraitArr[6]);
        portraitData.Add(2000 + 3, portraitArr[7]);
        
    }

그리고 퀘스트를 진행하며 id가 변했을떄 (이부분은 진짜 공부용이라 이렇게 구성한것같다. id를 바로 바꿔버려서;;)

대화를 시도 하면 예외처리를 통해 이전 대화 또는 초기대화를 할수 있게 구성을 하였다.

  public string GetTalk(int id, int talkIndex)
    {
        if (!talkData.ContainsKey(id))
        {
            if(!talkData.ContainsKey(id-id%10))
               return GetTalk(id-id %100, talkIndex);
            else
               return GetTalk(id-id%10, talkIndex);

      
        }

        if(talkIndex == talkData[id].Length)
        {
            return null;
        }else
            return talkData[id][(int)talkIndex];
    }

 

플레이어가 상호작용을할떄

해당하는 코드를 통해 오브젝트를 파악한다면

오브젝트의 데이터를 Talk라는 함수로 넘기고 

    public void Action(GameObject scObj)
    {
        scanObject = scObj;
        ObjectData objData =scObj.GetComponent<ObjectData>();
        Talk(objData.id, objData.isNpc);
        // talkBox.SetActive(isAction);
        //
        talkPanelAnim.SetBool("isShow", isAction);
    }

 

Talk 함수에서는 UI의 애니메이션과 화면표시 

그리고 받아온 인자를 통해 어떤 오브젝트이고 npc여부를 파악해 npc 일때는 portrait이미지가 나타나도록 하였다.

 

 

'Unity공부' 카테고리의 다른 글

패럴랙스 스크롤링  (0) 2023.05.08
오브젝트 풀링  (0) 2023.05.05
2D TOPDOWN(플레이어)  (0) 2023.04.24
2D RPG 애니메이션 문제 해결하기  (0) 2023.04.23
Unity 2D 기초  (0) 2023.04.19