본문 바로가기
개발일지/게임개발

[유니티 게임 개발] 동방을 걷다 프로젝트 2 - 2024 05 12(PM 07:00) 대화창, 4방향 회전

by 라이티아 2024. 5. 12.

현재 듣고 있는 곡

r-906 - まにまに / 初音ミク

특유의 현악기 포인트가 멋진 곡이다

 

 

이전 글에서 밖에서 테스트를 해보았는데 이상하게 작동했다

 

그리고 애초에 이동 방식 자체가 잘못 되었음을 깨달았기에, 전 글에서 사용한 이동 방식은 백지화 했다

넌 틀렸어 GPT!

 

그리고, 우선 밖에 나가야만 하는 주옥같은 상황 먼저 해결하는게 맞다고 느꼈다

public Slider vector_move;
void Update()
    {
        if(Gamemanager.Instance.player_HP <= 0)
            Gamemanager.Instance.player_HP = 1; // 체력 0이면 1로 부활
           
        if(Gamemanager.Instance.S_move == true){
            gameObject.transform.position = Gamemanager.Instance.playerPosition;
            Gamemanager.Instance.S_move = false;
        }
        // GPS 값을 업데이트합니다.
        UpdateGPSValues();
       
        distanceMoved *= Time.deltaTime * movementSpeed;
        distanceMoved = vector_move.value; // 강제이동
        Vector3 newPosition = transform.position;
        newPosition.y += distanceMoved;
        transform.position = newPosition;
    }

그래서 Slider를 활용해서 강제로 Vector의 크기를 조절할 수 있도록 했다

이렇게 하면 GPS가 없는 PC환경에서도 강제로 플레이어를 이동시킬 수 있다

 

이제 밖에 나갈 필요가 없어졌다

산책 하는 겸사 테스트를 했는데, 건강이 또 나빠질 것 같다 ㅇㅅㅇ....

 

이제 저번 글에서 시도했던 방향 전환을 다른 방식으로 해보자

 

지금 생각해온 방식은 버튼으로 4방향 전환을 시도하려 한다

즉, 방향 전환 버튼을 누르면 플레이어 오브젝트가 움직이는 것이 아닌, 코드 상에서 x,y pos 값 증감을 수정하는 것 이다

 

distanceMoved *= Time.deltaTime * movementSpeed;
        distanceMoved = vector_move.value; // 강제이동
        Vector3 newPosition = transform.position;
        newPosition.y += distanceMoved;
        transform.position = newPosition;

지금 코드를 보면 알 수 있듯, 강제로 Y값으로 고정 해 두었기에, 위로만 이동한다

그렇다면, 버튼을 눌러서 변수값을 변경 시키고

newPosition.y += distanceMoved;

이 부분에 무수히 많은 if문을 걸어 버리면 된다

 

이게 맞나 싶지만 그냥 해보고 생각하자

 

신나는 코드타임이다 젠장

 

// 방향 변수
    public int pos_dir = 0; // 0 - y+ / 1 - x+ / 2 - y- / 3 - x-

대충 변수 하나 만들고

if(pos_dir == 0)
        newPosition.y += distanceMoved;
if(pos_dir == 1)
        newPosition.x += distanceMoved;
if(pos_dir == 2)
        newPosition.y -= distanceMoved;
if(pos_dir == 3)
        newPosition.x -= distanceMoved;

무수히 많은 if문을 걸어버린다

테스트를 해보자

 

대충 의도한대로 움직인다

 

이제 버튼으로 pos_dir변수를 변화시키도록 만들어 보자

 

private void RotatePlayer()
    {
        if(player.pos_dir == 0)
            player.pos_dir = 1;
        else if(player.pos_dir == 1)
            player.pos_dir = 2;
        else if(player.pos_dir == 2)
            player.pos_dir = 3;
        else if(player.pos_dir == 3)
            player.pos_dir = 0;
    }

단순 무식하지만, 가장 신뢰성이 높은 if문 난사이다

for문으로 더 간단히 적을 수도 있지만

이게 더 직관적이라고 생각하기에 하드 코딩 하기로 했다

(2024 5 13 코드 추가)

if(player.pos_dor != 3)

     player.pos_dir += 1;

else

     player.pos_dir = 0;

(이렇게 하면 될 것 같다, 근데 이게 직관성이 좋다고? 진심?) 

 

이제 다시 테스트를 해보자

 

드디어! 방향 전환이 가능하다

 

코드를 약간만 수정하면 4방향이 아니라 쯔꾸르 마냥 8방향도 가능하니 나중에 필요하면 하도록 하자

 

왼쪽 버튼은 진리의 copy - past

public GPSManager player;
    public void RotatePlayer()
    {
        if(player.pos_dir == 0)
            player.pos_dir = 3;
        else if(player.pos_dir == 3)
            player.pos_dir = 2;
        else if(player.pos_dir == 2)
            player.pos_dir = 1;
        else if(player.pos_dir == 1)
            player.pos_dir = 0;
    }

 

나중에 방향에 맞는 animator값도 set해주면 그림도 변경 가능하니 머리속에만 넣어두자

어차피 아직 플레이어 스프라이트도 결정하지 않았다

 

이제 뭐해야됨?(진심)

 

레이무 대화창이나 수정하도록 하자(5분만에 결정함)

우선 지금 대충 만들어둔 대화창을 보자

 

어느정도 틀은 잡아 놨지만, 정말 틀만 잡아놔서 기능이 너무 없고 스프라이트가 너무 허접하다

 

퀄리티를 대충 올려주자

 

게임 자료 폴더에 그럴듯한 대화창 스프라이트가 없으니, 에셋스토어를 뒤져보자

쓸만한 아이콘이 많은 에셋을 추가했다

 

대화창 어?디

더 뒤져보자

체력바에 쓰기 좋아 보이는 GUI 스프라이트다

 

그래서 대화창 어디????

도트 느낌 대화창이 잘 없다

그나마 가장 잘 어울리는 대화창을 찾았다

 

이제 대화창이 깨지는 이유를 찾아보고, 밑에 오류는 왜 뜨는지도 같이 찾아보자

 

우선 대화창이 깨지는건 스프라이트 수정에서 border값을 넣는것으로 해결했다

border값이 들어간 공간은 고정된 크기를 가진다

 

 

이제야 대화창 다운 모습이다

글꼴, 글자 크기 등을 수정해 주면 완성도가 더 올라갈 것 같다

 

이제 대화문을 좀 더 넣어주자

지금은 임시로 넣은거라 바리에이션이 너무 적다

 

 

대충 이런 느낌이다

 

자료구조에서 사용되는 큐 구조를 사용하고 있다(동적 큐)

 

즉, 대화문을 inqueue했다가 dequeue하는 형식이다

아직도 이게 맞는 방식인지 잘 모르겠지만, 이미 이 방식을 기준으로 했으니 어쩌나, 큰 문제가 없으면 그냥 계속 사용할 것 같다

 

이제 여기에 대화 바리에이션은 넣어주자

 

우선 GPT에게 물어보자

........

그냥 내가 적는게 더 나을 듯 하다

 

레이무가 저렇게 정숙하게 말하는 것 자체가 상상이 안간다...

 

그러니 에라토호YM을 참고하며 적어보자

고마워요 ERA YM! 나에게 끝없는 아이디어를 주고 있어(이미 뇌가 에라에 절여졌다)

 

if(NPCManager.Instance.like == 0){ // 첫 조우
            string[] sentences = new string[] { "?",
                                                "넌 처음 보는데, 누구야?",
                                                "방랑자라고? 뭐야 그게",
                                                "난 하쿠레이 레이무, 이 신사의 무녀야",
                                                "뭐, 요괴나 곤란한 일 있으면 찾아오라고",
                                                "술같은 거라도 들고오면 환영해줄께" };
            dialogueManager.StartDialogue(sentences);
            NPCManager.Instance.like++;
            text_check ++;
        }

일단 첫 조우 대화를 수정했다

너무 어색한 대화였는데 이제 좀 나은...가?

 

이제 일반 대화를 수정해 보자

public void OnButtonClick()
    {
        string[] sentences = new string[] { "뭐? 나하고 이야기하고 싶다고?",
                                            "그렇게 재미있는 이야기는 없는데 말이야"};
            NPCManager.like++;                  
            dialogueManager.StartDialogue(sentences);
    }

지금은 이렇게 딱 2줄만 나온다

이제 여기에 호감도에 따라 다르게 나오도록 조절해 보자

 

일단 일반 대화 자체가 랜덤으로 나오게 해야 하니, 랜덤 변수를 만들어 주자

int T = Random.Range(1,5);

이렇게 하면 T에  1~4까지 랜덤 값이 들어간다

 

이렇게 하면 대화문 4개중 랜덤하게 1개가 나오도록 할 수 있다

 

이제 문과의 시간이다

대화문을 적을때는 맞춤법 검사기를 꼭 돌리도록 하자

자신이 맞춤법에 자신이 없다면 더더욱

 

public void OnButtonClick()
    {
        int T = Random.Range(1,5);
        if(NPCManager.Instance.like < 100){
            if(T == 1){
                string[] sentences = new string[] { "뭐? 나하고 이야기하고 싶다고?",
                                                    "그렇게 재미있는 이야기는 없는데 말이야"};
                NPCManager.like++;                  
                dialogueManager.StartDialogue(sentences);
            }
            else if(T == 2){
                string[] sentences = new string[] { "매일 매일 청소해도 항상 낙엽이 쌓여버려",
                                                    "그냥 가만히 둬도 똑같지 않을까?"};
                NPCManager.like++;                  
                dialogueManager.StartDialogue(sentences);
            }
            else if(T == 3){
                string[] sentences = new string[] { "생각해 보니, 너 환상향이 처음이었지?",
                                                    "그럼, 마리사에게 가보는 걸 추천해",
                                                    "마리사도 너와 같은 인간이니까 뭔가 해줄 수 있지 않을까?",
                                                    "나도 인간 아니냐고? 뭐, 나는 논외니까 말이야"};
                NPCManager.like++;                  
                dialogueManager.StartDialogue(sentences);
            }
            else if(T == 4){
                string[] sentences = new string[] { "숲으로 들어갈 때는 조심해",
                                                    "요즘 이상한 괴물들이 많이 생겨났다는 소문이 많더라고",
                                                    "슬라임이라던가? 그런 게 왜 환상량에 생겨난 거지?",
                                                    "뭐, 그러니 제대로 준비라도 하고 들어가는 걸 추천할게"};
                NPCManager.like++;                  
                dialogueManager.StartDialogue(sentences);
            }
        }
    }

대충 대화문을 채워 봤다

이후에 마리사를 추가할 계획이니, 마리사를 언급하도록 하자

 

 

이제 대화문이 랜덤하게 잘 나오는 것을 확인할 수 있다

 

이걸 호감도 마다 넣어주면 된다(대충 100단위로 하면 되지 않을까?)

 

일단 엔딩중 하나는 레이무와 호감도를 많이 쌓아서 레이무와 동거하게 되는 엔딩을 생각하고 있으니 촘촘히 넣어보자

 

 

이제 다음에는 마을에서 아이템을 사는 것을 구현 할 계획이다