오버워치 | 루시우 볼

프로젝트 설명LucioBall 모작 | C++ 기반 적 AI, 물리 이동, 낙하지점 예측 구현
스킬BluePrintC++Unreal물리 기반 구현
기간
시연 영상https://youtu.be/EQmRjt3lddk?si=k4JUoMIcOZJ5Tkh-
githttps://github.com/jjonjung/LucioBall
성과✔️수학적 랜덤성으로 예측 불가능성 AI 움직임 구현
✔️
Y축 기준 배치를 바탕으로 공격형/수비형 역할을 동적으로 전환
기여도 분석- 총 인원 3명
- 상대 기여도: 약 25%
- 분석 근거
  1. 본인 담당: 루시우 AI Enemy
  2. 타 팀원 담당: 플레이어, 공, 시스템

[프로젝트 개요]

오버워치의 LucioBall 모드를 Unreal Engine 5와 C++ 기반으로 재현한 프로젝트입니다.
적 루시우 AI 구현을 담당했으며, AI FSM 설계, 물리 법칙 기반 이동/점프 구현, 공 낙하지점 예측,
공격/수비 역할 전환 로직
을 중심으로 개발했습니다.

단순 추적형 NPC가 아니라 경기 상황을 해석하고 역할을 바꾸는 FSM 기반 AI를 만드는 데 집중했습니다. 특히 공의 위치와 경기장 Y축 기준 배치를 바탕으로 공격형/수비형 역할을 동적으로 전환하도록 설계했고, 공의 낙하지점을 예측하여 선점하도록 만들어 전략성을 높였습니다. 또한 캐릭터의 이동과 점프를 단순 애니메이션이 아닌 등가속도·포물선·중력 계산 기반의 C++ 로직으로 구현해 루시우볼 특유의 속도감과 타격감을 살렸습니다.

제목루시우볼
한 줄 설명LucioBall은 오버워치의 "루시우 볼" 모드를 언리얼 엔진 5와 C++를 사용하여 재현한 프로젝트
배경 또는 기획 의도플레이어는 루시우 캐릭터를 조작하여 공을 골대에 넣어 득점하며,
AI 플레이어와 상호작용하고 다양한 UI 요소를 통해 게임 상태를 시각적으로 확인할 수 있습니다.
이 프로젝트는 복잡한 게임 로직, AI 구현, 물리 시뮬레이션 개발 능력을 보여줍니다.
참여 인원3명
본인 역할Ai(적 루시우)
진행 기간2025.08.04 ~ 2025.09.01

[시연 영상]

[기술 스택]


[핵심 구현 상세]

1. AI FSM 기반 역할 분리 및 상태 전이

기존의 단순한 Idle → SeekBall → Attack 수준의 FSM만으로는 게임 플레이가 반복적으로 느껴져 흥미도가 떨어지는 문제가 있었습니다. 이를 해결하기 위해 AI를 공격형과 수비형으로 분리하고, IdleSeekBallAttackBallDefendGoalClearBall 상태를 갖는 FSM으로 구체화했습니다.

이 구조를 통해 AI가 같은 공을 보더라도 현재 역할과 경기 흐름에 따라 다른 판단을 내릴 수 있게 되었고, 결과적으로 보다 사람처럼 보이는 전략적 움직임을 구현할 수 있었습니다. 

이 구조의 핵심은 “공의 상태를 해석해 AI의 역할과 행동을 결정한다”는 점입니다.
즉, AI는 단순한 명령 실행자가 아니라 환경 정보를 기반으로 상태를 전환하고 행동을 선택하는 구조로 설계되었습니다. 

2. 물리 기반 움직임 구현

2-1. 등가속 운동을 이용한 점프 포인트에서 점프 구현


flowchart LR
    Jump --> V["v0 , θ"] --> Tick --> A --> R

    Tick -.- T1["v = v + a · Δt
p = p + v · Δt"]
    A -.- A1["a = (0, -g)
vy = 0"]

    style T1 fill:#f0f4ff,stroke:#aabbcc,color:#333
    style A1 fill:#f0f4ff,stroke:#aabbcc,color:#333

2-2. 넉백

[아키텍처 / 시스템 구조]

시스템 흐름 요약

%%{init: { "flowchart": { "curve": "linear", "useMaxWidth": true } }}%%
flowchart-elk TD
    A["공 위치 / 이동 상태 수집"] 
    --> B["낙하지점 예측"]
    B --> C["AI 역할 판단(공격형/수비형)"]
    C --> D["FSM 상태 전이"]
    D --> E["이동/슈팅/스킬 실행"]
    E --> F["애니메이션 / VFX 연동"]
    F --> G["DataAsset 기반 밸런스 조정"]

- 공 낙하지점 예측 기반 선제 대응

반응형 AI는 공을 뒤늦게 추적하기 때문에 플레이 감각이 둔하게 느껴질 수 있습니다. 이를 보완하기 위해 공의 위치와 이동 흐름을 기준으로 착지 지점을 예측하고, 해당 위치를 AI의 목표 지점으로 삼도록 설계했습니다.

이를 통해 AI는 단순히 공을 따라가는 것이 아니라, 앞으로 공이 떨어질 위치를 선점할 수 있게 되었고, 플레이어 입장에서 더 위협적이고 자연스러운 상대처럼 느껴지도록 만들었습니다. 

- 물리 공식 기반 캐릭터 이동 구현

캐릭터 움직임의 생동감이 부족했던 문제를 해결하기 위해, 이동 로직에 등가속도 운동 공식을 적용했습니다. 단순한 일정 속도 이동이 아니라 가속과 감속을 반영하여 속도감 있는 움직임을 구현했고, 점프는 중력과 초기 속도를 고려한 포물선 운동 기반으로 계산했습니다.

이 과정에서 충돌, 관성, 마찰 같은 요소도 함께 반영해 보다 자연스럽고 게임다운 움직임을 만들 수 있었습니다. 

- DataAsset 기반 밸런스 조정

베타 단계에서는 행동 파라미터와 역할 관련 값을 코드에 고정하지 않고 DataAsset 기반으로 분리해 밸런스를 조정할 수 있도록 개선했습니다.

이를 통해 AI 행동 패턴이나 속도, 역할 우선순위 같은 요소를 코드 수정 없이도 관리할 수 있었고, 협업 상황에서도 데이터 중심으로 빠르게 조정 가능한 구조를 만들 수 있었습니다.


[트러블슈팅]

1. AI가 단조롭고 흥미도가 낮았던 문제

  • 문제: 간략한 FSM만으로는 AI 패턴이 단순해 게임 플레이가 쉽게 읽혔음
  • 원인: 공격/수비 상황이 충분히 분리되지 않았고, 상태 수가 적어 행동 다양성이 부족했음
  • 해결: 공격형/수비형 AI를 분리하고 AttackBallDefendGoalClearBall 등 상태를 세분화
  • 결과: AI가 상황에 따라 다른 판단을 내리게 되면서 플레이 체감 난이도와 전략성이 향상됨

2. 캐릭터 움직임이 생동감 없었던 문제

  • 문제: 이동이 기계적으로 느껴져 루시우볼 특유의 속도감이 부족했음
  • 원인: 단순 이동 처리만으로는 가속/감속과 점프의 물리적 감각을 표현하기 어려웠음
  • 해결: 등가속도 운동과 중력 수식을 적용하고, 점프는 포물선 기반으로 계산
  • 결과: 이동과 점프가 더 자연스럽고 역동적으로 표현되어 게임의 몰입도가 향상됨 

3. 역할 태그 충돌 문제

  • 문제: 역할 태그가 충돌하면서 AI의 우선순위 판단이 꼬이는 이슈 발생
  • 해결: 우선순위를 재정의하고 캐시 키를 분리하여 역할 판단 기준을 명확히 함
  • 결과: 역할 전환 안정성이 높아지고 상태 전이의 일관성이 개선됨 

4. 착지 예측 근거 부족 문제

  • 문제: AI가 어디로 이동해야 하는지 판단할 근거가 부족했음
  • 해결: 공 오브젝트가 착지 값을 전달하는 방식으로 구조를 조정
  • 결과: AI가 예측 기반으로 움직일 수 있게 되어 반응성보다 선제성이 강화됨

[회고]

이번 프로젝트를 통해 단순히 적 캐릭터를 움직이게 하는 수준을 넘어, 상황을 해석하고 역할을 전환하며 위치를 예측해 자연스럽게 행동하는 AI를 구현하는 데 있어 물리 기반 접근이 얼마나 중요한지 체감할 수 있었습니다.
특히 물리 기반 게임에서는 움직임의 자연스러움뿐 아니라, 역할 전환의 타이밍과 상태 판단 기준이 플레이 경험에 직접적인 영향을 미친다는 점이 인상 깊었습니다.
앞으로는 행동 패턴의 다양성을 확장하고, 멀티플레이 환경에서의 검증 체계를 강화해 보다 완성도 높은 AI 시스템으로 발전시키고자 합니다.


[프로젝트 결과]

  • AI 공격형, 수비형으로 구분하여 각 포지션 별 다양한 패턴 움직임 구현
  • 물리 공식(등가속 운동) 기반 움직임 구현
  • player 스킬 대응(player의 공 착지 지점을 예측, 공을 당겨와 선 공격 가능하게 구현)
  • 핵심 요소가 안정적으로 동작하는 고난도 AI 구성 완성