이 페이지는 경험이 풍부한 유니티 개발자가 Roblox를 시작하는 데 도움이 되는 정보를 포함하고 있으며, 기본적인 방향 설정, 개념적 비교 및 두 플랫폼 간의 주요 차이점을 다룹니다.
방향 설정


유니티의 계층 창과 Roblox Studio의 탐색기는 3D 장면에서 요소를 구성하는 주요 창입니다:
- 두 창 모두 객체(예: 캐릭터 및 환경 자산)를 관리하고 구성할 수 있습니다.
- 두 창 모두 객체 간의 부모-자식 관계를 위한 트리 구조를 사용합니다.
그러나 계층 창은 미리 정의된 구조가 없는 반면, 탐색기 창은 엄격한 구조를 가지고 있습니다. 탐색기 창을 유니티의 계층 및 프로젝트 창의 조합으로 생각하는 것이 도움이 될 수 있으며, Workspace 폴더가 가장 인식하기 쉬운 요소입니다.
유사하게, Roblox Studio의 자산 관리자와 툴박스는 유니티 프로젝트 창과 겹칩니다. 자산 관리자는 게임 내 모든 자산을 관리할 수 있게 해주며, 툴박스는 사용자가 게시한 모든 자산에 접근할 수 있게 해줍니다. 툴박스는 또한 Roblox 또는 커뮤니티의 자산을 검색할 수 있는 크리에이터 스토어와 유사한 기능을 제공합니다.
철학적 차이
Roblox는 전통적인 게임 엔진이 아닌 "시뮬레이션 엔진"입니다. 유니티의 GameObjects와 Roblox의 Parts는 3D 환경에서 객체를 생성하기 위한 기본 빌딩 블록 역할을 하지만, 실제로는 두 가지가 상당히 다릅니다:
- 표현: 유니티의 GameObjects는 장면의 모든 객체에 대한 고수준 개념인 반면, Roblox의 Parts는 나무 블록 및 플라스틱 구체와 같은 물리적 객체를 나타내도록 설계되었습니다. 유니티의 원시 객체와 같은 추상 기하학을 나타내지 않습니다.
- 물리: 유니티에서 물리 시뮬레이션을 수행하려면 GameObject에 Rigidbody 및 Collider와 같은 구성 요소를 부착해야 합니다. Roblox에서는 물리가 Parts 데이터 유형에 내장되어 있으며, 엔진이 상호작용을 자동으로 처리합니다.
GameObject와 Part를 생성하면 즉시 차이를 확인할 수 있습니다. GameObject는 위치, 회전 및 크기 외에는 아무것도 없습니다. Part는 동일한 정보 외에도 재질 및 색상, 반사 및 투명도 값, 질량 및 형태 등 많은 추가 정보를 가지고 있습니다. Part를 빈 GameObject와 유사하게 만들려면 많은 내장 속성을 제거해야 합니다. 반대로, GameObject에 MeshFilter, MeshRenderer, Collider, Rigidbody 구성 요소를 추가하면 Part와 매우 유사하게 만들 수 있습니다.
스크립팅 관점에서 GameObject는 Roblox의 Instance와 가장 유사하며, 이는 모든 다른 Roblox 클래스의 기본 클래스입니다. 그러나 Instance 유형의 객체를 생성할 수 없기 때문에 비교는 그다지 실용적이지 않습니다.
또 다른 비교는 유니티의 GameObject와 Roblox의 Model입니다. 모델은 유니티에서 여러 GameObjects 간의 부모-자식 관계를 설정하는 것과 같은 방식으로 상호 연결된 부품의 컬렉션을 위한 컨테이너 역할을 합니다. 모델의 일부를 주요 부품으로 지정하여 피벗 포인트를 정의합니다. 모델은 또한 스크립트, 애니메이션, 사운드 효과, 프롬프트, 제약 조건, 입자 방출기 등을 포함합니다.
예를 들어, 유니티의 GameObject는 ParticleSystem, Physics3D, SpringConstraint 및 스크립트에 대한 구성 요소를 가질 수 있습니다. 계층 창에서 SpringyFireball이라는 단일 GameObject를 볼 수 있습니다. 검사기 창은 구성 요소 및 속성의 컬렉션을 보여줍니다.
Roblox에서는 탐색기 창에서 유사한 SpringyFireball 모델이 다음과 같이 보일 수 있습니다:
모델
|- ParticleEmitter
|- MeshPart
|- SpringConstraint
|- ClickDetector
| |- 스크립트Roblox의 기본 물리 철학은 3D 모델을 구축하는 과정에도 확장됩니다. Roblox에서는 여러 부품을 조립체로 용접하여 빠르게 구축하는 것이 훌륭한 방법입니다. Roblox는 용접된 부품을 단일 강체로 취급합니다. 이 접근 방식은 유니티에서는 사용할 수 없습니다.
길이와 질량에 대한 표준 미터법 단위를 사용하는 대신, Roblox는 스터드 및 Roblox 질량 단위(RMU)라는 개념적 단위를 사용합니다. 대략적인 미터 변환 및 사용에 대한 권장 사항은 단위를 참조하십시오.
위치가 중요하다
Roblox 게임은 기본적으로 멀티플레이어이므로 Roblox Studio에는 특정 동작을 가진 다양한 저장 위치가 포함되어 있습니다. 자세한 내용은 클라이언트-서버 런타임 및 객체 조직을 참조하십시오.
| Location | Description |
|---|---|
| Workspace | 게임의 3D 세계를 나타냅니다. 객체에 직접 연결되어 그들의 행동을 제어하는 서버 스크립트를 실행할 수 있습니다. |
| ReplicatedFirst | 다른 모든 것보다 먼저 클라이언트에 복제되는 객체를 포함합니다. 이 위치는 로딩 화면을 표시하는 데 필요한 최소한의 객체와 클라이언트 스크립트에 이상적입니다. |
| ReplicatedStorage | 클라이언트와 서버 모두에 복제되는 객체를 포함합니다. 이 위치는 Scripts의 RunContext가 Client인 경우, 클라이언트 ModuleScripts, 그리고 서버와 클라이언트 모두에서 사용하고 싶은 ModuleScripts에 이상적입니다. LocalScripts는 이 위치에서 실행되지 않습니다. |
| ServerScriptService | 서버 스크립트를 포함합니다. 이 위치는 게임 로직 및 클라우드 저장소와 같은 서버 측 기능이나 객체에 접근해야 하는 스크립트에 이상적입니다. |
| ServerStorage | 서버 측 객체를 포함합니다. 이 위치는 게임에 참여할 때 클라이언트에 즉시 복제될 필요가 없는 큰 객체에 이상적입니다. 이 위치에서 스크립트는 실행되지 않지만, 서버 측 ModuleScripts를 여기에 저장할 수 있습니다. |
| StarterPlayer ⟩ StarterCharacterScripts | 캐릭터가 생성될 때 실행되는 LocalScripts를 포함합니다. |
| StarterPlayer ⟩ StarterPlayerScripts | 플레이어가 게임에 참여할 때 실행되는 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가 많은 내장 가정을 가지고 있기 때문에 상대적으로 간결할 수 있습니다: 서버에 연결된 Player와 Humanoid 캐릭터가 있으며 Tools를 장착할 수 있습니다. 이러한 가정은 유니티에는 존재하지 않으므로 구현은 매우 다를 것입니다.
자산
유니티와 Roblox 모두 .fbx 형식의 사용자 정의 메시 및 모델을 가져오는 것을 지원합니다. 특정 유형의 자산은 타사 모델링 소프트웨어에서 특정 구성 및 내보내기 설정이 필요할 수 있습니다. 자세한 내용은 다음 페이지를 참조하십시오:
유니티에서는 객체가 프로젝트 창에 표시되는 Assets 디렉토리로 가져옵니다. Roblox에서는 자산이 Workspace 및 툴박스 또는 자산 관리자로 가져옵니다.
Roblox는 가져오기 프로세스를 간소화하기 위해 오픈 소스 Blender 플러그인도 제공합니다.
변환
Unity의 변환과 Roblox의 CFrames는 물체의 3D 변환을 나타내는 데 유사한 목적을 가지고 있습니다:
- 변환과 CFrames는 모두 3D 공간에서 물체의 위치와 회전을 나타냅니다. 변환은 스케일을 포함하지만, Roblox에서는 BasePart.Size 속성을 사용하며 이는 CFrame의 일부가 아닙니다.
- 둘 다 복잡한 변환을 위한 곱셈을 지원하며, 다른 조작을 위한 내장 메서드를 가지고 있습니다.
협업
유니티에서는 표준 버전 관리 시스템이나 Unity 버전 관리와 같은 유료 서비스를 통해 협업합니다.
Roblox 파일은 클라우드에 저장되며(복사본을 내보낼 수 있지만), Roblox Studio는 동시 편집, 그룹 관리, 권한, 스크립트 초안 작성 등을 위한 내장 협업 워크플로를 제공합니다. 자세한 내용은 협업을 참조하십시오.
플러그인
유니티 도구와 유사하게, Roblox Studio는 다양한 개발 프로세스의 여러 측면을 단순화하거나 추가 제어를 제공할 수 있는 플러그인을 지원합니다. 플러그인은 자산과 마찬가지로 크리에이터 스토어에서 제공되며, 많은 경우 무료입니다.