모듈 스크립트(ModuleScript)는 공통된 기능을 분리하여 재사용 가능하도록 구조화하기 위해 사용되는 스크립트입니다. 이를 통해 코드의 중복을 줄이고, 유지보수를 효율적으로 수행할 수 있습니다.
권장 실행 위치
서버와 클라이언트에서 모두 사용해야 하는 모듈 스크립트는 ReplicatedStorage에 배치하는 것이 일반적입니다. (예 : Script와 LocalScript에서 VectorUtil 모듈 참조)
서버에서만 사용하는 모듈 스크립트는 보안과 관리 측면에서 ServerScriptService 에 배치하는 것이 권장됩니다. (예 : Script에서 ServerGameConstValue 모듈 참조)
클라이언트에서만 사용하는 모듈 스크립트는 용도에 따라 StarterPlayerScripts나 StarterCharacterScripts에 배치하는 것이 권장됩니다. (예 : LocalScript에서 Gui 모듈 참조)
동작 원리
모듈은 명시적으로 호출(require)될 때 실행되며, 첫 호출 시 초기화된 결과가 캐싱되므로 이후 호출 시에는 동일한 값을 반환합니다. 이를 통해 실행 효율을 높이고, 일관성을 유지할 수 있습니다.
1
모듈 스크립트 구현
local UtilityModule = {}functionUtilityModule.PrintMessage(message)print("PrintMessage : " .. message)endreturn UtilityModule
2
모듈 스크립트 참조 & 사용
local ReplicatedStorage = game:GetService("ReplicatedStorage")local UtilityModule =require(ReplicatedStorage.UtilityModule)UtilityModule:PrintMessage("Hello World!")
모듈 스크립트 응용
유틸리티 클래스
ModuleScript에서
local MathUtil = {}-- Example Function 1function MathUtil:Sum(...)local numList = { ... }local result =0for i =1, #numList do result = result + numList[i]endreturn result end-- Example Function 2function MathUtil:SomeFunc()print("SomeFunc")endreturn MathUtil
Script 또는 LocalScript에서
local ReplicatedStorage = game:GetService("ReplicatedStorage")local MathUtil =require(ReplicatedStorage.MathUtil)local sum = MathUtil:Sum(1, 5, 9, 10)print(sum)
데이터 클래스
ModuleScript에서
local GameConstValue = {}GameConstValue.RequirePlayerCount =10GameConstValue.MaxRound =5GameConstValue.RoundLimitTime =180return GameConstValue
Script 또는 LocalScript에서
local ReplicatedStorage = game:GetService("ReplicatedStorage")local GameConstValue =require(ReplicatedStorage.GameConstValue)localfunctionCheckPlayerCount(playerCount)if playerCount >= GameConstValue.RequirePlayerCount thenprint("Ready to start the game")endend
클래스 상속
ModuleScript에서
local MonsterClass = {}MonsterClass.__index = MonsterClassfunction MonsterClass:new(name,hp,dam,def)local self =setmetatable({}, MonsterClass) self._Name = name self._Hp = hp self._MaxHp = hp self._Dam = dam self._Def = defreturn selfendfunction MonsterClass:Attack()print(self._Name, "Attack!")endfunction MonsterClass:Move()print(self._Name, "Move!")endfunction MonsterClass:Destroy()print(self._Name, "Destroy!")endreturn MonsterClass