많은 개발자에게 Roblox 스크립팅에 적응하는 기본적인 도전은 파일 위치와 Script.RunContext 속성의 중요성입니다. 스크립트 유형, Explorer 내 위치 및 실행 맥락에 따라 스크립트의 동작이 매우 다를 수 있습니다. 특정 메서드 호출이 실패할 수 있고, 게임의 객체에 접근할 수 없거나, 스크립트가 아예 실행되지 않을 수 있습니다.
이러한 복잡성의 이유는 Roblox 게임이 기본적으로 멀티플레이어이기 때문입니다. 스크립트는 서버에서만 실행되거나 클라이언트에서만 실행되거나 둘 다 공유될 수 있는 능력이 필요합니다. 시간이 지나면서 Roblox 플랫폼의 발전은 상황을 더욱 복잡하게 만들었습니다.
스크립트 유형
Roblox에는 세 가지 유형의 스크립트가 있습니다:
- Script - 위치 및 Script.RunContext 속성에 따라 서버 또는 클라이언트에서 실행되는 코드입니다.
- LocalScript - 클라이언트에서만 실행되는 코드입니다. 실행 맥락이 없습니다.
- ModuleScript - 다른 스크립트에서 재사용할 수 있는 코드입니다. 실행 맥락이 없습니다.
Script를 생성하면 기본 실행 맥락이 Legacy로 설정되며, 이는 a) 서버 측 스크립트이며 b) Workspace 또는 ServerScriptService와 같은 서버 컨테이너에 있을 경우에만 실행된다는 것을 의미합니다.
- 스크립트의 실행 맥락을 Server로 변경하면 이제 ReplicatedStorage에서도 실행할 수 있지만, 이는 권장되지 않습니다. 해당 위치의 내용은 클라이언트에 복제되므로 서버 측 스크립트에는 부적절한 위치입니다.
- 스크립트의 실행 맥락을 Client로 변경하면 ReplicatedStorage에서 실행할 수 있습니다. 또한 StarterCharacterScripts 및 StarterPlayerScripts에서도 실행할 수 있습니다. 그러나 스타터 컨테이너는 클라이언트로 복사되므로 원본 스크립트 와 복사본이 모두 실행되어 원치 않는 상황이 발생합니다.
스크립트의 실행 맥락을 변경하려면 Explorer에서 스크립트를 선택하고 Properties 창에서 값을 변경하세요.

권장 사항
클라이언트 스크립트를 ReplicatedStorage에 RunContext가 Client인 상태로, 클라이언트 전용 ModuleScripts와 함께 넣으세요.
Studio에서 디버깅할 때 Output 창에서 줄을 클릭하고 런타임에 스크립트가 복사된 임시 위치인 Players.YourName.PlayerScripts.YourScript 대신 스크립트의 안정적인 위치인 ReplicatedStorage.YourScript로 이동할 수 있습니다.
서버 스크립트를 ServerScriptService에 RunContext가 Server인 상태로, 서버 전용 ModuleScripts와 함께 넣으세요.
서버와 클라이언트 스크립트 간에 코드를 공유하려면 ReplicatedStorage에 ModuleScripts를 사용하세요.
ReplicatedFirst에 클라이언트 스크립트(로딩 스크립트와 같은)를 최소한으로 배치하고 RunContext를 Client로 설정하세요. 더 자세한 내용은 복제 순서를 참조하세요.
StarterCharacterScripts, StarterPlayerScripts, StarterGui, StarterPack에서 LocalScripts를 사용하세요.
스크립트 위치
| Location | Description |
|---|---|
| Workspace | 게임의 3D 세계를 나타냅니다. 이 위치는 객체에 직접 연결되어 그 동작을 제어하는 서버 스크립트에 적합합니다. |
| ReplicatedFirst | 클라이언트에 가장 먼저 복제되는 객체를 포함합니다. 이 위치는 로딩 화면을 표시하는 데 필요한 최소한의 객체와 클라이언트 스크립트에 이상적입니다. |
| ReplicatedStorage | 클라이언트와 서버 모두에 복제되는 객체를 포함합니다. 이 위치는 서버와 클라이언트 모두에서 사용하고자 하는 ModuleScripts에 적합합니다. LocalScripts는 이 위치에서 실행되지 않지만, RunContext가 Client인 Scripts는 실행됩니다. |
| ServerScriptService | 서버 스크립트를 포함합니다. 이 위치는 게임 로직 및 클라우드 스토리지와 같은 서버 측 기능이나 객체에 접근해야 하는 스크립트에 적합합니다. |
| ServerStorage | 서버 측 객체를 포함합니다. 이 위치는 게임에 참여할 때 클라이언트에 즉시 복제될 필요가 없는 큰 객체에 적합합니다. 이 위치에서 스크립트는 실행되지 않지만, 서버 측 ModuleScripts를 여기에 저장할 수 있습니다. |
| StarterPlayer ⟩ StarterCharacterScripts | 캐릭터가 생성될 때 실행되는 LocalScripts를 포함합니다. |
| StarterPlayer ⟩ StarterPlayerScripts | 플레이어가 게임에 참여할 때 실행되는 일반적인 LocalScripts를 포함합니다. |
| StarterGui | 클라이언트가 게임을 로드할 때 표시하는 GUI 요소를 포함합니다. LocalScripts는 이 위치에서 실행될 수 있습니다. 이 위치는 버튼, 메뉴 및 팝업을 추가하는 등 게임의 사용자 인터페이스를 수정하는 스크립트에 적합합니다. |
| StarterPack | 일반적으로 Tools만 포함되지만, 플레이어 배낭을 설정하기 위한 LocalScripts도 포함할 수 있습니다. |
이 이미지는 Explorer 창 위치에서 클라이언트 스크립트를 포함할 수 있는 locations를 보여줍니다. 기억하세요, ReplicatedFirst 및 ReplicatedStorage는 Scripts를 RunContext가 Client인 상태로 포함될 수 있지만, Starter[] 컨테이너는 LocalScripts를 사용해야 합니다.

예제 프로젝트 구조
Plant 참조 프로젝트는 대규모 복잡한 게임에서 코드를 어떻게 구성할 수 있는지를 보여줍니다.
특히 눈에 띄는 점은 재사용 가능한 ModuleScripts로 대다수의 코드를 ReplicatedStorage와 ServerStorage에 저장한다는 것입니다.