이제 3D 세계가 준비되었으니 첫 번째 스크립트를 추가할 시간입니다. 이 섹션에서는 플레이어가 동전을 수집할 수 있도록 하고, 수집된 후에는 동전이 일시적으로 비활성화되는 동전 수집 메커니즘을 만들 것입니다.
동전 만들기
무언가를 스크립트하기 전에, 동전으로 사용할 자리 표시자 객체가 세계에 있어야 합니다. 이전 섹션에서 만든 해양 스택 플랫폼처럼, 동전은 간단한 Part 객체일 수 있습니다.
Workspace > World에서 Coins라는 새 폴더를 만듭니다.
Coins 폴더 안에 Coin이라는 이름의 원통형 Part를 만들고 BrickColor를 Gold로 설정하고, Material을 Metal로 설정하고, Size를 0.6, 8, 4로 설정하고, Orientation을 90, 0, 0으로 설정합니다.
CanCollide를 비활성화하고 Anchored를 활성화합니다.
그런 다음 Coin 파트를 여러 번 복제하고 복제본을 섬과 플랫폼 주위에 흩뿌려서 해양 스택 레벨에서 접근할 수 있도록 합니다.
각 복제본의 이름은 Coin으로 유지합니다.스크립트 만들기
다음으로, 동전이 플레이어에 반응하도록 만들 것입니다. Roblox 엔진은 무언가가 동전을 터치할 때 이를 감지할 수 있지만, 동전이 어떻게 반응해야 하는지를 정의하기 위해 스크립트를 사용해야 합니다.
ServerScriptService에서 CoinService라는 이름의 스크립트를 만들고 다음 코드를 입력합니다:
```lua
-- 서비스 및 변수 초기화
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
-- 이벤트 핸들러 정의
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- 플레이어가 동전을 터치했습니다
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("플레이어가 동전을 수집했습니다")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end
-- 이벤트 리스너 설정
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end
```이제 플레이어가 동전을 터치할 때마다 동전이 10초 동안 사라지고, 출력 로그에 플레이어가 동전을 수집했습니다가 출력됩니다.
다음 섹션에서는 스크립트가 어떻게 작동하는지에 대해 더 자세히 설명합니다.
서비스 및 변수 초기화
아마도 다른 언어로 작성한 많은 코드와 마찬가지로, 나중에 필요할 변수를 스크립트의 맨 위에서 정의합니다. 우리의 코드는 다음과 같은 작업을 수행합니다:
- 모든 동전 참조 얻기 - 스크립트는 다음으로 GetChildren() 메서드를 사용하여 동전 객체에 대한 모든 참조를 3D 작업 공간에서 쿼리합니다. 이 메서드는 연결된 객체에 부모가 있는 모든 것을 포함하는 배열을 반환합니다. 이 경우는 이전에 만든 Workspace.World.Coins 폴더입니다.
- 전역 변수 정의 - COOLDOWN 변수는 동전이 수집된 후 얼마나 오랫동안 비활성화할지를 정의하는 데 사용됩니다.
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
...이벤트 핸들러 정의
Roblox 엔진은 3D 세계를 물리적으로 시뮬레이션하고 렌더링, 물리학 및 네트워킹과 관련된 이벤트를 처리하는 많은 로직을 처리합니다. 이러한 이벤트 중 일부에서 자신의 로직을 스크립팅하려는 경우, 이벤트를 수신하고 처리할 수 있으며, 엔진이 나머지를 처리하도록 할 수 있습니다. 이 경우, 동전이 터치되는 이벤트를 수신하고 처리합니다. 스크립트는 onCoinTouched() 메서드에서 이 이벤트를 처리하는 로직을 정의하며, 다음과 같은 작업을 수행합니다:
- 동전이 활성화되어 있는지 감지 - 모든 Instance는 3D 세계에 객체가 존재하는지 여부를 정의하는 Enabled 불리언 속성을 가지고 있습니다. GetAttribute() 메서드를 사용하여 인스턴스 속성을 가져올 수 있습니다.
- 플레이어가 동전을 터치했는지 감지 - 동전이 활성화되어 있으면, 메서드는 플레이어 서비스 를 사용하여 동전을 터치한 객체가 실제로 플레이어인지 확인합니다. 터치 이벤트가 발생하면, Roblox 엔진은 동전을 터치한 객체를 otherPart 매개변수로 전달합니다. 스크립트는 otherPart의 부모가 플레이어에 속하는지 확인합니다.
- 플레이어가 터치하면 동전을 비활성화하고 10초 후에 다시 활성화 - 마지막으로, 플레이어가 동전을 터치하면 메서드는 동전을 비활성화하고 10초 동안 기다린 후 동전을 다시 수집할 수 있도록 활성화합니다. task.wait()는 wait() 대신 사용되며, 코드 실행을 완전히 중단하지 않고 다른 스레드에서 작업이 동시에 실행될 수 있도록 하여 더 나은 성능을 제공합니다.
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- 플레이어가 동전을 터치했습니다
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("플레이어가 동전을 수집했습니다")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end이벤트 핸들러 연결
모든 시뮬레이션된 3D 객체는 BasePart에서 상속되므로 Touched() 이벤트를 가집니다. 다음 루프는 onTouchedEvent() 핸들러를 모든 동전의 터치 이벤트에 연결합니다:
- 모든 동전 반복 - 일반 반복을 사용하여 각 동전을 반복합니다.
- 이벤트에 핸들러 연결 - 루프의 각 반복에서 동전은 기본적으로 활성화되어 있으므로 게임 시작 시 3D 세계에서 보입니다. onCoinTouched() 핸들러 메서드는 동전의 Touched 이벤트에 연결되어 이벤트가 발생할 때마다 실행됩니다. 엔진이 터치를 감지하면, 객체를 터치한 객체인 otherPart도 전달됩니다.
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end메커니즘 테스트하기
드롭다운에서 Test를 선택하고 Play를 클릭합니다. 캐릭터를 이동시켜 동전을 터치합니다. 모든 것이 제대로 작동하면 동전이 사라지고, Output 창에 플레이어가 동전을 수집했습니다가 출력되며, 10초 후에 동전이 다시 나타납니다.
