View & Mode Change

Scene View와 Game View 정의

  • Scene View

    • 정의: 게임 개발자가 씬(장면)을 편집하고 조작하는 에디터 환경의 뷰

    • 목적: 게임 객체 배치, 속성 편집, 씬 구성 등 개발 과정에 사용

    • 구현 방식: GUIManager 클래스의 _isSceneView 플래그로 제어

// GUIManager.h
bool _isSceneView = true;

bool isSceneView() { return _isSceneView; }
  • Game View

    • 정의: 실제 게임이 실행될 때 플레이어가 보게 될 뷰

    • 목적: 최종 사용자 경험 테스트, 게임 동작 확인

    • 전환 방식: _isSceneView 플래그를 false로 설정하여 전환

Scene View와 Game View의 카메라 차이

  • EditorCamera (Scene View)

    • 목적: 개발자의 자유로운 씬 탐색과 편집을 위한 카메라

    • 주요 특징:

      • WASD 키로 이동, 마우스 오른쪽 버튼으로 회전

      • 에디터 전용 입력 처리 (INPUT.GetSceneButton() 사용)

      • 에디터 모드에서도 GetEditorDeltaTime()을 사용해 지속적으로 움직임

// EditorCamera.cpp의 주요 부분
void EditorCamera::Update()
{
    if (!GUI.isSceneView())
        return;

    if (INPUT.GetSceneButton(KEY_TYPE::RBUTTON))
    {
        // 마우스 리셋 및 카메라 제어 로직
        float dt = (ENGINE.IsEditMode() || ENGINE.IsPausedMode()) ? 
                    TIME.GetEditorDeltaTime() : TIME.GetDeltaTime();

        // WASD 이동 로직
        // 마우스 회전 로직
    }
}

  • MainCamera (Game View)

    • 목적: 실제 게임에서 플레이어가 보게 될 시점

    • 주요 특징:

      • 게임 로직에 의해 제어됨 (스크립트 컴포넌트로 구현)

      • 게임 입력에만 반응 (INPUT.GetButton() 사용)

      • Play 모드에서만 움직임 (GetDeltaTime()이 0이 아닐 때)

// Scene.cpp에서 카메라 전환 로직
void Scene::Start()
{
    if (ENGINE.GetEngineMode() == EngineMode::Edit || ENGINE.GetEngineMode() == EngineMode::Pause)
        SwitchMainCameraToEditorCamera();
    else
        SwitchMainCameraToMainCamera();
    
    // ...
}

Edit, Play, Pause 모드의 차이

  • Edit 모드

    • 정의: 씬을 편집하고 게임 객체를 조작하는 기본 에디터 모드

    • 특징:

      • _editScene 객체에서 작업

      • 게임 로직 실행되지 않음 (Update 메서드는 호출되지만 deltaTime은 0)

      • 씬 영구 수정 가능

      • GetDeltaTime()은 0을 반환, 게임 시뮬레이션 정지

  • Play 모드

    • 정의: 실제 게임 실행을 시뮬레이션하는 모드

    • 특징:

      • Edit 모드의 씬을 복사하여 _playScene으로 생성

      • 모든 게임 로직 정상 실행

      • 씬 변경 사항은 일시적 (Edit 모드로 돌아가면 모두 초기화)

      • GetDeltaTime()이 실제 경과 시간 반환

  • Pause 모드

    • 정의: Play 모드에서 게임 실행을 일시정지한 상태

    • 특징:

      • Play 모드의 씬 상태 유지하면서 시간만 정지

      • 게임 로직은 호출되지만 deltaTime이 0이라 진행되지 않음

      • GetDeltaTime()은 0을 반환하지만, GetEditorDeltaTime()은 계속 시간 측정

  • 모드 전환 처리 로직

// EngineBody.cpp
void EngineBody::SetEngineMode(EngineMode mode)
{
    // 같은 모드 설정 처리 또는 Pause 토글
    if (_engineMode == mode)
    {
        if (mode == EngineMode::Pause)
            _engineMode = _prevEngineMode;
        else
            return;
    }
    // Pause 모드 전환 - 이전 모드 기억
    else if (mode == EngineMode::Pause)
    {
        _prevEngineMode = _engineMode;
        _engineMode = mode;
    }
    // Play 모드 전환 - 씬 복사
    else if (mode == EngineMode::Play)
    {
        // 현재 편집 씬 저장
        _editScene = SCENE.GetActiveScene();
        // 복사본 생성
        _playScene = SCENE.LoadPlayScene(_editScene->GetSceneName());

        // 엔진 상태 리셋
        SCENE.Reset();
        RENDER.Reset();
        GUI.ResetSelectedObject();

        // 플레이 모드로 전환
        _engineMode = mode;
        SCENE.SetActiveScene(_playScene);
        SCENE.Init();
        RENDER.Init();
    }
    // Edit 모드 전환 - 원본 씬 복원
    else if (mode == EngineMode::Edit)
    {
        // 엔진 상태 리셋
        SCENE.Reset();
        RENDER.Reset();
        GUI.ResetSelectedObject();

        // 편집 모드로 전환
        _engineMode = mode;
        SCENE.SetActiveScene(_editScene);
        _playScene = nullptr;

        SCENE.Init();
        RENDER.Init();
    }
}

시간 관리 방식

  • 두 가지 시간 측정 메커니즘

    • EditorDeltaTime: 항상 실제 경과 시간을 측정

    • DeltaTime: 모드에 따라 0 또는 실제 시간 반환

  • 모드별 시관 관리

    • Edit 모드:

      • GetDeltaTime() → 0 반환 (게임 로직 정지)

        • GetEditorDeltaTime() → 실제 시간 반환 (에디터 UI, 카메라 등은 계속 작동)

    • Play 모드:

      • GetDeltaTime() → 실제 시간 반환 (게임 정상 실행)

        • GetEditorDeltaTime() → 실제 시간 반환

    • Pause 모드:

      • GetDeltaTime() → 0 반환 (게임 로직 정지)

        • GetEditorDeltaTime() → 실제 시간 반환 (에디터 기능 계속 작동)

  • 시간 관리 코드

// TimeManager.cpp
void TimeManager::Update()
{
    uint64 currentCount;
    ::QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER*>(&currentCount));

    // 에디터 시간은 항상 측정
    _editorDeltaTime = (currentCount - _prevCount) / static_cast<float>(_frequency);

    // 게임 시간은 조건부 측정
    if (_isEnginePause || _isPaused || ENGINE.GetEngineMode() == EngineMode::Edit)
    {
        _deltaTime = 0.0f;
        _prevCount = currentCount; // 누적 방지
        return;
    }

    _deltaTime = (currentCount - _prevCount) / static_cast<float>(_frequency);
    _prevCount = currentCount;
    
    // FPS 계산 등 추가 작업
}

float TimeManager::GetDeltaTime()
{
    if (ENGINE.GetEngineMode() == EngineMode::Edit || ENGINE.GetEngineMode() == EngineMode::Pause)
        return 0.0f;
    return _deltaTime;
}

Last updated