전략게시판

전략게시판 [스튜디오]
[루아] 스크립트 블록에 대해 알아보자.
2020.03.10 21:14 조회 : 559
Lv. 234토게피 가입된 패밀리가 없습니다. 작성자 게시물 더보기


루아 스크립트 블록은 두가지가 있는데, 위 사진 왼쪽 블럭은 스크립트로부터 ON/OFF 신호를 받아 전달하는 장치 제어 스크립트 블록, 오른쪽 블럭은 ON/OFF 신호를 받아 이를 스크립트로 전달하는 함수 호출 스크립트 블럭이다.

그러나 더 이상의 설명을 넥슨에서 안해주길래 딱히 쓸만한 곳이 없었는데, 답답해서 직접 연구해보면서 알아낸 것들을 공유하고자 글을 적는다.


첫번째로, 함수 호출 스크립트 블록.

이건 그나마 다루기 쉬운 편에 속한다.
이 블록의 가장 큰 용도는 루아 스크립트를 다른 논리회로 블록과 연동하게끔 해준다는 것이다.

자, 버튼을 누르면 카운트 다운이 진행되고, 카운트 다운이 끝나면 빨간 블럭 위 무기가 스폰되게 하는 기능을 루아 스크립트로 구현한다고 하자.


위와 같은 상황에서 버튼에 OnUse 콜백을 사용한다면, 버튼을 누르자마자 무기가 생성되고 카운트다운이 시작된다. 카운트다운이 끝난 뒤에 무기를 생성하고 싶은 상황을 만들고 싶을때, 함수 호출 스크립트 블럭이 사용된다는 것이다.

*물론 이를 사용하지 않고도 구현이 불가능한것은 아니지만, 이를 구현하기 위해서는 추가적인 변수의 선언과 연산이 필요하다. 함수 호출 스크립트 블럭을 통해서 루아 스크립트의 길이를 최소한 줄이는 것이 맵의 신뢰성을 높이고 제작과정의 불편함을 최소화할 수 있는 방법이라는 것이다.

함수 호출 스크립트의 가장 간단한 사용 방법은 다음과 같다.

>>game.lua

function Test1()
    Game.Weapon:CreateAndDrop (Common.WEAPON.DualBerettaGunslinger, ({x=-32,y=-40,z=0}))
end

함수 호출 스크립트 블럭을 통해 Test1 함수를 호출하고 싶다면, 함수 호출 스크립트의 편집 칸에 해당 함수의 이름을 적기만 하면 된다.


그리고 스크립트 테스트를 해준다면...


다음과 같이 해당 좌표에 무기가 스폰하는 것을 볼 수 있다.

한가지 주의할 점으로는, 함수 호출 스크립트 블럭은 상당히 예민한 블럭인데,


위 사진은 레버를 활성화 하면 몬스터가 스폰되고, 몬스터를 처치하면 몬스터 블럭이 함수 호출 스크립트에 ON 신호를 줌으로써 함수가 실행되게끔 하는 구조이다.

그러나, 실제로 작동해보면 함수 호출이 두번 일어나는데, 이는 몬스터를 스폰할때, 함수 호출 스크립트 블럭이 OFF 신호를 받아서 실행되고, 몬스터를 잡으면 ON 신호를 받아 실행되기 때문이다.

이 성질은 특히 장치초기화가 일어났을때에도 반응하기 때문에, 게임이 시작되기도 전에 루아 함수가 호출되서 스크립트가 꼬이게 되는 원인이 된다.

이를 제어하기 위해서는 '함수의 전달할 인자' 칸을 사용하면 된다.
함수에 전달한 인자 칸으로는는 무슨 장치 블럭에 연동되던지간에 자료형이 부울인 상태로 전달된다. 함수 호출 스크립트 블럭이 ON 신호를 받으면 함수가 true 인자를 전달하고, OFF 신호를 받으면 함수가 false 인자를 전달한다.

우리가 원하는 상황은 대부분 ON 신호를 받았을때 함수가 호출되는 식이므로, 다음과 같이 스크립트를 짜면 함수가 불필요하게 호출되는 현상을 막을 수 있다. 이를 적용시킨 루아 스크립트는 아래와 같다.

>>game.lua

function Test1(trig)
    if trig then
        Game.Weapon:CreateAndDrop (Common.WEAPON.DualBerettaGunslinger, ({x=-32,y=-40,z=0}))
    end
end


if trig then ~ end 조건문이 없다면, 버튼이 눌려서 ON 신호가 전달될때 true 인자로 한번, 버튼의 ON 신호가 끝날때 false 인자로 한번 함수가 호출되어서 무기는 두번이 스폰되지만, 조건문을 통하여 trig가 true가 되었을때만 무기가 스폰되게끔 제어가 되므로 원하는대로 무기를 한번만 스폰하게끔 할 수 있다.


두번째로는, 장치 제어 스크립트 블록

함수 호출 스크립트 블록은 그나마 직관적이라서 사용하기가 어렵지는 않았지만, 이 블록은 넥슨이 알려주는 것이 너무 빈약한 탓에 많이 찾아다녔다.

이 블록의 용도는 다른 장치블록을 원하는 타이밍에 조작하게끔 해주는 용도이다.
물론 이 블록을 쓰지 않고 Event 콜백을 사용하여 장치 제어 스크립트 블록 대용으로 사용할 수는 있으나, Event 콜백을 사용할 시에는 장치 블럭이 동작될때 나는 소리가 들리고, 무엇보다 장치블럭 코스트가 장치 제어 스크립트 블록보다 월등이 무겁다. 장치블럭(버튼)은 그 코스트가 50이지만, 장치 제어 스크립트의 코스트는 1이다. 장치블럭 코스트를 다른 곳에다가 투자할 수 있다는 뜻이다.
( + Event 콜백을 사용하려면 그전에 해당 버튼이 장치 블럭으로써 선언 (Game.EntityBlock:Create) 이 되어야하는데, 이 과정에서 추가적인 코드와 메모리를 잡아먹게된다. 내부적으로도 복잡해진다는 뜻이다.)


자, 랜덤한 정수를 뽑아 그 수에 따라서 둘 중 하나가 죽는 장치를 루아 스크립트를 활용하여 구현한다고 하자.


1~100의 랜덤 정수를 뽑고, 짝수가 나오면 파란색의 데미지 존이 활성화되고, 홀수가 나오면 빨간색의 데미지 존이 활성화되게 할 것이다.

함수 호출 스크립트 블럭이 활성화되면 랜덤 정수를 뽑고, 홀수인지 짝수인지 판별하여 알맞은 장치 제어 스크립트 블럭을 활성화시킬 것이다.

두 장치 제어 스크립트 블럭은 함수 호출 스크립트 블럭에 의해 실행되는 함수에 의해 활성화될지 말지가 결정된다. 이 예제에서는 함수 호출 스크립트 블럭이었지만, 이 장치 제어 스크립트 블럭은 OnRoundStart 콜백, OnTakeDamage 콜백과 같은 장치 블럭을 사용하지 않은 상태에서도 상호작용이 가능하다는 것이 가장 큰 장점이라고 할 수 있다.

이제 가장 간단한 예제를 보며 장치 제어 스크립트 블럭의 사용법을 알아보자.
장치 제어 스크립트는 루아 스크립트를 통해야만 신호가 전달되므로, 함수 호출 스크립트를 사용할 것이다.

function Test2(trig)
    if trig then
        Game.SetTrigger('test2', true)
    else
        Game.SetTrigger('test2', false)
    end
end

 
이 예제는 버튼을 누르면 함수 호출 스크립트 블럭이 작동하고, 이 스크립트 블럭이 옆의 장치 제어 스크립트 블럭을 활성화 시켜 피스톤이 작동되는 구조이다.(반대로도 적용됨)

위 함수 호출 스크립트의 호출할 루아 함수 이름은 Test2 이며, 함수에 전달할 인자는 trig이다.
코드를 보면 알겠지만 장치 제어 스크립트 블록을 쓰기 위해서는 특별한 함수가 사용된다는 것을 알 수 있다.

스크립트 내에서 사용될 이 함수의 기본적인 구조는
Game.SetTrigger(name, value)
이며, name은 아래 사진의 '루아에서 호출할 이름' 칸에 적힌 이름을 적으면 된다. 사용되는 자료형이 문자열이기 때문에 스크립트에 사용할 때에는 이름 양 옆에 따옴표 혹은 큰따옴표를 사용하여 문자열임을 알려주어야 한다.

value의 자료형은 부울이며, true를 쓰면 ON 신호를 전달하고, false를 쓰면 OFF 신호를 전달한다.


열공 ㅋㅋ..피드백 대환영

부록) 아래에서 3번째 사진에 사용된 루아 스크립트
>>game.lua

function LuckyPang(switch)
    if switch then
        local killcode = Game.RandomInt(1,100)
        print(killcode) --킬코드 확인용, `키를 눌러 확인 가능
        if killcode%2 == 1 then
            Game.SetTrigger('odd', true)
        else
            Game.SetTrigger('even', true)
        end
    end
end

추천 : 2
댓글을 남기시려면 로그인 해주세요
댓글 : 7
  • 와 먼소린지 하나도 모르겠네여 Lv. 398님들밥먹고히죠 2020.03.15
  • 루알못이라 영어(루아 글)랑 함수 이런 말 보면 머리아프네요.. Lv. 306헌터킬러X45 2020.03.14
  • 열정?이 보이는 글 잘읽었습니다. ^^;;플레이모드의 유저수가 많아지길 바랍니다. 정보 감사합니다. Lv. 770페르난도 2020.03.11
  • 아하 Lv. 14WeirdJumps 2020.03.10
  • 그게 제가 말한 루아로 전달할 함수 인자 파트에요. 함수 인자가 true일때만 실행하게끔 하면 딜레이 끝날때 실행을 안하게 되더라구요 Lv. 234토게피 2020.03.10
  • 함수호출블록 딜레이로 연결하면 딜레이 끝날때 함수 한번 더 실행함 ㅠㅠ Lv. 14WeirdJumps 2020.03.10
  • 스크립트 API도 절반이 엉망이야...개짜증 Lv. 234토게피 2020.03.10