Flutter 개발

Flutter Flame으로 2D 게임 만들기: 그리고 왜 Unity로 갔는지

Flame 엔진의 장단점과 전환 결정 과정

John Doe
2025년 5월 15일
8분 읽기
49

Flame 엔진 첫인상

Flutter로 앱을 만들다가 게임도 만들어보고 싶었습니다. Flame은 Flutter 위에서 돌아가는 2D 게임 엔진이라 진입 장벽이 낮았습니다.

Dart 하나로 UI와 게임 로직을 모두 작성할 수 있다는 점이 매력적이었습니다.

간단한 게임 구현

탑다운 슈터를 만들어봤습니다. Flame의 Component 시스템은 직관적예요. SpriteComponent, PositionComponent 같은 기본 요소로 빠르게 프로토타입을 만들 수 있었습니다.
Dart
import 'package:flame/game.dart';
import 'package:flame/components.dart';
import 'package:flame/input.dart';

class MyGame extends FlameGame with TapDetector {
  late Player player;

  @override
  Future<void> onLoad() async {
    // 플레이어 스프라이트 로드
    player = Player()
      ..position = size / 2
      ..size = Vector2(64, 64);
    add(player);

    // 적 스폰 타이머
    add(TimerComponent(
      period: 1.5,
      repeat: true,
      onTick: () => add(Enemy()),
    ));
  }

  @override
  void onTap() {
    player.shoot();  // 탭하면 발사
  }
}

파티클 시스템에서 첫 번째 벽

적을 처치할 때 파티클 이펙트를 넣었더니 프레임이 뚝 떨어졌습니다. Flame의 ParticleSystemComponent는 CPU에서 모든 파티클을 계산합니다.
50개만 동시에 터져도 60fps가 40fps로 내려갔습니다. 저사양 기기에서는 더 심했거든요.
Dart
// Flame 파티클 - 단순하지만 성능 이슈
add(ParticleSystemComponent(
  particle: Particle.generate(
    count: 30,  // 30개만 해도 프레임 드롭
    lifespan: 0.8,
    generator: (i) => AcceleratedParticle(
      acceleration: Vector2(0, 100),
      speed: Vector2(
        random.nextDouble() * 200 - 100,
        -random.nextDouble() * 150,
      ),
      child: CircleParticle(
        radius: 3,
        paint: Paint()..color = Colors.orange,
      ),
    ),
  ),
));

충돌 감지와 오브젝트 풀링 한계

Flame의 충돌 감지는 O(n^2)예요. 화면에 오브젝트가 100개를 넘으면 눈에 띄게 느려집니다. 쿼드트리를 직접 구현해야 했습니다.

오브젝트 풀링도 직접 만들어야 합니다. Unity에서는 기본 제공되는 것들을 Flame에서는 하나하나 구현해야 했어요.

판단 기준: 언제 Flame을 쓰고 언제 Unity를 쓸까

Flame이 적합한 경우: 카드 게임, 퍼즐, 보드 게임 같은 저 연산 게임. Flutter 앱 안에 미니 게임을 넣을 때도 좋습니다.

Unity가 필요한 경우: 파티클이 많은 액션 게임, 복잡한 물리, 수백 개 오브젝트 동시 처리. 이쪽은 GPU 활용이 필수입니다.

Flutter는 게임의 허브로

결국 MonsterDispatchCorps는 Unity로 전환했습니다. 하지만 Flutter를 완전히 버린 건 아닙니다.

Flutter는 게임의 허브 앱으로 쓰고 있죠. 로비, 상점, 설정 화면 같은 UI 중심 화면은 Flutter가 훨씬 빠르게 만들 수 있습니다. 게임 코어 루프만 Unity로 처리하는 하이브리드 구조가 제 결론예요.

전환 과정에서 배운 것

프레임워크 선택은 프로젝트 요구사항에 맞춰야 합니다. 현업에서 '내가 잘 아는 도구'가 항상 정답은 아닙니다.

Flame으로 프로토타입을 만든 시간이 낭비는 아니었죠. 게임 루프의 기본 구조, ECS 패턴을 이해하는 데 도움이 됐고, Unity로 넘어갔을 때 적응이 빨랐습니다.
#Flutter
#Flame
#Unity
#2D 게임
#성능
#게임 엔진