ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스파르타 심화 팀과제 / 클릭형게임 펫 시스템 만들기
    스파르타 게임 개발 2024. 6. 23. 19:45

    자동으로 공격 해주는 펫을 만들어 보자.

     

    펫은 상점에서 구매가 가능 하고, 구매시 플레이어의 공격력에 비례해서 자동으로 공격 해준다.

     

    먼저 얘네도 SO를 한 번 써볼까 오브젝트를 만들까 고민을 해봤는데, 

     

    펫들의 생성위치를 굳이 정하지 않고, 지금 생각으로는 몇 마리 안 만들 것이기에(맵이 작음) 위치를 직접 정해놓고 거기에 생성 되게 할거라 SO를 사용 하지 않고 오브젝트만, 프리펩만 넣으면 자동으로 프리펩의 갯수만큼 상점에 슬롯이 나오게 만들 거다. / 프리펩은 프리펩으로 만들어진 위치가 저장이 되어서 생성이 된다면 저장을 했던 그 곳에 생성이 된다.

    처음 코드 작성하기 전에 그린건데 지금 보니 무슨 생각의 그림인지 모르겠다.

     

    처음 생각은 아이템 슬롯이 있고, 이 슬롯을 갖고 있는 오브젝트가 있고, 이 슬롯 프리펩을 갖고 있는 오브젝트에 펫 프리펩을 배열로 넣어둬서 배열만큼 아이템 슬롯을 생성하고 슬롯들에 데이터를 초기화 하는 방법으로 해야겠다 생각했다. 

    이 또 한 생각하다가 중간에 생각이 바뀌어서 새로 그린 그림인데 무슨 생각인 그림인건지 모르겠다. ㅋㅋ 아마 왼 쪽 박스가 아이템 슬롯들 갖고 있는 오브젝트인 것 같은데,

     

    떠오른 방법들로 코드를 작성 하기 시작 했다. 

     

    가장 먼저 아이템 슬롯을 만들어 줬다. 

    상점 UI에 자동으로 추가가 될 슬롯. 지금은 매우 간단해보인다.. ㅋㅋ

     

    이제 아이템 슬롯을 생성 하는 슬롯매니저 같은 거에서 생성을 할 때, 갖고 있는 프리펩의 데이터를 집어넣어서 저기 슬롯에 있는 Text와 icon을 달아줄 것이고, 버튼을 누르게 되면 이 슬롯에 저장 된 프리펩 데이터를 생성 하게 함으로써 기능을 구현 하는 것이다. 

    작성 된 코드

     

    이런 식으로 변경을 할 오브젝트들을 가져와 주고 슬롯이 생성 되면 값이 초기화 되게 했다. if(thisSoltpet != null)은 알겠지만 혹시 모를 널오류 방지.

     

    지금 보니 저 코드들을 함수로 만들어야 할 것 같다. 보기에 굉장히 불편하다.. 내가 왜 저랬지.. 

     

    아무튼 아이템 슬롯에 대한 설계는 끝났다. 이제 이 슬롯들을 생성 할 오브젝트들을 만들어 주고, 거기에 펫 데이터들을 집어 넣고, 펫 데이터의 갯수만큼 슬롯을 생성 하고, 생성 할 때 데이터를 집어넣어주게끔 하면 된다. 

    완성 된 코드

     

    고민을 충분히 한 후에 코드 작성을 시작하니 빨리 끝나고도 훅훅 적힌다. 위 코드와 같이 게임이 실행 되면 slot들을 생성 하고 데이터들을 집어 넣어줘서 슬롯들을 초기화 하게 해줬다. 

     

    그리고 글을 적은 순서가 이상한데, 왜냐면 하루 지나고 적는 거라.., 원래는 펫부터 만들었다. 

     

    펫을 프리펩으로 만들 것이기에, 펫을 구현 할 때는 따로 SO를 사용하진 않았다. 그냥 프리펩으로 만든 오브젝트를 참조하게 하면 된다. 

     

    이 펫은 이름과, 비용, 공격력, Icon sprite, 공격속도 등등을 갖게 했고 코루틴을 사용 해서 일정시간마다 펫들이 자동으로 공격하게 했다.

    정상적으로 작동 하는 모습

     

    지금 보면 슬롯들에 위치가 겹쳐서 생성이 되는 것을 볼 수가 있는데, 나중에 UI 기능 중에 드래그로 내릴 수 있는 기능을 사용 할 것이고, 거기에 자동으로 정렬 하게끔 할 것이기에 지금은 생성만 되면 된다.

     

    그리고 영상을 보면 펫이 가만히 있을 텐데 공격을 하고 있는 거다. 근데 데미지가 약하다 지금은.

     

    아무튼 이제 펫이 쏘는 발사체를 만들어 줄 것이다. 

     

    발사체.. 그것은 바로 오브젝트풀.. 

     

    지금 펫은 공격시간마다 보스 피 닳게 하는 함수를 호출 한다. 

     

    이 기능을 공격시간마다 투사체를 생성 하는 걸로 바꾸고, 투사체는 보스에게 날라가고 닿으면 공격을 닿게 하는 함수를 호출 하게 하면 된다. 

     

    그래서 투사체를 먼저 만들어 줬다. 

     

    간단한 circle로 만들어 줬고, 크기를 맞춘 후에 스크립트를 작성 했다. 

     

    먼저 나는 이번에도 update를 최대한 안 쓰고 싶기에 transform 이딴 거 버리고 리지드바디부터 가져와줬다. 

    리지드 바디를 갖고 오고, AddForce를 쏴서 한 번 실행 하면 투사체가 움직이게 할 거다. 

     

    =====

    역시 오브젝트 풀., 복잡 했다. 나는 Enable를 사용 하고 싶었지만, 안 될 것 같다. 오류가 많이 난다. 

     

    어떻게 잡을 수야 있겠지만 그냥 enable을 사용 안 하기로 했다. 난 오브젝트가 활성화 되면 방향을 바꾸고 AddForce 쏘게 만들려고 했는데 그냥 다른 오브젝트에서 이 오브젝트풀을 생성하고, 이 방향 바꾸고 AddForce쏘는 함수를 쏘게 만들었다. 그러니까 됐다. 

     

    그리고 나중에 예전에 강의코드, TopDownShooting 코드를 보니까 투사체 구현이 내가 한 거랑 거의 똑같더라, 오브젝트풀과 enble은 그냥 안 쓰나보다. 

     

    그리고 난 이제 gpt에게 함수 만들어 오라는 레벨 정돈 된 것 같다 ㅋㅋ

    이제 gpt에게 짬 시킬 정도는 된 거 같다.

     

    내가 원하는 건 오브젝트로 가는 방향 계산이였는데 얘가 자꾸 이상하게 만들어주길래 몇 번씩 다시 질문 했어야 했는데 지금 보니까 내가 질문을 이상하게 했네.., 결국엔 대충 받고 조금씩 바꿔서 썻다.

     

    방향 구하는 코드 줘. 라고 했으면 됐을 것 같다. 지금 보니까.

    투사체 발사 하는 코드

     

    그냥 Enable로 했으면 속이 시원 했을 것 같은데, 강의 코드도 이래서 깔금하게 포기 했다. 

    오브젝트 풀 생성 하고, 위치 잡고, 방향 바꾸고 쏘는 함수를 겟컴포넌트 해서 사용 하게 했다. (나는 이 위치 잡고, 방향 바꾸고 쏘는 것을 투사체 혼자서 Enable을 이용해 하고 싶었는데 오브젝트풀이랑 안 맞다) 그러니까 objPool은 생성 되면 enable이 실행 되고 start보다 빨리 실행 되고, 그래서 enable을 쓰려면 비활성화를 한 번 해주던가 해야 하고, 아니면 반환을 false인 상태로 주거나 등등등 아무튼 애매하다. 그냥 이런 식으로 하는 게 낫다.

     

    Intialize는 타겟정하고, 공격력 바꾸게 하는 함수다.(쏘는 펫 공격력으로 투사체 공격력 바꾸게 함)

    그런데 오늘 특강에서 GetComponent 안 좋다는데 다른 방법 한 번 찾아봐야겠다. 있을라나?

     

    아무튼 이렇게 해서 펫이 투사체 쏘는 것까지 해서 상점 펫 시스템을 구현 하였다. 

     

    펫 프리펩만 만들어서 배열에 추가 시키면 자동으로 슬롯 추가 된다. 

    지금은 플레이어 공격력에 따른 펫 공격력을 계산 할 수가 없어서 나중에 공격력 부분을 수정 해줘야 한다.

    그리고 UI 자동 정렬 하게 해서 슬롯들 쫘르륵 세워지게 하는 것두

Designed by Tistory.