기본 콘텐츠로 건너뛰기

[Godot Engine] 다양한 화면 크기에 맞게 게임화면을 가운데 위치 시키는 방법

다양한 화면 크기에 맞게 게임화면을 가운데 위치 시키는 방법

Godot engine은 다앙한 화면에서 어떻게 화면을 보여줄지 설정할 수 있게 여러가지 옵션들을 제공해 준다. 

만일 화면을 가득 채우지 않고 검은색 띠로 화면의 남는 영역을 채워도 되거나, 게임의 가로세로 비율을 화면에 맞게 변경해도 된다면, 기본 옵션중에 하나를 적절히 골라 사용하면 된다.

하지만, 기본 옵션만으로는 가로 세로 비율을 유지 한 채로 다양한 화면크기에 맞춰서  게임배경을 화면 가득 채우면서 게임내 요소들을 적절히 배치 하는 것은 쉽지 않는 일이다.

우선 요구사항을 정리해 보면 다음과 같다.
  1. 다양한 화면 크기에서 배경은 화면을 꽉 채워야 한다.
  2. 게임의 컨텐츠들은 화면 크기에 맞게 적절히 배치 되어야 한다.
이 두가지 요건을 만족시키는 여러가지 방법이 있을 수 있겠지만, 그 중 내가 시도한 내가 생각하기에 가장 간단한 방법을 여기에 소개 해 보려 한다.

1. 배경과 컨텐츠를 분리 한다.

배경 노드와 배경외 나머지 게임 컨텐츠를 분리해서, 배경은 화면을 가득 채우는데 사용하고 컨텐츠는 화면 크기에 맞게 조절해서 배치 하도록 한다.

우선 새로운 씬을 만들고, 이름을 Game 이라고 하자.



2. 배경을 전체 화면에 맞도록 조정한다.

만일 단색 배경으로 할 경우에는 ColorRect 노드를 사용하면 될 것 이고, 이미지를 사용하려 한다면 TextureRect, 그외 테두리가 있는 배경을 원한다면 NinePatchRect를 사용하면 된다. 좀 더 복잡한 배경을 원한다면 별도의 Scene으로 구성한 후, instance화 해서 배경으로 사용할 수 도 있을 것 이다.

이 글에서는 가장 단순한 예제를 통해 아이디어를 보여주기 위해 단색으로 배경을 설정 할 것 이므로 필요한 것은 ColorRect 다.

Scene의 루트 노드를 ColorRect로 변경 하고, 노드의 상하좌우 anchor들을 각각 0, 1, 0, 1로 설정 하고, margin들도 역시 모두 0으로 설정 한다. 이렇게 하면 윈도우의 크기가 변해도 전체 윈도우를 ColorRect가 채우게 된다.



3. 컨텐츠를 모두 포함하는 씬을 만들어 그 컨텐츠 씬을 화면의 중앙에 배치 한다.

컨텐츠로 사용할 씬을 하나 만들고 이름을 Contents 라고 하자. 루트 노드는 내 게임에 적합한 최적의 비율을 가지도록 크기를 설정해 준다. 


내 경우는 Project - Settings - Display의 Width와 Height가 각각 600, 400 으로 설정 되어 있으므로, 내 컨텐츠들도 여기에 꽉 차도록 크기를 지정 할 것 이다. 그리고, 루트 노드의 색상을 투명하게 해서 앞에서 만든 배경이 보이도록 한다.



모든 게임은 이 컨텐츠 씬 안에서 동작하도록 게임을 작성한다. 예제에서는 기본 버튼 하나와, 이전 포스팅에서 작성한 에니메이션 버튼을 추가 한다.


이제, 이 컨텐츠 씬을 배경이 있는 씬에 배치 하도록 해 보자. Game 씬의 자식 노드로 지금 만든 Contents 씬의 instance를 넣으면 된다. 하지만, 실행 후 윈도우를 조절 해 보면, 바당 화면은 크기에 맞게 색상이 꽉 채워지지만, 컨텐츠는 좌상단을 기준으로 고정된 위치에 고정된 크기로 표시 되는 것을 확인 할 수 있다.


여기서 핵심은 현재 화면의 가로 크기와 세로 크기를 얻은 후, 그 크기에 적절하게 비율을 계산 한 후 더 작은 비율에 맞도록 scale 값을 구해 컨텐츠 노드 자체의 확대/축소를 통해 화면안에 적절하게 배치 할 수 있는 크기로 만든 후 배치 하는 것 이다. 이 부분은 스크립트를 통해 이루어 진다.

Game 씬에 다음과 같은 스크립트를 추가 하자.


스크립트를 추가 한 후, 실행을 하면 다음과 같이 화면이 어떤 크기로 변경 되어도 컨텐츠는 화면을 최대한 채우면서 가운데에 위지 하게 된다.

만일, 모바일 기기같이 사용중 화면 크기 변경이 없는 경우는 _ready() 안에서 화면 배치를 하고, 화면 크기 변경에 따른 처리를 따로 해주지 않아도 된다.


댓글

이 블로그의 인기 게시물

Godot-Rust 개발환경 설정

Godot-Rust 개발환경 설정 우선은 개발환경을 설치해 보면서 하나씩 배워보면 좋을 것 이다. 공식 홈페이지에 Godot 과 Rust 개발환경을 설정하는 방법이 자세히 나와있으니 각각 따라서 잘 설치하면 되지만, Godot과 Rust를 동시에 사용하기 위한 내용을 포함해 다시 정리해 본다. 앞선 게시물에서 Godot에서 C/C++ 바인딩을 위해 GDNative와 헤더를 제공한다고 적었는데, 이를 통해 Rust도 Godot과 바인딩해서 사용할 수 있다. 직접 GDNative와 바인딩 하는 것을 할 수도 있겠지만, 이미 godot-rust 오픈소스 프로젝트에서 안정적으로 바인딩된 상태이므로 이 프로젝트를 사용하면 다시 바인딩 할 필요없이 제공되는 gdnative crate를 사용함으로써 쉽게 Rust를 이용해 Godot 개발을 할 수 있다. Godot Engine Godot 공식 다운로드 페이지 에서 자신의 OS에 해당하는 이미지를 받아서 적절한 폴더(예들들어, ~/Godot/)를 만들고 집어 넣는다. 어느곳 에서도 실행 할 수 있도록, 환경변수에 path를 설정한다. The godot-rust Book  페이지에는 3.2.3-stable을 지원하고 있다고 되어 있는데, 이는 cargo의 dependency에 gdnative crate 버젼을 0.9.3 으로 명시했을때고, 그렇지 않고 github의 주소를 적으면, 3.4.2 (이 글을 작성하는 최신버전) 까지도 문제없이 동작한다. Rust rustup  을 방문하면, rust 에서 공식적으로 제공하는 설치 이미지를 통해 Rust toolcahin을 설치 할 수 있다. (Ubuntu인 경우 curl 을 통해 받아서 설치됨) 설치 후 다음과 같은 명령어를 통해 잘 설치 되었는지 확인할 수 있다. LLVM godot-rust 는 LLVM에 기반한 bindgen을 기반해 바인딩 되어 있기 때문에, LLVM 바이너리를 설치해야 한다. 설치 후 다음 명령을 통해 설치가 잘 되어 있는지 확인 할 수 있다....

Dodge The Creep - [2]

Dodge The Creep - [2] 템플릿 정리하기 Template 정리 본격적으로 tutorial 을 따라하기 전에 우선 프로젝트 설정을 위해 복사해 놓은 template code를 정리할 필요가 있다. 현재 이 template 코드에는 삼차원 큐브가 회전하고 있는 상태이고, rust code의 경우 이 글을 작성하고 있는 현재 시점에서는 에러를 포함하고 있기도 하다. Godot Project Godot 엔진 에디터를 시작해서, 만들어 놓은 프로젝트 폴더의 godot 폴더 안에 있는 project.godot 파일을 열어서 프로젝트를 로딩한다. 왼쪽 하단의 FileSystem 영역을 보면 폴더 구조로 resource들이 나열되어 있는데, res://scenes 아래에 Game.tscn과 SpinningCube.tscn 두개의 scene 파일이 들어 있는 것이 보일 것 이다.  여기서, SpinningCube.tscn은 불필요 하기 때문에 지운다. 그리고나서, Game.tscn 파일을 열어보면 왼쪽 상단 Scene 텝에 scene에 포함된 노드들이 보이는데, 루트노드는 Spatial 타입의 노드이고, 그 밑으로 Camera 와 SpinningCube 노드들이 붙어 있는 것이 보일 것 이다.  우선 Camera와 SpinningCube 노드들워준 후, Game 노드의 타입을 Node2D 타입으로 변경 해 준다. 이제 Godot project 의 정리는 완료 되었다. Rust project 이제 Rust project를 정리해 볼 차례다. 프로젝트 폴더 아래 rust 폴더를 VSCode로 열어보자. 왼쪽 파일 탐색기를 보면, src 폴더아래에 세개의 .rs 파일이 존재 하는 것을 볼 수 있다. 이 중, spinnig_cube.rs를 지우고, lib.rs 안에서 spinning_cube.rs 파일을 호출 하는 부분들을 지워주자. lib.rs 파일을 열면, spinnig_cube 모듈을 로딩 하는 부분과, Godot에 노출하는 클래스로 등록하는 부분...

[C#] 자동으로 특정 팝업창 닫기

[C#] 자동으로 특정 팝업창 닫기 Windows UI 테스트 혹은 자동화 작업을 할 때, 특정 윈도우창 혹은 팝업창이 뜨는 것을 인지 하고, 내용을 얻거나 버튼을 누르려면,  System.Windows.Automation 의 AddAutomationEventHandler 를 사용하면 된다. Hook 설정 4 번째 라인에서 WindowOpendEvent를 설정 함 으로써, 창이 열릴 때 hook이 걸린다. 7 번째 라인에서 event handler를 등록 한다. Event Handler 설정 8 번째 라인에서 element의 이름이 내가 찾는 이름인지 비교한다. 15번째 라인에서 팝업창의 내용을 출력 한다. 22번째 라인에서 팝업창의 자식 element중에 "N" 문자가 포함된 것 즉, 아니오 버튼을 찾는다. 24~25번째 라인에서 버튼을 누르는 동작을 수행 한다.