본 프로젝트는 2주 동안 TEAM_YPK에서 개발한 언리얼 엔진 기반 3D 액션 게임입니다. 🎮
3인 팀으로 진행한 프로젝트이며, 깃허브를 활용하여 협업을 진행했습니다. 주요 클래스 및 구조를 C++ 코드 기반으로 설명합니다.
├── AMyEffectManager (이펙트 관리)
├── AMySoundManager (사운드 관리)
├── AMyCreature (ACharacter 상속)
│ ├── AMyPlayer (플레이어)
│ │ ├── AMyKnight (기사, 근접 공격)
│ │ ├── AMyArcher (궁수, 원거리 공격)
│ ├── AMyMonster (몬스터)
│ │ ├── AMyBaseMonster (일반 몬스터)
│ │ ├── AMyBossMonster (보스 몬스터)
├── AGameModeBase (게임 진행 관리)
| ├── AMyGameModeBase (사냥 게임 모드 클래스)
| ├── AMyBossGameModeBase (보스 게임 모드 클래스)
├── ABaseAIContorller (AIController 베이스)
| ├── AMyPlayerAIController (동료 AIController)
| ├── AMyMonsterAIController (몬스터 베이스 AIController)
| | ├── AMyNormalMonsterController (일반 몬스터 AIController)
| | ├── AMyBossAIController (보스 몬스터 AIController)
├── MyItem (Item클래스 베이스)
| ├── MyNPCItem (NPC 아이템)
Component
├── MyAggroComponent (보스 타겟 시스템 컴포넌트)
├── MyInvenComponent (인벤토리 컴포넌트)
├── MyNPCStorComponent (NPC 스토어 컴포넌트)
├── MyStatComponent (Stat관련 컴포넌트)
.
.
.
- 기사(Knight) / 궁수(Archer) 캐릭터 구현 (근거리/원거리 캐릭터)
- 체력 및 경험치 UI 연동
- 몬스터 AI 구현 및 전투 패턴 적용
- inventoryUI구현
- Npc의 inventory와 Player의 inventory연동 및 수정
//Player UI delegate 바인드
auto PlWidget = Cast<UMyPlayerWidget>(_screenWidget);
if (PlWidget)
{
GetStatCom()->_PlHPDelegate.AddUObject(PlWidget, &UMyPlayerWidget::SetPlHPBar);
GetStatCom()->_PlEXPDelegate.AddUObject(PlWidget, &UMyPlayerWidget::SetPlExpBar);
GetStatCom()->_PILevelDelegate.AddUObject(PlWidget, &UMyPlayerWidget::SetPlLevel);
}
//공격 기능 및 효과 기능
void AMyCreature::AttackHit()
{
FHitResult hitResult;
FCollisionQueryParams params(NAME_None, false, this);
float attackRange = 500.0f;
float attackRadius = 50.0f;
bool bResult = GetWorld()->SweepSingleByChannel(
hitResult,
GetActorLocation(),
GetActorLocation() + GetActorForwardVector() * attackRange,
FQuat::Identity,
ECollisionChannel::ECC_GameTraceChannel2,
FCollisionShape::MakeSphere(attackRadius),
params);
FVector vec = GetActorForwardVector() * attackRange;
FVector center = GetActorLocation() + vec * 0.5f;
FColor drawColor = FColor::Green;
if (bResult)
{
drawColor = FColor::Red;
if (hitResult.GetActor() && hitResult.GetActor()->IsValidLowLevel())
{
FDamageEvent DamageEvent;
hitResult.GetActor()->TakeDamage(GetStatCom()->GetAttackDamage(), DamageEvent, GetController(), this);
_hitPoint = hitResult.ImpactPoint;
EffectManager->Play(*GetHitParticleName(), _hitPoint);
SoundManager->PlaySound(*GetHitSoundName(), _hitPoint);
}
}
else
{
FVector missLocation = GetActorLocation();
SoundManager->PlaySound(*GetSwingSoundName(), missLocation);
}
}
- 보스 등장 연출(Scene) 구현
- AI을 활용한 파티 시스템 구현 전투 패턴 적용
- Phase 1,2 Behavior Tree 설계 및 AI 패턴 적용
- AggroComponent를 이용한 공격 대상 결정 로직 개발
//Aggro
AMyPlayer* UMyAggroComponent::GetTopAggroTarget() const
{
AMyPlayer* TopAggroActor = nullptr;
float MaxDamage = 0.f;
for (const auto& AggroEntry : _playerParty)
{
if (AggroEntry.Key->GetStatCom()->IsDead())
continue;
if (AggroEntry.Value > MaxDamage)
{
MaxDamage = AggroEntry.Value;
TopAggroActor = AggroEntry.Key;
}
}
return TopAggroActor;
}
//Decal을 이용힌 스킬 (매초 마다 일정크기 커진후 최대 크기에서 폭발)
void AMyDecalActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
if (_delayTime == 0.0f || _bIsPlay == false)
return;
FVector curScale = GetActorScale();
if (_runTime > _delayTime && _delayTime > 0.0f)
{
_fieldAttackDelegate.Broadcast(GetActorLocation());
_runTime = 0.0f;
curScale.Y = 0.0f;
curScale.Z = 0.0f;
SetActorScale3D(curScale);
_bIsPlay = _bLoop;
return;
}
_runTime += DeltaTime;
curScale.Y = (_runTime / _delayTime) * _areaRadius;
curScale.Z = (_runTime / _delayTime) * _areaRadius;
SetActorScale3D(curScale);
}
- Manager을 이용해 사운드 및 이펙트 관리
- Stat, Aggro를 Component로 설계하여 객체의 기능 모듈화
🔍 원인
소통 부족으로 인한 브랜치 충돌 또는 잘못된 병합으로 인한 컴파일 오류 발생
✅ 해결 방법
주기적인 회의를 통해 진행 상황을 공유하고 GitHub 활용 방식 조율
Develop브랜치에서 병합 및 버그 테스트 후Main브랜치로 반영
🔍 원인
사운드/이펙트의 경로 설정 오류 또는 정리되지 않은 데이터
✅ 해결 방법
AMyEffectManager및AMySoundManager를 통해 중앙 관리
경로 설정 및 리소스 파일 유효성 점검
🔍 원인
BTTask및Behavior Tree연결 오류
✅ 해결 방법
BTTask및AIController관련 코드 수정
BehaviorTree및Blackboard설정 확인
🔍 원인
AnimInstance및Notify설정 오류
✅ 해결 방법
AnimInstance의Notify및Delegate바인드 설정 확인 및 수정
-
C++ 기반 객체 지향 설계 🏗️
- 상속 및 다형성을 활용하여 확장 가능한 게임 구조 설계
- Unreal Engine의 Actor, Component 활용 경험
-
팀 협업과 깃허브 활용 🤝
- 브랜치 전략을 활용한 효과적인 협업 (feature 브랜치 사용, Pull Request 리뷰)
- 코드 리뷰를 통한 코드 품질 향상 및 유지보수성 증가
-
게임 시스템 설계 및 구현 🛠️
- Component를 활용해 객체별로 독립적인 데이터 관리
- Delegate사용으로 이벤트 처리
- AI 기반 파티 시스템과 몬스터 공격 및 보스 몬스터 특수 패턴 구현
- UI기능 구현 및 연동
- Unreal을 이용한 Anim제작
-
게임 플레이 및 사용자 경험 향상 🎨
- 사운드와 이펙트를 결합하여 타격감 개선
- 체력바 및 경험치 시스템을 적용하여 게임 몰입도 향상