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