게임

로블록스(Roblox) 루아 스크립트로 서서히 사라지는 블록 만들기

패스자 2025. 5. 6. 22:36

이번 코스에서는 루아 스크립트를 사용하여 시간이 흐를수록 서서히 사라지는 블럭을 만들어 보겠다.

 

준비하기

양쪽에 두개의 파트를 만들고 적당히 거리를 떨어뜨린 후 그 중 하나의 파트에 스폰 로케이션을 위치시켜 캐릭터를 스폰시키자.

파트 한 가운데에 아래 그림과 같이 하나의 파트를 또 생성하고 FadingPlatform 이라고 이름을 정하자.

이 FadingPlatform 이 게임 캐릭터가 닿는 순간부터 서서히 사라지는 블럭이다. Anchored 속성을 활성화 하는 것을 잊지말자.

 

FadingPlatform 에 스크립트를 하나 삽입하고 이름을 FadeOnTouch 라고 입력하자.

 

캐릭터가 닿으면 사라지는 기능을 하므로 Touched 이벤트를 사용하고 호출될 함수를 만들자.

local platform = script.Parent

local function fade()
end

platform.Touched:Connect(fade)

 

서서히 사라지는 블럭

서서히 사라지는 효과를 위해 for 문을 사용하겠다. lua Script 에서 for 문의 문법은 다음과 같다.

  • Control variable (시작값 설정)
    • 반복문에 사용될 변수(count)를 초기화한다. 여기서는 count를 1로 설정
  • End value (마지막값 설정)
    • count가 10이 될 때까지 반복한다.
  • Step increment (반복에 사용되는 단위, 설정안해도 됨)
    • 시작값 1에서 부터 마지막값 10까지의 얼마만큼의 단위로 더할지에 대한 값이다.
    • 기본값이 1만큼 커지는 것으로써 여기서는 1이므로 없어도 상관없다.

1에서 10까지이므로 10번 반복하게 되고 platform의 Transparency를 0.1씩 증가시키면서 결국은 1로 만든다.

반복 과정중에 Wait()함수로 0.1초씩 기다림을 준다. 이 Wait()함수는 왜 필요할까? Wait() 함수 없이 테스트 해보면 확인할 수 있다. 

기다림없이 반복문이 빠르게 실행되어 Transparency가 너무 빨리 1이 되어서, 서서히 사라지는 모습이 아니라 즉시 사라지는 모습을 보게 될 것이다. 반복문의 반복이 끝나면 투명도가 1이 되어 있을 것이다. 반복문 실행후에 CanCollide 속성을 비활성화 해줘서 게임 아바타가 밑으로 떨어지게 만들어 주었다.

local platform = script.Parent
 
local function fade()
    for count = 1, 10 do
        platform.Transparency = count / 10
        wait(0.1)
    end
    platform.CanCollide = false
end
 
platform.Touched:Connect(fade)

 

다시 나타나게 하기

플레이어 아바타가 살기 위해서는 블럭이 사라지기 전에 점프를 해서 넘어가야 할 것이다.

그러면 잠시 후에 블럭은 다시 나타나야 한다. 이 경우는 서서히 나타나게 할 필요없이 3초 후에 즉시 나타나게 하자.

CanCollide 는 활성화, Transparency 속성은 0으로 만들어서 완전히 불투명하게 만들자.

local platform = script.Parent
 
local function fade()
    for count = 1, 10 do
        platform.Transparency = count / 10
        wait(0.1)
    end
    platform.CanCollide = false
    wait(3)
    platform.CanCollide = true
    platform.Transparency = 0
end
 
platform.Touched:Connect(fade)

 

Touched 이벤트에 연결된 fade() 함수는 게임 아바타가 해당 블럭에 올라타면 발동된다. 게임 아바타는 블럭 위를 달리면서 완전히 사라지기 전에 다른 블럭으로 이동해야 한다. 달리는 동안에는 게임 아바타와 FadingPlatform 블럭은 계속 닿아있게 된다. 그러면 Touched 이벤트가 뛰어다닐 동안 연속해서 "계속" 발생하게 된다. 이벤트와 연결된 fade() 함수도 계속 다시 실행되기 때문에, 결국 예상한 실행 결과와는 다르게 FadingPlatform 은 사라지지 않게 된다.

그럼 어떻게 해야할까? fade() 함수가 연속으로 다시 실행되기 때문에 생기는 문제이므로 연속으로 실행되지 않게 만들면 된다. 아바타가 처음 FadePlatform 블럭에 올라탔을 때만 fade() 함수를 실행시키고 그 이후의 이벤트는 무시한다. 그리고 아바타가 다른 곳으로 넘어가면 이벤트를 다시 반응하게 만들어 주자.

 

연속 실행 방지 변수

Touched 이벤트의 연속 발생 자체를 막는 것은 어렵다. 그렇다면 이벤트에 연결된 fade() 함수의 연속 실행을 방지하면 된다.

그러기 위해서 변수를 하나 사용하자. fade() 함수의 연속 실행을 방지하기 위한 변수를 하나 선언한다.

-- fade()함수의 연속 실행을 막아줄 변수 선언
local isTouched = false

 

fade() 함수가 실행되기 전에 이 isTouched 변수가 false 인가 true 인가를 확인하고 실행을 하면 된다. 

local platform = script.Parent

local isTouched = false

local function fade()
-- isTouched가 false 일때만, 실행된다.
	if not isTouched then
		for count = 1, 10 do
			platform.Transparency = count / 10
			wait(0.1)
		end
		platform.CanCollide = false
		wait(3)
		platform.CanCollide = true
		platform.Transparency = 0
	end
end

platform.Touched:Connect(fade)

 

if 문을 사용하여 isTouched가 false 일 때만 사라지는 효과가 생기게 바꾸었다. false의 not은 true 이므로 여기서는 not 연산자를 사용하였다. 

아래의 두개는 lua 언어에서 논리적으로 같다.

if isTouched == false then
end

if isTouched ~= true then
end

 

isTouched 변수 셋팅/리셋팅하기

isTouched 변수를 이용하여 fade() 함수의 연속 실행을 방지하기 위해서는 적절한 타이밍에 true/false 를 셋팅해줘야 한다. 

  • fade() 함수가 실행될 때, isTouched를 true로 만든다.
  • fade() 함수가 실행되고 실행이 완료된 후에는 isTouched를 false로 만든다. 이렇게 만들어 둬야 다시 반복해서 실행될 수 있다.
local function fade()
	if not isTouched then
		isTouched = true
		for count = 1, 10 do
			platform.Transparency = count / 10
			wait(0.1)
		end
		platform.CanCollide = false
		wait(3)
		platform.CanCollide = true
		platform.Transparency = 0
		isTouched = false
	end
end

platform.Touched:Connect(fade)

 

이제 테스트를 통해 코드가 완벽하게 동작하는지 확인해 보자.

게임 아바타가 FadePlatform 위에 올라타고 나면 몇초후에는 FadePlatform 은 서서히 사라져야 한다. 사라진 이후 몇초뒤에FadePlatform 블럭이 다시 나타나는지, 다시 올라타도 똑같이 반응하지 확인하자.

위의 영상처럼 FadePlatform 복사/붙혀넣기하여 여러개를 만들어보자.

탐색기에서 해당 FadePlatform 을 선택하고 마우스 오른쪽클릭을 하면 나오는 메뉴에서 Duplicate(Ctrl+D)을 선택하면 해당 게임오브젝트가 그대로 복제가 된다. 

 

다른 글 보기  - 루아 스크립트 (Lua Script) 알아보기