유니티 개발자를 위한 Roblox

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

이 페이지에는 경험이 풍부한 유니티 개발자가 Roblox를 시작하는 데 도움이 되는 정보가 포함되어 있습니다. 여기에는 기본 orientation, 개념적 비교 및 두 플랫폼 간의 주요 차이점이 포함됩니다.

방향 설정

여러 창과 패널을 보여주는 마크업이 포함된 유니티 사용자 인터페이스. 여러 창과 패널을 보여주는 마크업이 포함된 Roblox Studio 사용자 인터페이스.

유니티의 Hierarchy 창과 Roblox Studio의 Explorer는 3D 장면의 요소를 구성하는 주요 창입니다:

  • 두 창 모두 개체(예: 캐릭터 및 환경 자산)를 관리하고 구성할 수 있습니다.
  • 두 창 모두 개체 간의 부모-자식 관계를 위한 트리 구조를 사용합니다.

그러나 Hierarchy 창은 미리 정의된 구조가 없는 반면, Explorer 창은 엄격한 구조를 가지고 있습니다. Explorer 창을 유니티의 HierarchyProject 창의 조합으로 생각하는 것이 도움이 될 수 있으며, Workspace 폴더는 가장 잘 알려진 요소입니다.

유사하게, Roblox Studio의 Asset ManagerToolbox는 유니티의 Project 창과 겹칩니다. Asset Manager를 사용하면 게임 내의 모든 자산을 관리할 수 있고, Toolbox는 발행한 모든 자산에 접근할 수 있습니다. Toolbox는 또한 Roblox 또는 커뮤니티의 자산을 검색할 수 있는 Creator Store에 접근할 수 있게 해주며, 이는 유니티의 Asset Store와 유사합니다.

철학적 차이

Roblox는 전통적인 게임 엔진이 아닌 "시뮬레이션 엔진"입니다. 유니티의 GameObjects와 Roblox의 Parts는 3D 환경에서 개체를 생성하기 위한 기본 빌딩 블록 역할을 하지만, 실제로는 두 개체가 상당히 다릅니다:

  • 표현: 유니티의 GameObjects는 장면 내의 모든 개체에 대한 고수준 개념인 반면, Roblox의 Parts는 원시 개체와 같은 추상 기하학이 아니라 나무 블록 및 플라스틱 구체와 같은 물리적 개체를 나타내기 위해 설계되었습니다.
  • 물리학: 유니티에서 물리 시뮬레이션을 수행하려면 RigidbodyCollider와 같은 구성 요소를 GameObject에 첨부해야 합니다. Roblox에서는 물리학이 Parts 데이터 타입에 내장되어 있으며, 엔진이 상호작용을 자동으로 처리합니다.

GameObjectPart를 생성하면 즉시 차이를 확인할 수 있습니다. GameObject는 위치, 회전 및 스케일 외에 아무것도 없습니다. Part는 동일한 정보 외에 재질 및 색상, 반사도 및 투명도, 질량 및 형태 등 여러 정보를 갖고 있습니다. Part를 빈 GameObject와 유사하게 만들려면 많은 내장 속성을 제거해야 합니다. 반대로 GameObjectMeshFilter, MeshRenderer, Collider, 그리고 Rigidbody 구성 요소를 추가하면 Part와 비슷하게 만들 수 있습니다.

스크립팅 관점에서 GameObject는 Roblox의 Instance에 가장 유사합니다. Instance는 다른 Roblox 클래스의 기본 클래스이지만, Instance 유형의 개체를 생성할 수 없으므로 비교가 특히 실용적이지 않습니다.

또 다른 비교는 유니티의 GameObject와 Roblox의 Model입니다. 모델은 유니티에서 여러 GameObjects 간의 부모-자식 관계를 설정하는 방식과 유사하게 상호 연결된 파트의 컬렉션을 담는 용기로 사용됩니다. 모델의 일부를 주요 부분으로 지정하여 회전축을 정의합니다. 모델은 또한 스크립트, 애니메이션, 음향 효과, 프롬프트, 제약 조건, 입자 방출기 등을 보유합니다.

예를 들어, 유니티 GameObjectParticleSystem, Physics3D, SpringConstraint, 및 스크립트의 구성 요소를 가질 수 있습니다. Hierarchy 창에서는 SpringyFireball이라는 단일 GameObject를 볼 수 있습니다. Inspector 창에는 구성 요소 및 프로퍼티의 컬렉션이 표시됩니다.

Roblox에서 Explorer 창의 유사한 SpringyFireball 모델은 다음과 같을 것입니다:


Model
|- ParticleEmitter
|- MeshPart
|- SpringConstraint
|- ClickDetector
| |- Script

Roblox의 물리기본 철학은 3D 모델 구축 과정에까지 확장됩니다. Roblox에서는 여러 파트를 하나의 어셈블리로 용접하여 빠르게 물건을 만드는 것이 훌륭한 방법입니다. Roblox는 용접된 파트를 단일 강체로 취급합니다. 이 접근 방식은 유니티에서는 제공되지 않습니다.

유니티가 길이 및 질량에 대한 표준 미터법 단위를 사용하는 반면, Roblox는 스터드 및 Roblox 질량 단위(RMU)라는 개념적 단위를 사용합니다. 대략적인 미터 변환 및 사용에 대한 권장 사항은 Units를 참조하세요.

위치의 중요성

Roblox 게임은 기본적으로 멀티플레이어이기 때문에 Roblox Studio는 특정 동작을 가진 다양한 저장 위치를 포함합니다. 자세한 내용은 클라이언트-서버 런타임객체 구성을 참조하세요.

LocationDescription
Workspace게임의 3D 세계를 나타냅니다. 이 위치는 객체에 직접 연결되어 그 동작을 제어하는 서버 스크립트에 적합합니다.
ReplicatedFirst클라이언트에 가장 먼저 복제되는 객체를 포함합니다. 이 위치는 로딩 화면을 표시하는 데 필요한 최소한의 객체와 클라이언트 스크립트에 이상적입니다.
ReplicatedStorage클라이언트와 서버 모두에 복제되는 객체를 포함합니다. 이 위치는 서버와 클라이언트 모두에서 사용하고자 하는 ModuleScripts에 적합합니다. LocalScripts는 이 위치에서 실행되지 않지만, RunContextClientScripts는 실행됩니다.
ServerScriptService서버 스크립트를 포함합니다. 이 위치는 게임 로직 및 클라우드 스토리지와 같은 서버 측 기능이나 객체에 접근해야 하는 스크립트에 적합합니다.
ServerStorage서버 측 객체를 포함합니다. 이 위치는 게임에 참여할 때 클라이언트에 즉시 복제될 필요가 없는 큰 객체에 적합합니다. 이 위치에서 스크립트는 실행되지 않지만, 서버 측 ModuleScripts를 여기에 저장할 수 있습니다.
StarterPlayerStarterCharacterScripts캐릭터가 생성될 때 실행되는 LocalScripts를 포함합니다.
StarterPlayerStarterPlayerScripts플레이어가 게임에 참여할 때 실행되는 일반적인 LocalScripts를 포함합니다.
StarterGui클라이언트가 게임을 로드할 때 표시하는 GUI 요소를 포함합니다. LocalScripts는 이 위치에서 실행될 수 있습니다. 이 위치는 버튼, 메뉴 및 팝업을 추가하는 등 게임의 사용자 인터페이스를 수정하는 스크립트에 적합합니다.
StarterPack일반적으로 Tools만 포함되지만, 플레이어 배낭을 설정하기 위한 LocalScripts도 포함할 수 있습니다.

스크립팅

Roblox 게임은 세 가지 유형의 Luau 스크립트를 지원합니다:

  • 클라이언트 스크립트

    이러한 스크립트는 클라이언트에서 실행되며, 서버는 그 동작을 볼 수 없습니다. 레거시 이유로 인해, 이러한 스크립트는 LocalScripts 또는 Scripts 형식을 취할 수 있으며, RunContext 값은 Client입니다. 클라이언트 스크립트는 일반적으로 ReplicatedStorage, StarterPlayerScripts 또는 StarterCharacterScripts에 위치합니다.

  • 서버 스크립트

    이러한 스크립트는 서버에서 실행되며, 클라이언트는 그 동작을 볼 수 없습니다. 서버 스크립트는 RunContext 값이 Server이며, 일반적으로 ServerScriptService에 위치하고, 그 내용은 클라이언트에 복제되지 않습니다.

  • 모듈 스크립트

    이러한 스크립트는 정확히 하나의 값을 반환하는 재사용 가능한 코드 조각으로, 일반적으로 함수 또는 테이블(또는 함수의 테이블)입니다. 클라이언트 및 서버 스크립트에 코드를 중복하는 대신, 모듈 스크립트를 사용하여 두 스크립트 간에 코드와 데이터를 공유하세요. 모듈 스크립트는 종종 ReplicatedStorage에 위치하지만, 클라이언트-서버 경계의 같은 쪽에 있는 스크립트 간에 코드를 공유하려면 다른 장소에 있을 수도 있습니다.

유니티는 다양한 스크립트 유형의 개념이 없습니다. 멀티플레이어 게임을 만들기로 결정하면, 유니티는 GameObject(및 해당 스크립트)가 서버에 독점적이어야 할 때를 나타내기 위해 네트워킹 라이브러리를 사용합니다.

유니티에서 엔진의 기능 대부분은 MonoBehaviour의 메서드를 통해 제공됩니다. 예를 들어, 렌더 루프 전의 코드를 실행하려면 Update() 메서드에 코드를 추가합니다. 물리 충돌 이벤트를 처리하려면 OnCollideEnter() 메서드에 코드를 추가합니다.

Roblox 스크립트는 이벤트 중심적입니다. 서비스에 구독하고 업데이트를 대기하여 유사한 기능을 활용합니다.

C# 및 Luau

스크립팅을 위해 유니티는 C#을 사용합니다. Roblox는 Luau를 사용하며, 이는 Lua 5.1에서 파생된 스크립트 언어입니다.

C#에 비해 Luau는 점진적으로 유형화되며 일반적으로 덜 장황한 문법을 가지고 있습니다. 그러나 더 큰 프로젝트에서는 점진적 유형화가 C#과 같은 강한 유형 언어가 피하는 버그 범주를 도입할 수 있으므로, Roblox 스크립트에서 엄격한 유형 검사를 활성화하는 것을 고려하세요.

스크립트 언어 간의 기본 문법 차이에 대한 내용은 Luau와 C# 비교를 참조하세요.

Luau 코드 샘플

다음 Luau 코드 샘플은 플레이어가 낚시대를 장착한 후, 사용자 입력(이 경우 E 키)을 들어오기를 듣고 추가 함수를 호출하는 방법을 보여줍니다:


local ContextActionService = game:GetService("ContextActionService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- 단일 함수를 반환하는 ReplicatedStorage의 모듈 스크립트를 가져옵니다.
local performSomeAction = require(ReplicatedStorage.performSomeAction)
-- 이 스크립트가 낚시대의 자식이라고 가정합니다.
local fishingPole = script.Parent
local ACTION_CAST = "Cast"
-- 키가 눌러졌는지 확인한 후, 다른 함수를 호출합니다.
local function castLine(_actionName, inputState, _inputObject)
if inputState == Enum.UserInputState.Begin then
performSomeAction()
end
end
-- 플레이어가 낚시대를 장착할 때만 행동을 활성화합니다.
fishingPole.Equipped:Connect(function()
ContextActionService:BindAction(ACTION_CAST, castLine, true, Enum.KeyCode.E)
end)
-- 플레이어가 낚시대를 벗을 때 행동을 비활성화합니다.
fishingPole.Unequipped:Connect(function()
ContextActionService:UnbindAction(ACTION_CAST)
end)

Roblox 스크립트는 Roblox가 많은 내장 가정을 가지고 있기 때문에 상대적으로 간결할 수 있습니다: PlayerHumanoid 캐릭터와 연결되어 서버와 연결되어 있으며 Tools를 장착할 수 있습니다. 이러한 가정은 유니티에서는 존재하지 않으므로 구현이 매우 다를 것입니다.

자산

유니티와 Roblox는 모두 .fbx 형식의 사용자 정의 메시와 모델을 가져오는 것을 지원합니다. 특정 자산 유형은 타사 모델링 소프트웨어에서 특정 구성 및 내보내기 설정이 필요할 수 있습니다. 자세한 내용은 다음 페이지를 참조하세요:

유니티에서는 객체가 Project 창에서 볼 수 있는 Assets 디렉토리로 가져옵니다. Roblox에서는 자산이 WorkspaceToolbox 또는 Asset Manager에 가져옵니다.

Roblox는 또한 가져오기 프로세스를 간소화하기 위해 오픈 소스 Blender 플러그인을 제공합니다.

변환

Unity의 변환과 Roblox의 CFrames는 물체의 3D 변환을 나타내는 데 유사한 목적을 가지고 있습니다:

  • 변환과 CFrames는 모두 3D 공간에서 물체의 위치와 회전을 나타냅니다. 변환은 스케일을 포함하지만, Roblox에서는 BasePart.Size 속성을 사용하며 이는 CFrame의 일부가 아닙니다.
  • 둘 다 복잡한 변환을 위한 곱셈을 지원하며, 다른 조작을 위한 내장 메서드를 가지고 있습니다.

협업

유니티에서는 표준 버전 관리 시스템이나 Unity 버전 제어와 같은 유료 서비스를 통해 협업합니다.

Roblox 파일은 클라우드에 저장되며 (복사본 내보내기가 가능하지만), Roblox Studio는 동시에 편집, 그룹 관리, 권한, 스크립트 초안 작성 등을 위한 내장 협업 워크플로를 제공합니다. 협업을 참조하세요.

플러그인

유니티 도구와 유사하게, Roblox Studio는 플러그인을 지원하여 개발 프로세스의 다양한 측면에 대해 간소화하거나 추가적인 제어를 제공합니다. 플러گ인은 자산처럼 Creator Store에서 제공되며, 많은 경우 무료입니다.

용어집

유니티Roblox비고
장면장소
GameObjectPart 또는 Model철학적 차이를 참조하세요.
프리팹패키지
변환CFrameCFrame에는 스케일 정보가 포함되어 있지 않습니다. 변환을 참조하세요.
계층Explorer
인스펙터Properties
장면 뷰3D 뷰포트
게임 뷰3D 뷰포트뷰포트는 게임을 테스트할 때 게임 플레이 뷰로 전환됩니다.
프로젝트 창Asset Manager 또는 Toolbox
지형 인스펙터Terrain Editor
스폰 포인트SpawnLocation
콘솔Output
자산 스토어Creator Store
오버레이Toolbar
도구Plugin
©2026 Roblox Corporation. Roblox 및 Roblox 로고, 'Powering Imagination'은 미국 및 기타 국가 내 당사의 등록 및 미등록 상표입니다.