로블록스 정식 기초 튜토리얼의 마지막 과정에서 다수의 FadingPlatform 블럭을 사용하였다. 여러 블럭으로 만들기 위해 복제(Ctrl+D)를 하였는데 문제는 이 과정에서 FadingPlatform의 스크립트도 같이 복사되었다는 점이다. 여러 FadingPlatform 갯수만큼의 여러개의 똑같은 스크립트가 존재하게 되었다. 다수의 똑같은 스크립트의 존재는 리소스의 낭비라는 측면도 있고, 버그때문에 혹은 기능추가 삭제를 위해서 소스를 수정하기 했을때... 모든 스크립트를 똑같이 다 수정해 줘야한다.
이 튜토리얼에서는 여러개의 HP물약을 하나의 스크립트로 제어하는 과정을 보여준다. HP물약은 플레이어의 HP를 즉시 가득 채워준다. HP물약의 효과가 발동하면 바로 반투명하게 바뀌고 몇 초후에 다시 불투명해지면서 다시 획득할 수 있는 상태로 바꿔준다.
맵 다운로드
로블록스에서 제공하는 Showdown Town example world를 열러서 보자. 링크를 타고 가서 Edit 혹은 편집을 클릭하면 바로 로블록스 스튜디오에서 편집할 수 있게 된다.
편집창에서 맵을 살펴보면 여러군데에 많은 HP물약이 놓여 있는 것을 볼 수 있다. 도시의 길에 놓여져 있는 HP물약...
워크스페이스 안쪽의 HealthPickups 라는 폴더를 열어보면 HealthPickup 이라는 이름으로 여러 HP물약이 들어있다. 만약에 더 많은 HP물약을 추가 하고 싶으면 하나를 선택하고 Ctrl+D로 복제하면 된다. 복제 후에 탐색기 내에서 꼭 HealthPickups 폴더안에 있어야 한다. 스크립트가 포함이 되어 있지 않으므로 우리가 HP물약을 제어하는 스크립트를 구현해야 한다.
플레이어 HP 채우기
HP물약을 터치하면 플레이어의 HP가 채워지는 기능이 필요하다. 앞선 기초 튜토리얼중에서 용암만들기 과정에서 휴머노이드의 Health 속성을 0으로 변경해서 플레이어를 죽이는 기능을 만들었었다. 이번에는 Health를 100으로 만들어서 HP를 가득 채워주게 된다.
플레이어의 Health 상태 변경에 관련된 내용이므로 이 스크립트는 서버에서 실행되는 것이 좋겠다. ServerScriptService 안에 스크립트를 넣어두면 게임 시작시에 서버측에서 스크립트가 실행된다. ServerScriptService안에 PickupManager 라는 이름의 스크립트를 추가해주자. 그 안에 MAX_HEALTH 를 100으로 선언해두고, 플레이어가 HP물약을 터치했을때 실행될 함수를 선언해주자.
local MAX_HEALTH = 100
local function onTouchHealthPickup(otherPart, healthPickup)
end
otherPart에서 부터 캐릭터 모델으로 접근하기 위해서 otherPart.Parent 후에, 휴머노이드 객체를 찾기 위해서 FindFirstChildWhichIsA() 함수를 사용한다. 이전 튜토리얼에서는 FindFirstChild()함수와 WaitForChild()함수들을 사용하였는데 여기서는 FindFirstChildWhichIsA() 함수이다. FindFirstChild()함수와 WaitForChild()함수는 이름으로 객체를 찾기때문에, 만에 하나 캐릭터 모델안에 Humanoid라는 이름의 다른 것이 들어있으면 오류를 일으킬 것이다. FindFirstChildWhichIsA() 는 Humanoid 타입의 객체를 찾아주기 때문에 만에 하나, 캐릭터 모델안에 같은 이름의 어떤 객체가 들어 있었더라도 Humanoid 타입의 객체를 찾아서 반환해준다. 좀 던 안전한 구현을 만들 수 있게된다.
local MAX_HEALTH = 100
local function onTouchHealthPickup(otherPart, healthPickup)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = MAX_HEALTH
end
end
HealthPickups 폴더에 접근하기
ServerScriptService의 서버 스크립트는 게임이 시작할 때 실행된다. 서버 스크립트가 실행되고 HealthPickups폴더에 접근을 해야하는데, HealthPickups 폴더도 게임오브젝트의 한 부분이므로 아직 로드되지 않았을 가능성이 있다. 따라서 HealthPickups 폴더가 로드될때까지 기다릴 필요가 있다. WaitForChild()함수를 통해 로드가 끝나서 찾을 때까지 기다리는 방법을 사용한다.
local MAX_HEALTH = 100
-- HealthPickups 폴더 로드가 완료될 때까지 기다림
local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
-- GetChildren() 함수는 폴더 안의 자식 오브젝트 리스트를 반환한다.
local healthPickups = healthPickupsFolder:GetChildren()
local function onTouchHealthPickup(otherPart, healthPickup)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = MAX_HEALTH
end
end
다음글
'로블록스 개발 중급' 카테고리의 다른 글
버튼 만들기 (0) | 2021.04.28 |
---|---|
스코어 바 만들기(2) (0) | 2021.04.27 |
스코어 바 만들기(1) (0) | 2021.04.27 |
세이브와 로드 (0) | 2021.04.26 |
여러 오브젝트 사용되는 스크립트의 관리(2) (0) | 2021.04.23 |