LYSC
Development Insight

2023년 개발 회고록: 엔진의 경계를 넘어서 시야를 넓히다

2023.12.25

유니티와 언리얼을 넘나들며 기술적 스펙트럼을 넓힌 한 해. 다양한 툴을 다루며 얻은 통찰력과 내년의 목표 설정.

멀티 엔진 사용자가 된 이유: 호기심과 필연

2023년은 저에게 있어 '변화'의 해였습니다. 오랫동안 유니티(Unity)를 주력 엔진으로 사용해 오며 C#의 생산성과 방대한 에셋 스토어의 혜택을 누려왔지만, 프로젝트의 규모가 커지고 더 높은 퀄리티의 비주얼과 퍼포먼스를 갈망하게 되면서 언리얼 엔진(Unreal Engine)에 발을 들이게 되었습니다. 단순히 엔진을 바꾸는 것이 아니라, 두 엔진의 철학을 동시에 이해하려는 시도는 제 개발 인생에 큰 전환점이 되었습니다.

유니티는 '접근성'과 '유연성'에서 타의 추종을 불허합니다. 하지만 언리얼은 '시스템의 깊이'와 '기본으로 제공되는 고퀄리티의 기능'들(Nanite, Lumen 등)이 강력했죠. 이 두 세계를 오가는 과정은 마치 두 가지 언어를 동시에 구사하는 통역사가 되는 과정과 비슷했습니다.

C#에서 C++로: 객체 지향을 넘어선 메모리 관리의 세계

언리얼로 넘어오면서 가장 큰 벽은 역시 C++이었습니다. 유니티의 가비지 컬렉터(GC)에 의존하던 습관을 버리고, 포인터와 메모리 수명 주기를 직접 신경 써야 하는 환경은 처음엔 고통스러웠습니다. 하지만 언리얼의 `UObject` 시스템과 스마트 포인터들을 이해하면서, 오히려 더 명확하고 최적화된 코드를 짤 수 있다는 자신감을 얻었습니다.

아래는 유니티와 언리얼에서 유사한 기능을 구현할 때의 코드 비교입니다.

Unity (C#) - 간단한 이동 컴포넌트

using UnityEngine;

public class Mover : MonoBehaviour {
    public float speed = 5f;

    void Update() {
        float horizontal = Input.GetAxis("Horizontal");
        transform.Translate(Vector3.right * horizontal * speed * Time.deltaTime);
    }
}

Unreal Engine (C++ / Header) - Actor 클래스 정의

// AMover.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "AMover.generated.h"

UCLASS()
class MYPROJECT_API AMover : public AActor {
    GENERATED_BODY()
public:
    AMover();
    virtual void Tick(float DeltaTime) override;

    UPROPERTY(EditAnywhere, Category = "Movement")
    float Speed = 500.0f;
};

Unreal Engine (C++ / Source) - 구현부

// AMover.cpp
#include "AMover.h"

AMover::AMover() {
    PrimaryActorTick.bCanEverTick = true;
}

void AMover::Tick(float DeltaTime) {
    Super::Tick(DeltaTime);
    float HorizontalValue = GetInputAxisValue("MoveRight"); // 축 매핑 필요
    FVector NewLocation = GetActorLocation();
    NewLocation.Y += HorizontalValue * Speed * DeltaTime;
    SetActorLocation(NewLocation);
}

비주얼의 혁명: 나나이트(Nanite)와 루멘(Lumen)이 바꾼 작업 방식

언리얼 엔진 5의 핵심 기술들은 아티스트가 없는 1인 개발자에게 축복과 같았습니다. 이전에는 폴리곤 최적화와 라이트맵 베이킹에 수많은 시간을 쏟아야 했지만, 이제는 수백만 개의 폴리곤을 그대로 엔진에 가져와도 실시간으로 돌아갑니다. 루멘(Lumen) 덕분에 조명을 하나 바꿀 때마다 베이킹을 기다릴 필요 없이 즉각적으로 결과를 확인할 수 있다는 점은 생산성 면에서 엄청난 진보였습니다.

하지만 기술이 좋아졌다고 해서 모든 것이 해결되지는 않았습니다. 오히려 그 강력한 툴을 어떻게 효율적으로 다룰지에 대한 새로운 공부가 필요했죠. 셰이더 그래프를 깊게 공부하고, 절차적 생성 기법(PCG)을 도입해 보며 최신 기술의 정수를 맛볼 수 있었습니다.

2023년의 성과와 2024년의 목표

올해 제가 얻은 가장 큰 소득은 **"엔진은 도구일 뿐"**이라는 깨달음입니다. 특정 엔진의 기능에 얽매이지 않고, 내가 만들고 싶은 게임의 형태에 따라 최적의 도구를 선택할 수 있는 눈이 생겼습니다. 유니티는 가벼운 모바일 게임이나 프로토타이핑에, 언리얼은 고사양 PC 게임이나 시각적 완성도가 중요한 프로젝트에 적합하다는 판단 기준이 섰습니다.

2024년에는 다음과 같은 목표를 세웠습니다.

  • 언리얼 엔진 5 심화 학습: 단순히 기능을 사용하는 수준을 넘어, 소스 코드를 분석하고 나만의 커스텀 엔진 기능을 추가해 보는 것.
  • 멀티플랫폼 대응 전략 구축: 유니티와 언리얼 모두에서 원활하게 작동하는 에셋 파이프라인과 플러그인 개발.
  • 오리지널 IP 개발: 그동안 배운 기술들을 집약시킨, 작지만 단단한 게임 하나를 시장에 선보이는 것.

마치며

이 회고록이 엔진 선택의 기로에 서 있거나, 새로운 도전에 주저하는 동료 개발자들에게 자극이 되었으면 합니다. 기술은 매일같이 변하지만, 배움을 향한 열정만큼은 변하지 않아야 한다는 것을 다시 한번 느낀 한 해였습니다. 여러분의 2023년은 어떠셨나요? 모두 고생 많으셨습니다!

심화 분석: 기술적 도전과 해결책

기술적 구현의 디테일

저는 이번 개발 과정에서 모든 기능을 모듈화하여 독립적으로 테스트할 수 있는 환경을 구축했습니다. 이는 추후 기능 확장이나 버그 수정 시 발생할 수 있는 사이드 이펙트를 최소화하는 데 큰 역할을 했습니다. 또한 문서화를 병행하여 기술 부채가 쌓이는 것을 방지했습니다.

프로젝트의 성공은 기술력뿐만 아니라 팀 내 원활한 커뮤니케이션과 체계적인 파이프라인 구축에 달려 있습니다. 자동화된 빌드 시스템과 코드 리뷰 프로세스는 개발 속도를 비약적으로 높여줍니다.

성능 벤치마크 및 최적화 지표

협업 툴 도입 이후 작업 히스토리 추적 시간이 50% 단축되었으며, 휴먼 에러로 인한 빌드 실패율이 눈에 띄게 줄어들었습니다.

실무 적용 시 주의사항

완벽한 설계를 추구하기보다 빠르게 프로토타입을 만들고 피드백을 수용하는 애자일(Agile)한 자세가 1인 개발자에게는 특히 중요합니다.

Drag to Rotate Cube
작성자 프로필

LYSC Studio

1인 게임 개발과 웹 기술에 관심이 많은 개발자입니다. 경험을 통해 배운 것을 공유하고, 함께 성장하는 것을 즐깁니다.