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

권장 사항
RunContext가 Client인 단일 Script를 ReplicatedStorage에 넣으십시오.
RunContext가 Server인 단일 Script를 ServerScriptService에 넣으십시오.
가능한 한 많은 클라이언트 및 서버 코드를 위해 ModuleScripts를 사용하십시오. 이러한 모듈을 클라이언트 스크립트와 서버 스크립트에서 요구하십시오.
이 접근 방식은 클라이언트와 서버 측에서 코드의 단일 진입점을 제공하여 조직을 단순화하고 문제 있는 모듈을 격리하거나 비활성화하기 쉽게 만듭니다. 각 ModuleScript에 start() 함수를 추가하여 모든 모듈이 코드 실행을 시작하기 전에 로드되도록 하십시오:
샘플 서버 스크립트--!strictlocal ServerScriptService = game:GetService("ServerScriptService")local SampleModule = require(ServerScriptService.SampleModule)local AnotherSampleModule = require(ServerScriptService.AnotherSampleModule)SampleModule.start()AnotherSampleModule.start()샘플 모듈--!strictlocal CollectionService = game:GetService("CollectionService")local NPC_TAG = "npc"local SampleModule = {}local function setUpNpc(npc: Instance)-- 각 NPC 초기화endlocal function cleanUpNpc(npc: Instance)-- 이벤트가 발생할 때 실행endfunction SampleModule.start() -- 테이블에 함수 추가-- 태그 기반 설정을 위한 예제 루프for _, npc in CollectionService:GetTagged(NPC_TAG) dosetUpNpc(npc)end-- 이벤트가 발생할 때 함수 실행CollectionService:GetInstanceAddedSignal(NPC_TAG):Connect(setUpNpc)CollectionService:GetInstanceRemovedSignal(NPC_TAG):Connect(cleanUpNpc)endreturn SampleModule코드를 공유하려면 ReplicatedStorage에서 ModuleScripts를 사용하고 클라이언트 스크립트와 서버 스크립트 모두에서 요구하십시오.
게임에 필요하다면 ReplicatedFirst에서 단일 클라이언트 스크립트와 최소한의 ModuleScripts를 반복하여 로딩 화면을 구현하십시오. ReplicatedFirst에 대해 더 알아보려면 복제 순서를 참조하십시오.
LocalScripts는 가급적 적게 사용하십시오. 사용해야 하는 경우 StarterCharacterScripts, StarterPlayerScripts, StarterGui 또는 StarterPack에 넣으십시오.
이러한 컨테이너의 스크립트는 한 위치에서 실행되는 것이 아니라 플레이어 컨테이너에 복제되므로 디버깅이 복잡해질 수 있습니다. 클라이언트 코드를 위해 ReplicatedStorage를 사용하면 Output 창에서 줄을 클릭하고 ReplicatedStorage.YourScript(스크립트의 안정적인 위치)로 이동할 수 있으며, Players.YourName.PlayerScripts.YourLocalScript(런타임에 스크립트가 복사된 일시적인 위치)로 이동하는 것보다 더 유리합니다.
Workspace의 인스턴스에 스크립트를 직접 연결하는 것을 피하십시오. 대신 인스턴스 태그를 사용하고 CollectionService를 사용하여 단일 ModuleScript에서 작업하십시오.
주요 예외는 Creator Store에서 모델이나 패키지를 배포하는 경우입니다. 이 경우 인스턴스 계층 내에 스크립트를 포함해야 할 수 있으며, 각 스크립트에 대해 실행 컨텍스트를 지정하여 실행 방식의 모호성을 제거하십시오. 이 속성을 명시적으로 설정하면 다양한 위치에서 모델과 패키지가 제대로 작동할 가능성이 높아집니다.
예제 프로젝트 구조
Plant 참조 프로젝트는 대규모 복잡한 게임에서 코드를 어떻게 구성할 수 있는지를 보여줍니다. 이 프로젝트는 대부분의 코드를 재사용 가능한 ModuleScripts로 저장합니다.
스크립트 위치
| 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도 포함할 수 있습니다. |
이 이미지는 Explorer 창 위치가 클라이언트 스크립트를 포함할 수 있는지를 보여줍니다. ReplicatedFirst와 ReplicatedStorage는 Scripts를 RunContext가 Client인 상태로 포함할 수 있는 반면, Starter[] 컨테이너는 LocalScripts를 사용해야 합니다.
