게임 내 도구

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

게임 내 Tools는 플레이어가 세션에서 장착할 수 있는 대화형 도구로, 무기, 마법 지팡이, 손전등, 열쇠 등 여러 유형이 있습니다. 도구를 설계하고 이를 플레이어의 인벤토리에 포함시키거나 세계 곳곳에 픽업으로 배치할 수 있습니다.

게임 내 도구 만들기

Tool 객체는 Roblox의 모든 도구의 기초가 되므로 하나를 생성해야 합니다. 도구가 어떻게 보이는지를 미리 보기 위해서는 Workspace에서 설계하는 것이 더 쉽고, 이후에 이를 인벤토리 항목이나 획득/구매한 항목으로 만들 수 있습니다.

  1. Explorer 계층에서 Workspace 위에 마우스를 올리고 버튼을 클릭한 다음 Tool을 삽입합니다.

    Workspace에 생성된 도구 객체
  2. 새로 생성된 Tool을 선택하고 Properties 창에 접근하여 플레이어의 인벤토리에 도구가 어떻게 보일지를 사용자 정의합니다:

    • TextureId — 플레이어의 인벤토리에서 도구를 위한 이미지 자산 ID를 지정합니다.
    • ToolTip — 플레이어의 인벤토리에서 도구를 마우스 오버했을 때 표시되는 툴팁 이름입니다.
  3. 도구가 물리적 도구 (가장 일반적)인지 아니면 단순히 플레이어의 인벤토리를 차지하고 그들의 입력에 반응하는 비물리적 도구인지 결정합니다.

물리적 도구

물리적 도구를 위한 Tool 인스턴스를 생성한 후, 3D 세계에서의 외관을 구성하기 위해 부품/메시 추가 해야 합니다. 또한 플레이어 캐릭터가 잡을 수 있는 핸들을 포함해야 합니다.

부품/메시 추가

게임 내 도구는 하나 이상의 Parts 및/또는 MeshParts로 구성될 수 있습니다. 도구가 여러 조각으로 구성된 경우, 모든 조각을 WeldConstraints 또는 기타 기계적 제약으로 연결하여 도구가 플레이어가 들고 다닐 때 단위로 intact하게 유지되도록 해야 합니다.

Studio의 툴바에 표시된 제약 선택기

핸들 설정

플레이어가 도구를 들고 다닐 수 있도록 하려면 도구의 한 부분을 Handle이라고 명명해야 합니다. 이곳에서 도구가 캐릭터 모델의 RightHand 부분(R15) 또는 Right Arm 부분(R6)에 부착됩니다.

도구가 단 하나의 MeshPart로 구성되어 있다면, 해당 부분의 이름을 Handle로 지정하면 됩니다. 그렇지 않다면, 부모 Tool직접 자식으로 Handle이라는 별도의 부분을 포함시키고, 이를 다른 부분에 WeldConstraint 또는 기계적 제약으로 부착할 수 있습니다.

다음 예시는 세 개의 인스턴스로 구성된 도구를 보여줍니다: Handle 메시, RopeConstraint, 그리고 로프에서 매달린 랜턴 메시입니다.

그립 위치/방향 조정

도구의 Grip 속성은 도구가 캐릭터에 대해 어떻게 위치하고 방향을 잡는지를 지정하는 CFrame입니다.

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

그라운드에서 끌리는 랜턴, Grip.Position의 값이 (0, -2, 0)이고 Grip.Orientation의 값이 (-90, 0, 0)
캐릭터 앞에 위치한 랜턴, Grip.Position의 값이 (0, -1.5, 0)이고 Grip.Orientation의 값이 (25, 0, 0)

비물리적 도구

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

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

게임에 도구 추가

게임 내 도구 만들기를 완료한 후에는 해당 도구를 Explorer 계층의 올바른 위치에 배치해야 합니다. 도구를 계층 구조의 어느 위치에 배치하느냐는 의도된 사용법에 따라 다릅니다.

플레이어 인벤토리

모든 플레이어가 인벤토리에 도구를 가지고 시작하기를 원한다면, 이를 StarterPack 컨테이너 안에 넣어야 합니다. 어떤 플레이어가 스폰될 때, 시스템은 도구를 그들의 Backpack에 복사합니다. 그 후 플레이어는 인벤토리 아이콘을 클릭하거나 1 또는 2와 같은 관련 단축키를 눌러 도구를 장착할 수 있습니다.

도구는 StarterPack에 추가된 순서에 따라 플레이어의 인벤토리(Backpack)에 복사된다는 점에 유의하세요. 보다 더 정밀한 순서를 원하시면 StarterPackLocalScript를 추가하여 도구를 일시적으로 ReplicatedStorage로 이동한 다음, order 테이블에 지정된 순서로 도구를 다시 부모 위치로 이동시킬 수 있습니다.

인벤토리 재정렬

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 상태가 아니라는 점에 유의해야 합니다. 그러나 특정 장소에 수집 가능한 도구를 고정하려는 경우, 예를 들어 땅 위에 살짝 떠 있게 하려면 수집 시 부품의 고정을 해제하는 다음 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에서 관리되는 예제 도구와 그 동작입니다:

도구LocalScriptScript
크리에이터의 지팡이플레이어가 도구를 활성화하는 위치를 감지합니다 (Activated()).플레이어가 터치하거나 클릭한 3D 세계의 위치에 새 부품을 생성합니다.
투명 망토플레이어가 도구를 장착할 때 (Equipped()) 또는 장착 해제할 때 (Unequipped()) 감지합니다.망토가 장착되는 동안 플레이어를 모든 다른 플레이어에게 투명하게 하며, 망토가 해제될 때 플레이어의 가시성을 복원합니다.
메가 활플레이어가 도구를 활성화하는 시간을 감지합니다 (Activated()Deactivated() 사이의 시간).감지된 활성화 시간에 따라 더 강력하거나 약한 마법 화살을 발사합니다.
©2026 Roblox Corporation. Roblox 및 Roblox 로고, 'Powering Imagination'은 미국 및 기타 국가 내 당사의 등록 및 미등록 상표입니다.