팀프로젝트 성기사 대 암흑군단

김효중·2025년 4월 3일

📌 프로젝트 개요

  • 프로젝트명 : HolyKnights VS DarkLegion (성기사 대 암흑군단)
  • 개발환경 : C#, Unity
  • 프로젝트 기간 : 2025.03.27 ~ 2025.04.02
  • 개발 인원 : 20조 5명
    • 김자은, 정수영, 김효중, 양원준, 최상준

🎮 게임 소개

HolyKnights VS DarkLegion 은 식물 vs 좀비를 레퍼런스로 만든 2D 타워 디펜스 게임입니다.
플레이어는 유닛을 배치하며 공격해오는 적들을 막아야합니다.
전략적인 유닛 배치와 자원 관리가 핵심 요소이며, 웨이브 방식으로 점점 강해지는 적들을 상대하게 됩니다.
게임은 간단한 조작 방식직관적인 플레이 흐름을 제공하며, 다양한 유닛을 활용하여 적을 막아내는 재미를 제공합니다.


👥 맡은 역할

김효중 : 덱 정보 저장 및 불러오기 카드로 유닛 배치 기능 툴팁, 획득 UI

💾 드래그 앤 드롭을 이용한 유닛 배치

UI를 마우스를 이용하여 드래그 앤 드롭으로 월드상에 배치한다.
손을 땠을 때의 위치를 바탕으로 어느칸의 들어갈지와 그 중심 좌표를 구하여 유닛을 소환한다.
이미 있는 칸인 경우에는 소환을 하지 않고 덱 편집 중이라면 해당 카드를 패에서 제거한다.
IDragHandler, IEndDragHandler, IBeginDragHandler를 상속 받고 이를 구현하여 UI를 움직이고 뗀 좌표를 각 칸의 인덱스로 변환한다

	// 좌표로 가장 가까운 인덱스 반환
    public Vector2Int GetGridIndex(Vector3 pos)
    {

        // 가장 가까운 중심점 계산

        // 좌표별 차이
        float disX = startPos.x + pos.x;
        float disY = startPos.y + pos.y;

        // 0.5이상은 올리고 미만은 내림, 간격 추가
        int indexX = (int)Mathf.Floor(disX / stepSize + 0.5f);
        int indexY = (int)Mathf.Floor(disY / stepSize + 0.5f);

        Debug.Log(indexX + " : " + indexY);
        return new Vector2Int(indexX, indexY);
    }
    
	// 인덱스로 월드 좌표 반환
    public Vector3 GetPosByGrid(int indexX, int indexY)
    {
        Vector3 pos = new Vector3();
        // 범위 오버시 최소, 최대 적용
        indexX = Mathf.Clamp(indexX, 0, tileSize.x - 1);
        indexY = Mathf.Clamp(indexY, 0, tileSize.y - 1);

        pos.x = startPos.x + stepSize.x * indexX;
        pos.y = startPos.y + stepSize.y * indexY;
        return pos;
    }

💾 Application.persistentDataPath와 JSON을 이용한 저장, 불러오기

게임 데이터의 저장 및 불러오기를 위해 Application.persistentDataPath와 JSON 직렬화(Serialization) 방식을 활용하였습니다. 이를 통해 게임 종료 후에도 플레이어의 진행 상태를 유지할 수 있으며, 플랫폼에 관계없이 안정적인 데이터 관리를 할 수 있습니다.

🔹 구현 방식
✅ Application.persistentDataPath를 사용하여 플랫폼별 저장 경로를 자동 지정
✅ JSON 직렬화를 활용하여 데이터를 읽고 쓸 때 가독성을 유지
파일 시스템(IO)을 최소화하기 위해 데이터 변경 시점에만 저장

🔹 저장 데이터 예시

{
  "AllCard": [
    {
      "unitID": "PK_001",
      "canUse": true
    },
    {
      "unitID": "PK_002",
      "canUse": true
    }
  ],
  "InHandCard": [
    "PK_001",
    "PK_002",
    "PK_003"
  ],
  "HandSize": 5
}

|데이터 저장 및 불러오기 구조|

🎮 게임의 주요 기능

  • 전투 시스템 : 유닛 배치 및 근거리, 원거리, 특수 유닛 전투 구현
  • 레벨 디자인 : 랜덤 라운드 진행 및 적의 특수 능력 적용
  • UI 및 UX : 소지 자원 및 라운드 진행 상황 표시
  • 플레이어 스킬 : 애니메이션 이벤트를 활용한 쿨타임 시스템 구현
  • Grid Sensor : 물리 충돌이 아닌 그리드 데이터 기반으로 몬스터 제어
  • Debuff Handler : 디버프 데이터 인터페이스를 활용하여 효과 적용 및 관리
  • 데이터 테이블 다운로드 툴 : EditorWindow를 활용한 커스텀 창 생성 및 OnGUI를 통한 버튼 인터페이스 구성
  • 몬스터 소환 : 팩토리 패턴을 이용한 몬스터 생성 및 오브젝트 풀링을 통한 메모리 최적화
  • 스테이지 흐름 관리 : 상태 패턴을 활용하여 적 스폰 및 승리·패배 상황 관리
  • 플레이어 유닛 배치 : 월드 좌표 ↔ 그리드 중심 좌표 변환을 통해 정교한 유닛 배치 시스템 구현

📸 스크린샷

|메인 화면|

|게임 플레이 장면|

|로딩|

|덱 편집|

🕹️ 플레이 링크

👉 플레이하기

웹 브라우저에서 바로 플레이할 수 있습니다! 🎮


📹 플레이 영상

유튜브

profile
도전하는 개발자

0개의 댓글