게임 내 Tools는 플레이어가 세션에서 장착할 수 있는 인터랙티브 도구로, 무기, 마법 지팡이, 손전등, 열쇠 등 다양한 종류가 있습니다. 도구를 디자인하고 플레이어의 인벤토리에 포함시키거나 세계 곳곳에 픽업으로 배치할 수 있습니다.
게임 내 도구 만들기
Tool 객체는 Roblox의 모든 도구의 기초가 되므로, 하나를 만들어야 합니다. 도구가 어떻게 보이는지 미리보기 하려면 Workspace에서 디자인하는 것이 더 쉽고, 나중에 이를 인벤토리 아이템이나 획득/구매 아이템으로 만들 수 있습니다.
새로 선택한 Tool을 가지고 Properties 창에 접근하여 도구가 플레이어의 인벤토리에서 어떻게 보일지를 사용자 정의합니다:

물리적 도구
물리적 도구를 위한 Tool 인스턴스를 생성한 후, 3D 세계에서의 외관을 구성하기 위해 부품/메시 추가해야 합니다. 또한 플레이어 캐릭터가 잡을 수 있는 핸들을 포함해야 합니다.
부품/메시 추가
게임 내 도구는 하나 이상의 Parts 및/또는 MeshParts로 구성될 수 있습니다. 도구를 여러 조각으로 구성하는 경우, WeldConstraints 또는 다른 기계적 제약을 사용하여 모든 조각을 연결하여 플레이어가 도구를 들고 다닐 때 도구가 하나의 유닛으로 유지되도록 해야 합니다.

핸들 설정
플레이어가 도구를 들고 다닐 수 있도록 하려면 도구의 한 부분의 이름을 Handle로 지정해야 합니다. 이 부분이 도구가 캐릭터 모델의 RightHand 신체 부위 (R15) 또는 Right Arm 부위 (R6)에 부착되는 부분입니다.
도구가 단일 MeshPart로 구성된 경우, 해당 부분의 이름을 Handle로 지정하면 됩니다. 그렇지 않은 경우, 부모 Tool의 직접 자식으로 Handle이라는 별도의 부품을 포함하고, 이를 다른 부품에 WeldConstraint 또는 기계적 제약으로 부착할 수 있습니다.
다음 예시는 Handle 메시, RopeConstraint, 그리고 로프에서 매달린 랜턴 메시로 구성된 도구를 보여줍니다.

그립 위치/방향 조정
도구의 Grip 속성은 CFrame으로, 도구가 캐릭터에 대해 어떻게 위치하고 방향을 잡는지를 지정합니다.

각 도구에 대해 이상적인 그립 위치/방향이 다르므로, 도구의 그립이 올바르게 보일 때까지 값들을 실험해야 합니다. 다음 예시는 매달린 랜턴의 잘못된 및 올바른 Grip 설정을 보여줍니다:


비물리적 도구
비물리적 Tool은 단순히 플레이어의 인벤토리를 차지하고 입력에 반응합니다. 예를 들어, 롤플레잉 게임에서는 플레이어가 인벤토리를 통해 "시전"할 수 있는 일련의 마법 주문이 있을 수 있습니다.

비물리적 도구는 3D 구성 요소가 필요하지 않으며 Handle 부품을 사용하지 않으므로, 도구의 RequiresHandle 속성을 비활성화해야 합니다:

게임에 도구 추가하기
게임 내 도구 만들기를 완료한 후, 이를 Explorer 계층의 올바른 영역에 배치해야 합니다. 계층에서 도구를 배치하는 위치는 의도된 사용에 따라 다릅니다.
플레이어 인벤토리
모든 플레이어가 인벤토리에 도구를 가지고 시작하도록 하려면, 이를 StarterPack 컨테이너 안에 넣습니다. 어떤 플레이어가 스폰될 때, 시스템은 도구를 그들의 Backpack에 복사합니다. 그 후, 플레이어는 인벤토리 아이콘을 클릭하거나 1 또는 2와 같은 관련 단축키를 눌러 도구를 장착할 수 있습니다.

도구는 StarterPack에 추가된 순서대로 플레이어의 인벤토리(Backpack)에 복사됩니다. 더 제어된 순서를 원한다면, StarterPack에 LocalScript를 추가하여 도구를 ReplicatedStorage로 임시 이동한 다음, order 테이블에 지정된 순서로 Backpack에 다시 부모를 설정할 수 있습니다.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local order = {"WaterSpell", "FireSpell", "AirSpell", "EarthSpell"}
local backpack = script.Parent
for _, item in backpack:GetChildren() do
if item:IsA("Tool") then
item.Parent = ReplicatedStorage
end
end
-- 지정된 순서로 도구를 백팩에 다시 부모 설정
for i = 1, #order do
local tool = ReplicatedStorage:FindFirstChild(order[i])
if tool then
tool.Parent = backpack
end
end수집 가능한 도구
플레이어가 3D 세계를 탐험하면서 물리적 도구를 수집할 수 있도록 하려면, 도구를 일반 3D 객체처럼 Workspace에 배치합니다. 수집된 도구는 자동으로 장착되고 플레이어의 인벤토리에 추가됩니다 (플레이어가 도구를 잡기 위해 추가적인 충돌 감지를 추가할 필요는 없습니다).
부품/메시 추가 섹션에서 언급했듯이, 도구 부품은 일반적으로 Anchored가 되어서는 안 됩니다. 플레이어 캐릭터가 고정된 도구를 집거나 장착할 때 제자리에 멈추게 되기 때문입니다. 그러나 3D 세계의 특정 장소에 수집 가능한 도구를 고정하고 싶다면, 수집 시 부품의 고정을 해제하는 다음 Script를 도구에 추가할 수 있습니다.
local tool = script.Parent
tool.Equipped:Connect(function()
for _, part in tool:GetDescendants() do
if part:IsA("BasePart") and part.Anchored then
part.Anchored = false
end
end
end)획득/구매 도구
플레이어가 작업을 완료했을 때 보상으로 도구를 설정하거나, 게임 내 상점에서 도구를 판매하고 싶다면, 해당 도구를 ReplicatedStorage 안에 넣습니다. 그 후, 적절한 시점에 플레이어의 Backpack에 도구를 Clone() 할 수 있습니다.

local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local player = Players.LocalPlayer
local backpack = player:WaitForChild("Backpack")
-- 도구의 복제본 생성
local tool = ReplicatedStorage:FindFirstChild("WaterSpell")
if tool then
local clone = tool:Clone()
clone.Parent = backpack -- 플레이어의 백팩에 복제본 추가
end도구 효과 구현하기
게임에 도구 추가하기 후, 플레이어가 도구를 사용하고 원하는 작업을 수행할 수 있도록 스크립트를 구현할 수 있습니다. 다음 도구 특정 이벤트는 도구의 상태와 플레이어의 입력을 나타냅니다.
- Equipped() — 플레이어가 백팩에서 도구를 선택할 때 발생합니다.
- Unequipped() — 플레이어가 도구를 전환하거나 도구를 떨어뜨릴 때 발생합니다.
- Activated() — 플레이어가 도구를 활성화하기 시작할 때 발생합니다 (클릭, 탭 또는 게임패드의 뒷쪽 오른쪽 트리거를 누름).
- Deactivated() — 플레이어가 활성화 입력을 중지할 때 발생합니다 (버튼이나 터치를 놓음).
local tool = script.Parent
local function onEquip()
print(tool.Name, "도구 장착됨")
end
local function onUnequip()
print(tool.Name, "도구 분리됨")
end
local function onActivate()
print(tool.Name, "도구 활성화됨")
end
local function onDeactivate()
print(tool.Name, "도구 비활성화됨")
end
tool.Equipped:Connect(onEquip)
tool.Unequipped:Connect(onUnequip)
tool.Activated:Connect(onActivate)
tool.Deactivated:Connect(onDeactivate)도구 이벤트는 클라이언트 측 LocalScripts에서만 발생합니다. 왜냐하면 플레이어의 장치만이 입력이 발생할 때를 알 수 있기 때문입니다. 결과적으로 대부분의 도구는 LocalScript와 서버 측 Script를 모두 필요로 하며, 각 스크립트는 도구의 동작의 특정 측면을 처리하고 RemoteEvent가 클라이언트에서 서버로 정보를 전달합니다 (자세한 내용은 원격 이벤트 및 콜백을 참조하세요).
다음은 LocalScript 또는 Script에 의해 관리되는 도구와 그 동작의 예시입니다:
| 도구 | LocalScript | Script |
|---|---|---|
| 창조자의 지팡이 | 플레이어가 도구를 활성화하는 위치를 감지합니다 (Activated()). | 플레이어가 터치하거나 클릭한 위치에 새로운 부품을 생성합니다. |
| 투명 망토 | 플레이어가 도구를 장착할 때 (Equipped()) 또는 도구를 분리할 때 (Unequipped())를 감지합니다. | 망토가 장착된 동안 플레이어를 다른 모든 플레이어에게 보이지 않게 하고, 망토가 분리되면 플레이어를 완전히 보이게 복원합니다. |
| 메가 활 | 플레이어가 도구를 활성화하는 시간을 감지합니다 (Activated()와 Deactivated() 사이의 시간). | 감지된 활성화 시간에 따라 더 강력하거나 약한 마법 화살을 발사합니다. |
