ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 게임개발 숙련주차 팀과제 / Quaternion을 사용해서 문 열리게 하기 / 스파르타부트캠프
    게임 개발기록 2024. 6. 12. 23:09

     

     

    문을 작동 하는 기능을 맡았는데 처음에는 애니메이션을 사용해서 기능을 구현 할려고 했는데, 같은 팀원이셨던 분이 애니메이션보다 함수를 만들어서 구현 하면 다른 오브젝트에도 함수 넣기만 하면 돼서 그게 엄청 편할거다라고 알려주셨다.

     

    그래서 Quaternion을 사용 해서 기능을 구현 해보았다. 그래서 시간이 좀 걸렸다.. 문 열리게는 빠르게 했지만 문제가 많았다....

     

    Quaternion.Slerf 라는 것을 사용해서 천천히 스르륵 열리게 하는 것을 구현 할 수가 있다고 해서 그 함수를 알아보고 작동을 했는데 스르륵 열리긴 했지만 생각처럼 되질 않았다. 

     

    난 반복문을 사용 해서 이 문이 열리게 했는데, 디버그로 확인 해보니까 이 반복문이 멈추질 않는 것이다. 

     

    대체 왜 안멈출까. 라는 고민이 굉장히 길어졌다. 

    Slerf라는 기능이 매개변수를 3개를 받는데 각각 최소, 최대, 비율이다. 

    예시를 말하자면 0, 100, 0.1 이라고 하면 0과 100의 거리에서 0.1만큼 회전을 시킨다는 소리이다. 

     

    그림판 소환 

     

    그림판을 보면 이해를 할 수도 있을 것이다. 아마도....,

     

    아무튼 이것이 Slerf의 기능인데 나는 이것을 사용 해서 회전을 하게 했고 특정 각도가 되면 이 반복문이 멈추게 했었다.

     

    그런데 도저히 안 멈추는 것이다. 그 이유는 그거였다. 

     

    나는 그림의 0이라는 숫자를 매개변수로써 오브젝트의 현재 각도를 넣었다. (왜냐하면 문이 닫힐 때도 쓰기 위해서,)

    그렇게 되면 반복을 실행 할 때 저 0이라는 숫자는 계속 해서 바뀌게 되고 거기에서 다시 최대각도까지의 0.1 비율을 계산 하고 회전을 적용 한다. 그러니까 언젠가는 도달 할 수 있을지도 모르지만 100이라는 곳까지 갈 수가 없다라는 것이다. 

    역시 그림으로 설명 하겠다. 

     

     

    그림을 보고 이해를 한다면 고마울 것 같다. 

    아무튼 계속 저렇게 되어서 반복문이 멈추지 않는 것이다.

     

    그래서 다른 방법을 떠올렸어야 했는데 도저히 방법이 떠오르지 않는 것이다. 어떻게 해야 할까 ..... 

     

    그러다가 그냥 반복 할 횟수를 정해놓고 그만큼만 반복을 해야 할까. 라는 등 고민을 많이 하다가 어떻게 반복이 멈추게 했었는데 기억이 안난다. 시간이 지나고서 블로그를 작성 하는 것이라,,,, 

     

    그 다음엔 문이 닫히게 하게 했어야 했는데, 이것도 쉽지가 않았다. 

     

    문이 닫히게 하려면 반대로만 하면 된다고 생각 했는데 작동을 하니 문이 닫히려다가 살짝 움직이더니 갑자기 열리는 쪽으로 향했다. 

     

    아 그리고 이 함수를 실행 할 때 아무리 Slerf라고 해도 실행 하게 되면 엄청나게 빠르게 작동 되어서 문이 스르륵 열리는 효과가 나오기는 어려울 거라고 Coroutine을 사용 했었다. yeild return을 한 0.1초씩 줘서 스르륵 하게 했었다. 

     

    아무튼 계속 고민 하다가 잘 안 풀리고 튜터님께 여쭤봐도 잘 안 풀리고 시간은 흐르고 빠르게 팀원들께 갖다 줘야하는데 하다가 결국엔 Gpt 선생에게 도움을 요청 했다. 

     

    gpt선생님은 대단 했다. 코드보고 우와 소리 나올 정도로 깔끔하게 만들어서 건내줬다. 마치 애정튜터님의 코드를 처음 보고 나서 느꼈던 기분이었다. 

     

        public IEnumerator DoorRotation(float targetAngle)
        {
            

            Quaternion doorRotation = door.localRotation;
            Quaternion targetRotation = Quaternion.Euler(0f, targetAngle, 0f);
            float time = 0f;

            isOpening = true;

            while (time < 1f)
            {
                time += Time.deltaTime * rotationSpeed;
                door.localRotation = Quaternion.Slerp(doorRotation, targetRotation, time);
                yield return null;
            }

            door.localRotation = targetRotation;
            isOpening=false;
        }

     

    결과적으로 함수를 이렇게 만들었는데 지금 생각 해보면 굳이 코루틴이 필요 없을 것 같다. 스르륵 열리게 하는 기능을 다른 곳에서 적용을 하니까 말이다. 

     

    나는 좀 여러줄을 사용 했던 걸 매개변수 하나를 받고, 함수가 실행 될 때 현재위치를 받게 해서 코드줄을 줄이게 했다. 아무튼 보고 대단하다 느꼈다. 이 코드를 보고 레벨업 한 느낌을 받았다. 

     

    하지만 이것도 내가 충분한 고민을 한 후에 보니까 이렇게 바로 느낄 수 있었던 것이라고 생각 한다. 앞으로 기능들을 구현 한 후에 gpt한테 물어봐야겠다. 눈이 트이는 기분이었다. 

     

    그리고 함수 안에 isOpening은 문이 열리는 중에 이 함수가 실행 되게 하면 이상하게 작동이 되서 그걸 보완해주기 위해서 넣어둔 것이다. 

     

    그리고 time이 비율인데 1f 보다 커지면 반복이 멈추게 하는 것을 볼 수가 있다. 1의 비율을 사용 하게 되면 최대 거리와 똑같아질텐데도 불구하고 밑에 줄에 door.localRotation = targetRotation;라는 코드를 사용 해서 굳이 한 번 더 각도를 맞춰주는 작업을 했다. 그만큼 Quaternion이 내부적으로 복잡하게 작동이 되는 것 같다라는 것 같다. 

     

    아무튼 이렇게 해서 문 열리는 기능을 했는데 앞으로 gpt가 나의 코딩레벨을 많이 올려줄 것 같다. gpt의 순기능을 찾은 기분이다.

     

    ======

    영상의 창문이 문을 안 따라오는 것은 창문이 자식오브젝트인데 그 오브젝트가 Static으로 설정이 돼있어서이다. (정적) 움직이지 않는다. 그걸 체크 해제 해서 따라움직이게 했다. (이것도 이 함수 쓰라고 알려준 팀원분이 알려줬다)

     

    이번 팀과제에서 한 것들에 대해서 적을 만한 것들은 이게 다인것 같다. 한 게 많이 없는 것 같다. 이렇게 보니까

     

    난 캠프를 중간에 빠졌어서 굉장히 오랜만에 팀과제를 하게 됐는데 팀원들이 좋은 분들이셔서 그나마 잘 할 수 있었던 것 같다. git hub나 등등.. 캠프 동기분들이 렙업 많이 한 게 느껴졌다..... 부럽. 빨리 노력 해서 따라잡아야겠다.

Designed by Tistory.