ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스파르타 최종 프로젝트 21일차
    스파르타 게임 개발 2024. 7. 17. 23:40

    1. 랜덤 블록 생성 완성하기

    블록이 생성 될 때 랜덤으로 광석으로 생성이 되어야 하고, 광석의 종류 또한 랜덤으로 적용이 되어야 했다. 

    처음엔 매니저가 SO들을 갖고 있다가 컨트롤러를 만들 때 SO를 넘겨서 이 SO를 가지고 블록들을 생성 하게 하려고 했다. 

     

    그런데 이렇게 할 경우에 한 층에는 하나의 광석만 나오게 됐었다. 

    내가 원하는 방식이 아니었다. 

     

    원하는 방식은 한 층에는 여러 광석이 랜덤으로 나와야 하고, 밑으로 내려갈 수록 희귀한 광석이 더 잘나와야 했다. 

    그리고 철광석으로 결정이 됐다면, 철광석 중에서도 재료를 덜 주는 블록, 많이 주는 블록으로 나뉘게 하고 싶었다. 

    이미지에 따라 주는 갯수가 다르게 함

     

    그래서 방식을 다시 바꿔봤다. 데이터를 넘길 때 모든 광석들의 Data를 갖고 있는 것을 넘겨야 하기에 굳이 SO를 만들어야 할 필요성을 느끼지 못 해서 스텟을 다시 나누고 이미지를 Manager가 갖고 있게 했다. 

     

    Manager가 계속 Sprite를 갖고 있기에 매개변수로 데이터를 넘겨줄 필요가 없었다. 

     

    Manager가 Controller를 만들 때 숫자를 넘겨서 이 숫자를 가지고 랜덤을 돌려서 랜덤하게 블록들을 생성하게 만들어야 겠다 생각했고, 이 숫자는 맵을 생성한 횟수를 넘기게 해서 이 숫자를 활용해서 많이 내려갈 수록 희귀한 광석이 나오게 만들어 봤다. 

    계획 매니저에서 컨트롤러 생성 → 생성한 층수 넘김 → 층수에 따라 현재 블록들 초기화 하는 로직

     

     

    생각보다 시간이 많이 소요가 됐는데 결국에는 내가 원하는 조건에 맞게 블록들이 생성 되게 했다. 

    대충 하고 넘어갈 수 있다고 생각 할 수 있겠지만, 아무래도 블록 파괴 하는 게임이다 보니 이걸 완벽하게 만들어야 나중에 또 손 보지 않겠다고 생각 해서 만들 때 확실하게 만들었다. 

     

    아무래도 계속 만들다보니까 원하는 게 바뀌고 추가 해야 할 게 생기고 수정 해야 할 게 생기고 하다 보니까 시간이 오래 걸린 것 같다. 

     

    결과적으로 이러한 형식으로 만들어 졌다. 

     

    층이 생성 될 때마다 층이 생성 된 횟수에 따라서 층의 블록들이 결정이 된다. 

     

    예를 들어 10번 층이 생성이 됐을 경우에 10번 층부터는 랜덤한 확률로 광석이 나오게 된다.

    그리고 20번 째 층일 경우에 랜덤한 광석 나오는 것이 추가가 된다. 

    그리고 층 수가 오를 수록 먼저 나왔던 광석들은 확률이 낮아진다. 

     

    층마다 여러 개의 광석이 한 번에 나온다. 

    확률을 조정한 예시용 사진

     

    현재 사진 같은 경우 70층(350m) 일 경우에 나오게 되는 광석들이다. 

    다이아가 확률이 좀 높은 것을 확인 할 수가 있다. 

     

    이렇게 해서 랜덤하게 광석들이 생성 되는 것을 완성 했다. 

     

    기능이야 if 노가다든 어떤 방법을 해서든 구현을 할 수 있겠지만, 그럴려고 지금껏 공부 한 게 아니라고 생각이 든다. 튜터님께서 일단 기능 구현이 먼저라고 말씀 해주시긴 하셨지만, 이건 아니다. 제대로 만들어야 하는 기능이라 생각해서 열심히 만들어 봤다. 

     

    열심히 만들었다 함은 확장성이 좋다 라는 것. 

    추가 할 광석이 생긴다면 조건 추가와 이미지만 넣어주면 되고, 이미지를 바꾸고 싶으면 Manager가 갖고 있는 Image만 바꾸면 된다. 이건 당연한건가? 

     

    아무튼 관리 하기 편하게 만들어 봤다. 나한테만 편한 거일 수도 있긴 하다. 

    일단 관리가 용이하게 만들었다는 게 중요한 게 아니한가. 

     

    그런데 분리를 많이 안 한 것 같아서 조금 지저분 하기도 하고, 코드 수를 줄이지 않아서 코드가 많이 길긴 하다. 

    나중에 정리를 좀 해야 할 필요가 있다.

     

    일단 광석 스폰을 만들었으니 광석을 획득하게 만들어주고 표시 해주고 등등등 계속계속 개발 해보자.

     

     

     

     

    2.재화 표시 기능 만들기

    재화를 표시 할 UI를 먼저 만들어 봤다. 

     

    그리고 재화 데이터를 저장 하고 있을 Class가 필요하다. 

     

    이런 형식으로 만들어서 Player에 new를 사용해 객체를 생성 한 후에 사용 했다. (MonoBehaviour를 상속 안 받음)

     

    그 다음은 쉽다. Text들이 바뀌어야 할 타이밍에 여기 있는 값들로 Text가 바뀌게 하면 됐다. 

    바뀌어야 할 타이밍이라 함은 재화를 획득 했을 때, 재화리스트를 열었을 때 등등이다. 지금은 그렇다. 

     

    그래서 일단 자원을 획득 했을 때 저 UI의 현재 Icon과 같은지 확인을 하고 같다면 Text가 변하게 했다. 

    그리고 저 List를 열었을 때 저 List들의 개수들을 다 바뀌게 했다. 

     

    껐다 켰다 하는 것은 무조건 Toggle 컴포넌트,

     

    그리고 리스트에 있는 재화를 선택 했을 경우에 UI표시가 바뀐다. 그거는 리스트에 있는 슬롯들에 버튼 추가 해서 enum 저장 시켜두고 UI enum을 버튼 enum으로 바뀌게 한 다음에 Txt와 image를 초기화 하게 함으로써 구현 했다. 

    리스트에 있는 재화 선택 시 표시 되는 재화가 바뀜

     

    점점 게임의 틀이 만들어 지고 있는 것 같다. 이제 추가만 하면 되는 시간이 오기까지 멀지 않은 것 같다.

     

    // 토글 기능을 사용 중에 더블클릭을 해야 하는 문제가 생긴 경우 토글로 오브젝트를 비활성화 하는 게 아니라 다른 곳에서도 비활성화를 하는 것이 있는지 확인 해봐야 한다. 

    다른 곳에서 오브젝트를 비활성화 해도 토글은 인식을 안 하기에 비활성화를 한 번 하고 다시 활성화를 하게 된다. 그래서 더블클릭을 해야 기능이 작동 되게 된다.

    해결은 오브젝트를 비활성화 할 때 토글에 isOn값도 비활성화 되게 만들어 주면 된다.

     

     

     

     

    3.잭팟기능 만들기

    프로젝트를 진행 하면서 잭팟 기능을 만들어야 겠다고 계속 생각 했다. 

    잭팟 기능이라 함은 모든 블록들이 광석이 되는 것이다. 

     

    랜덤한 확률로 모든 블록들이 광석이 되게끔 만들어 봤다. 

     

    이 때 조건을 좀 더 넣어봤다. 

    중간 잭팟과 진짜 잭팟 느낌으로 만든 것인데 중간 잭팟은 모든 블록이 광석으로 변하긴 하나, 조금 덜 주는 블록들이고 진짜 잭팟은 정말 많이 주는 블록들로 채워 지는 것이다. 

    왼 쪽이 많이 주는 블록이다.

    이런 느낌으로 만들어 보고자 했다. 

    랜덤한 광석을 만들어놨던 구조를 살짝 변형 해서 추가를 해주면 되겠다 싶었다. 

     

    sprite를 저장 해줄 list를 하나 더 만들어 주고 Manager가 갖게 했다. 

     

    그리고 똑같이 넘겨 받은 숫자에 따라서 랜덤하게 Jackpot이 결정 되게 했다. 

    어떤 방식으로 했냐면 Manager가 Controller를 생성 할 때 땅을 생성한 횟수를 넘기게 했는데 이 때 랜덤 확률로(현재 1%) 숫자에 -를 붙여서 음수를 넘기게 했다. 

     

    그래서 음수가 넘어오면 잭팟이 실행 되게 되고 이 넘어온 숫자에 따라서 진짜 잭팟, 중간 잭팟의 확률을 정하게 해줬다. 

    그래서 똑같이 밑으로 많이 내려갈 수록 진짜 잭팟이 많이 호출이 되게 해봤다. 

    확률을 조정한 Text용 사진

     

    위 사진은 확률을 80층으로 조정을 하고 테스트를 한 모습이다.

    2개를 제외 하고 모두 진짜 잭팟으로 실행이 된 모습을 확인 할 수 있다. 

     

    여기까지 만드는 데 꽤 오래 걸렸다. 사실 어제면 다 할 줄 알았는데 광석을 랜덤으로 만들게 하기까지 생각보다 어려웠고 오래 걸렸다. 

    오랜만에 어렵게 느껴진 것 같다.

     

    질문을 해봤자 도움을 많이 못 얻는 경우가 많아서 쉽지 않았다.

     

    아무래도 혼자 하다보니까 내가 전 기능들을 알고 있고, 어떠한 방식으로 만들어지고 있는지 튜터님들이 확인 하려면 오래 걸리기에 나 혼자 생각을 하는 게 좀 더 나은 것 같았다.

    옛날처럼 어떻게 구현을 해야 할까요라고 물어보고 싶다. 그 때는 바로 Text RPG 시절..

     

    잘 지내시나요 송 X X 튜터님. 그 때 즐거웠습니다.

    현재 프로젝트의 상황. x100 강화 기능 만들어야 겠다..

     

    이렇게 해서 오늘 개발은 마무리 하게 되었다. 

    이제 슬슬 기본적인 기능이 마무리 되어 가는 것 같다. 사실 오늘까지 한 게 어제 끝내는 게 목표 였는데 생각보다 오래 걸려서 오늘 저녁까지 했다. 

     

    그래도 내가 원하는 대로 구현이 됐기에 만족한다. 마음에 든다. 

     

    이제 드디어 저장 기능을 구현 해보자. 처음 해봄. 

    저장 기능을 만들고 영웅 만들고 상점 만들고 그리고 옵션 만들고, 아이템 만들고 등등등 하면 끝날 것 같다. 

    거의 다 왔는데??!!! 늦은 만큼 빨리 빨리 다 만들어버리자! 

     

    그리고 BigInteger와 double 무엇을 사용 할 것인지 심오한 고민을 해보아야 한다. 이거 정말 고민 많이 된다. 흐음.

     

     

     

    내일 목표 : 저장 기능 구현, 영웅과 상점 시스템 구현 시작

     

     

Designed by Tistory.