이 문서는 Tadadosi 및 단국대학교 학생들이 개발한 2D 아이소메트릭 슈터 프로젝트를 이해, 수정 또는 기여하고자 하는 개발자를 위한 포괄적인 가이드입니다. 이 게임은 Unity(버전 2019.4.0f1)로 개발되었으며 C#을 사용하여 스크립팅되었습니다.
이 프로젝트는 명확한 관심사 분리를 가진 모듈형 컴포넌트 기반 아키텍처를 따릅니다. 다음은 프로젝트 구조의 개요입니다:
Assets/
├── Animations/ # 애니메이션 클립 및 컨트롤러
├── Audio/ # 효과음 및 음악 트랙
├── Materials/ # 쉐이더 재질을 포함한 재질 에셋
├── Prefabs/ # 재사용 가능한 게임 오브젝트
├── Scenes/ # Unity 씬
├── Scripts/ # C# 스크립트 파일 (아래 상세 설명)
├── Shaders/ # 커스텀 쉐이더 파일
└── Sprites/ # 2D 스프라이트 에셋
Scripts 폴더는 게임을 구동하는 C# 코드를 포함하고 있습니다. 다음과 같이 구성되어 있습니다:
Scripts/
├── Animations/ # 애니메이션 처리 스크립트
├── Audio/ # 오디오 시스템 스크립트
├── Camera/ # 카메라 동작 및 효과
├── Crosshair/ # 조준 시스템
├── Debug/ # 디버깅 유틸리티
├── Environment/ # 환경 오브젝트 및 상호작용
├── FX/ # 애프터이미지를 포함한 시각 효과
│ └── AfterImage/ # 애프터이미지 효과 시스템
├── Global Managers/ # 게임 전체 관리 시스템
├── Inputs/ # 커스텀 입력 처리
├── Physics/ # 물리 관련 컴포넌트
├── Player/ # 플레이어 동작 및 제어
├── Utilities/ # 헬퍼 클래스 및 함수
│ ├── Arrays/ # 배열 조작 유틸리티
│ └── Rotation/ # 회전 처리 유틸리티
├── Weapons/ # 무기 시스템
│ ├── Animations/ # 무기 애니메이션 스크립트
│ └── Weapon Derived Classes/ # 특정 무기 구현
└── _NOTES/ # 개발 노트
게임은 단일 책임 원칙 접근 방식의 컴포넌트 기반 아키텍처를 따릅니다. 주요 시스템은 다음과 같습니다:
- 입력 시스템: 키보드/마우스 및 컨트롤러 입력을 모두 지원하는 커스텀 입력 핸들러(
TadaInput) - 플레이어 시스템: 플레이어 엔티티의 다양한 측면을 처리하는 모듈식 플레이어 컴포넌트
- 무기 시스템: 다양한 무기 유형에 대한 파생 구현이 있는 기본 무기 클래스
- 오디오 시스템: 로컬 및 글로벌 사운드 재생을 위한 매니저 및 이미터
- 시각 효과 시스템: 애프터이미지 및 기타 시각적 강화를 처리
TadaInput 클래스는 Unity의 내장 입력 시스템을 확장하여 커스텀 입력 처리를 제공합니다. 이 시스템은 키보드/마우스와 게임패드 제어를 모두 원활하게 지원합니다.
주요 특징:
- 커스텀 입력 매핑 및 열거형
- 키 상태 추적(누름/떼기/유지)
- 부드러운 입력 축 및 원시 입력 축 제공
- 마우스와 조이스틱 교차 호환성
// 입력 사용 예시
if (TadaInput.GetKeyDown(TadaInput.ThisKey.Dash) && _PlayerPhysics.Velocity.sqrMagnitude > 0)
_PlayerSkills.Dash();플레이어 시스템은 다양한 기능으로 분리된 여러 클래스로 구성됩니다:
- PlayerController: 입력을 받아 다른 컴포넌트에 명령을 전달하는 중앙 컨트롤러
- PlayerPhysics: 이동 및 물리적 상호작용 처리
- PlayerAnimations: 플레이어 애니메이션 상태 관리
- PlayerBodyPartsHandler: 플레이어 신체 부위 시각적 방향 및 레이어 순서 관리
- PlayerSkills: 대시와 같은 특수 능력 구현
- PlayerShoulderMain/Secondary: 무기 조준 및 회전 처리
각 컴포넌트는 단일 책임을 가지며, 코드를 모듈화하고 유지 관리를 용이하게 합니다.
무기 시스템은 상속과 다형성의 좋은 예입니다:
- Weapon: 모든 무기의 기본 클래스로, 일반적인 동작과 메서드를 정의
- 파생 무기 클래스:
- Weapon_ShootProjectileCanCharge: 충전 가능한 레이저 샷을 발사하는 무기
- Weapon_ChargeContinuousShooting: 지속적인 레이저 빔을 발사하는 무기
WeaponHandler는 무기 전환과 무기 액션 발동을 관리하며 플레이어 컨트롤러와 실제 무기 클래스 사이의 중개자 역할을 합니다.
// 무기 전환 예시
public void SwitchWeapon(WeaponSwitchMode mode, int index = 0)
{
CheckWeaponsAvailability();
DisableAllWeapons();
switch (mode)
{
case WeaponSwitchMode.Next:
currentWeaponIndex = ArraysHandler.GetNextIndex(currentWeaponIndex, weapons.Length);
break;
// 다른 케이스...
}
currentWeapon = weapons[currentWeaponIndex];
currentWeapon.gameObject.SetActive(true);
}오디오 시스템은 두 가지 주요 접근 방식으로 설계되었습니다:
- 전역 사운드(SoundManager): 싱글톤 패턴을 사용하여 모든 곳에서 접근할 수 있는 전역 오디오 소스 제공
- 로컬 사운드(SoundHandlerLocal): 개별 게임 오브젝트에 부착되는 로컬 오디오 소스 관리
이 이중 접근 방식은 UI 사운드와 같은 전역 사운드와 무기 발사와 같은 공간적 사운드를 모두 효과적으로 처리합니다.
애프터이미지 시스템은 플레이어가 대시할 때 시각적 잔상을 생성하는 포괄적인 예시입니다:
- AfterImageGenerator: 초기 설정 및 애프터이미지 생성
- AfterImage: 개별 애프터이미지의 동작 처리
- AfterImageGroup: 애프터이미지 그룹 관리
- AfterImageHandler: 모든 애프터이미지 그룹 관리 및 활성화
이 접근 방식은 유지 관리가 용이하고 확장 가능한 방식으로 복잡한 시각 효과를 구현합니다.
새 무기를 추가하려면:
Weapon클래스를 상속받는 새 스크립트 생성- 필요에 따라
PrimaryAction()및SecondaryAction()메서드 재정의 - 무기에 필요한 애니메이션 및 시각적 요소 구현
WeaponHandler의 무기 배열에 새 무기 추가
public class Weapon_NewType : Weapon
{
// 특정 무기에 필요한 변수
protected override void Awake()
{
base.Awake();
useRateValues = new float[] { 0.2f, 0.1f }; // 다양한 발사 속도 설정
}
public override void PrimaryAction(bool value)
{
base.PrimaryAction(value);
// 사용자 정의 주 액션 구현
}
public override void SecondaryAction(bool value)
{
base.SecondaryAction(value);
// 사용자 정의 보조 액션 구현
}
}새 플레이어 능력을 추가하려면:
PlayerSkills클래스에 새 메서드 추가- 필요한 컴포넌트 참조 설정
PlayerController에서 적절한 입력 바인딩 추가
// PlayerSkills.cs에 새 능력 추가
public void TeleportAbility()
{
if (canTeleport)
{
StartCoroutine(CO_Teleport());
}
}
private IEnumerator CO_Teleport()
{
canTeleport = false;
// 텔레포트 효과 구현
Vector3 targetPosition = transform.position + TadaInput.AimDirection * teleportDistance;
transform.position = targetPosition;
yield return new WaitForSeconds(teleportCooldown);
canTeleport = true;
}
// PlayerController.cs에 바인딩 추가
if (TadaInput.GetKeyDown(TadaInput.ThisKey.Teleport))
_PlayerSkills.TeleportAbility();새 입력을 추가하려면:
TadaInput.ThisKey열거형에 새 키 유형 추가Update()메서드에 입력 감지 코드 추가- 관련 메서드에서 새 입력 사용
// TadaInput.cs에 새 키 추가
public enum ThisKey
{
// 기존 키...
Teleport,
// 새 키...
Count
}
// Update()에 감지 코드 추가
if (Input.GetKeyDown(KeyCode.T) || Input.GetKeyDown(KeyCode.Joystick1Button3))
StoreCurrentKeyDown(ThisKey.Teleport);- 오브젝트 풀링 구현: 프로젝타일과 효과에 대해 Instantiate/Destroy 대신 오브젝트 풀링 사용
- 가비지 컬렉션 최소화: 업데이트 루프에서 새 할당 피하기
- DrawCall 최적화: 스프라이트 아틀라스 사용
- Unity 에디터에서
File > Build Settings열기 - 대상 플랫폼 선택 (Windows, macOS, Linux)
- 씬 추가 (메인 씬이 포함되어 있는지 확인)
- 플레이어 설정에서 제품 이름, 회사 이름, 아이콘 등의 세부 정보 구성
- "Build" 또는 "Build and Run" 클릭
- README 및 라이센스 파일이 최신 상태인지 확인
- 모든 에셋이 올바르게 포함되어 있는지 확인
- GitHub Releases를 통해 빌드 배포
- GUIHandler 및 GizmosHandler 사용: 디버그 정보를 시각화하기 위한 내장 유틸리티 활용
- 디버그 플래그 활성화: 각 클래스에 있는 디버그 플래그를 활성화하여 특정 시스템에 대한 로그 확인
- VS Code 또는 Visual Studio: 중단점 및 변수 검사를 위한 통합 디버거 사용
- 오브젝트 풀링: 프로젝타일 및 효과에 대한 오브젝트 풀링 시스템 구현
- 입력 시스템: 런타임에 키 리매핑 지원 추가
- 에너미 AI: 에너미 시스템 및 AI 구현
- 레벨 생성 시스템: 수동 레벨 구성 대신 레벨 생성 시스템 개발
┌──────────────┐ ┌────────────────┐ ┌────────────────┐
│ TadaInput │────▶│PlayerController│────▶│ PlayerPhysics │
└──────────────┘ └────────┬───────┘ └────────────────┘
│
▼
┌──────────────┐ ┌────────────────┐ ┌────────────────┐
│ WeaponHandler│◀────│PlayerController│────▶│ PlayerSkills │
└───────┬──────┘ └────────┬───────┘ └────────────────┘
│ │
▼ ▼
┌──────────────┐ ┌────────────────┐ ┌────────────────┐
│ Weapon │ │PlayerAnimations│ │AfterImageHandler│
└──────────────┘ └────────────────┘ └────────────────┘
- GitHub에서 저장소 포크
- 새 브랜치 생성 (
git checkout -b feature/amazing-feature) - 변경사항 커밋 (
git commit -m 'Add some amazing feature') - 브랜치 푸시 (
git push origin feature/amazing-feature) - Pull Request 오픈
코드 스타일, 테스트 요구사항 및 PR 프로세스에 대한 추가 정보는 저장소의 CONTRIBUTING.md 파일을 참조하세요.
[타입]: 제목 (50자 이내)
본문 (선택 사항, 72자마다 줄바꿈)
각주 (선택 사항)
feat: 새로운 기능 추가fix: 버그 수정docs: 문서 수정style: 코드 포맷팅, 세미콜론 누락, 코드 변경이 없는 경우refactor: 코드 리팩토링test: 테스트 코드 추가chore: 빌드 업무 수정, 패키지 매니저 설정 등
[feat]: 플레이어 점프 기능 추가
- Space 키로 점프 가능
- 점프 높이를 조절할 수 있는 변수 추가
- 점프 중에는 이동 속도 감소
- 너무 큰 단위로 커밋하지 않기 (너무 많은 기능)
- 작업 단위별로 자주 커밋하기
- 테스트 완료 후 커밋하기
- 설명 자세할수록 좋음
[타입] 간결한 변경 내용 설명 (YYYY-MM-DD, 요일)
## 작성 날짜
YYYY-MM-DD
## 변경 사항
여기에 변경 사항을 자세히 적어주세요.
- PR을 보내기 테스트하기
- 너무 큰 단위로 PR하지 않기
- 코드에 주석 잘 달기
이 프로젝트는 MIT 라이센스 하에 제공됩니다. 이는 코드와 프로젝트 설정에만 적용됩니다. 오디오 파일과 스프라이트에는 별도의 라이센스 조건이 적용됩니다.