앙빅 모작 포트폴리오
개발기간 : 2024-01-03~2024-01-18 (16일)
개발인원 : 1명
개발환경 : Unity, Visual Studio
포트폴리오 ppt 링크
한 때 스팀에서 어려운 게임으로 유행한 앙빅이라는 게임을 모작했다.
세이브가 없이 죽고나면 처음부터 다시하는 그런 류의 게임을 만들어보고 싶어서 앙빅을 선택하게 되었다.
앙빅은 2D 플랫포머 기반의 세이브포인트가 없는 게임이고
기본적으로 플레이어가 피격 당하면 사망하게 되지만
착용한 장비에 따라 피격 횟수가 증가하게 된다. (피격 시 착용 장비의 내구도가 깎이거나, 파괴 됨)
오일이란 아이템으로 장비의 특성을 바꿀 수 있다.
게임 시작시 랜덤 직업을 선택할 수 있는데 별의 개수만큼 난이도가 굉장히 올라가서 5성을 클리어하는거를 켠왕으로 하는 유튜브도 많이 나왔었다.
(4성에서 벽 느끼고 못 깸)
앙빅은 별의 개수만큼 생성되는 아이템이나 몬스터의 수가 다르기 때문에
레벨에 맞는 데이터(메모장)를 읽어와서 게임이 시작하게끔 만들었다.
아이템별 Id를 부여했고, 몬스터는 이름과 x, y좌표를 읽어들여와서 그에 맞는 위치에 생성해주었다.
위의 메모장 파일을 읽어서 DataManager가 아이템과 몬스터를 해당하는 위치에 스폰시킨다.
몬스터는 상태머신을 통해 움직이고 각 몬스터 별 상태머신을 따로 구현했다. (namespace로 구분)
다른 몬스터이더라도 똑같은 행동을 한다면 같은 상태머신을 사용했다.
아이템은 인벤토리에 들어가거나 사용할 때 업캐스팅으로 쉽게 코드를 작성하기 위해 ItemBase라는 최상위 부모 객체를 뒀다.
사용을 할 때에는 abstract Use() 메소드를 사용해 override 된 자식 객체의 Use가 작동하게끔 구조를 작성했다.
플레이어는 enum으로 이루어진 유한상태머신으로 동작하며 Inventory라는 List를 갖고 있어 아이템을 사용할 수 있다. 전체 아이템에 대한 인벤토리와 장비, 오일 아이템을 나눠서 갖고 있다.
UI 로 접근하는 인벤토리는 전체가 아닌 장비와 오일을 나눠서 보여주기 때문에 각각의 List로 나누었다.
UI는 참고 링크의 코드를 참고하여 작성했고, UI_Base를 상속 받은 클래스는 클래스 내부에서 enum으로 실제 오브젝트의 이름을 갖고 있으면 부모 클래스에서 바인딩을 해주어서 바인딩 된 버튼이나 게임오브젝트에 이벤트를 추가하는 등 동적으로 작업들을 처리할 수 있다.
아쉬움 및 겪었던 생각
1) 당시 풀링은 무조건적으로 사용하지 않더라도 미리 만들어줘야한다고 생각했었기에 모든 종류의 아이템을 미리 만들어 놓는게 비효율적이라고 생각해 풀링을 하지 않았고, 몬스터만 풀링을 사용했다.
지금 다시 만든다면 아이템도 풀링을 사용할 것 같다. (풀에 있는지 확인해 없다면 만들고 풀에 집어넣는 방식으로)
2) 인벤토리가 켜지는 순간에 아이템 데이터를 읽어와서 UI에 만들어주는 방식인데 무조건적으로 그 전에 남아 있던 아이템들을 지우고 다시 생성을 해준다. 사용한 아이템은 삭제가 되니까 괜찮을텐데 사용이 되지 않은 아이템도 삭제가 되는게 조금 아쉽다. >> 사용 안한 아이템을 따로 저장을 해놓아야하려나 ?
3) 원래는 오일을 사용하면 아이템의 색깔(특성)이 바뀐다. 즉 색깔 별로 사용할 시 효과가 다른데 구현을 아예 하지 못했다. 시간이 모자라긴 했지만, 앙빅 게임의 재밌는 특징을 구현하지 못했다는게 아쉬움이 남는다.
>> 만약 구현을 한다면 ColorUse() 함수와 색깔을 멤버로 갖고 있는 Interface를 Item에 갖게 하고 Item의 Use가 실행될 때 ColorUse() 도 실행시켜 빨간색이면 불이 나오게 한다던지, 파란색이면 상대를 얼리게 한다는지 하는 방식으로 코드를 작성할 것 같다.
4) 플레이어의 코드를 작성할 때 하나의 클래스에 움직임, 공격, 인벤토리 등 모든 내용을 넣다보니 코드파일이 길어지고 가독성이 너무 떨어졌다.내가 쓴 코드인데도 찾는데 시간 걸림
다음 번에는 서로 관계가 없는 코드라면 (예 움직임, 공격) 클래스 파일을 나눠서 관리해야겠다.
가독성도 더 높고 코드 작업할 때도 더욱 편리할 것 같다.