며칠 간 걸친 공부가 드디어 끝나갑니다.

배우고 나면 별 거 없는 거 같은데 접근이 힘들고 정보가 부족해서 

많은 사람들이 도전하기 부담스러워 하는 듯 합니다.


여기까지 만약 같이 따라오셨다면 대단하다는 말씀을 드리겠습니다.

토드의 손가락 미세먼지까지는 따라간 것 같네요.


이번 강의 시작하겟습니다.

Lokir's Tomb는 개발자 모드로서, 스카이림에 구현되어 있지는 않습니다.

스크립트가 아닌 다른 개발자 튜토리얼 "레벨 디자인 튜토리얼"에서 결과물로 만들어낸 모드입니다.

강의를 듣기 위해 필요하므로 " 완성 된 수준의 플러그인을 다운로드 "하여 설치한 후

강의를 따라가도록 합시다.




<마지막 강의. Papyrus 이벤트 및 속성>


개요

이 튜토리얼은 Papyrus 이벤트속성을 소개 합니다.

배울 것:

  • 파피루스 이벤트 및 트리거 방법에 대한 기본 정보.
  • Papyrus Properties에 대한 기본 정보와이를 생성, 채우기 및 사용하는 방법.
  • 이벤트를 전달하여 게임이 Papyrus와 상호 작용하는 방법.
  • Papyrus가 속성에 대한 작업을 수행하여 게임과 상호 작용하는 방법.

이 튜토리얼은 레벨 디자인 튜토리얼 에서 만든 샘플 던전 인 Lokir 's Tomb 의 이벤트를 기반으로합니다 . 해당 자습서를 완료하지 않은 경우 완성 된 수준의 플러그인을 다운로드 할 수 있지만이 자습서에서는 다음과 같은 요소를 포함하여 여기에 소개 된 요소에 이미 익숙하다고 가정합니다.


계획

현재 Lokir 's Tomb 의 마지막 방에 들어가면 '보스 드로거'가 석관에서 일어나 공격합니다. 몇 가지 고유 한 스크립트 요소를 도입하여 이 전투를 더욱 흥미롭게 만들어 보겠습니다. 보스가 무덤에서 나올 때 다시 살아나는 방에 죽은 드로거 두 명을 추가하는 것부터 시작하겠습니다.


무대 설정

먼저 부활시키고 싶은 드로거를 설정하겠습니다. CK툴 에서 LokirsTomb 셀을 열고 동굴 영역으로 가 줍니다. 그곳은 우리의 보스 방입니다. Object Window에서 에서, Actor -> Actor or All를 찾아보거나, Filter를 사용하여 검색하여 "LvlDraugrMissileMale""LvlDraugrWarlockMale을" . 각각 하나 씩 방으로 끌어다 놓습니다.

이 배치된 드로거들이 살아서 움직이도록 하려면. 우리는 그들을 눕혀놓아야 합니다. 각각을 두 번 클릭하고 "Starts Dead" 라고 표시된 부분을 선택 합니다.



이전 BGS 타이틀에 익숙한 모더는 주목할 만합니다. 기본 액터의 상태를 0으로 설정해도 더 이상 액터가 죽기 시작하지 않습니다. 여기에 지정된대로 "Starts Dead"확인란을 사용해야합니다.
- 이 부분은 별로 중요치 않습니다.

플러그인을 저장하고 게임 내에서 실행하여 지금까지 만드신 결과물을 확인하세요. 두 명의 죽은 Draugr가 이제 방 바닥의 봉제 인형에 누워 있음을 알 수 있습니다. 그것이 지금 우리가 원하는 것입니다. 그러나 Creation Kit로 돌아가서 그들이 다시 서있게 합시다.


이벤트 기획

이벤트 소개

보스가 무덤에서 나올 때이 드로거가 부활되기를 원합니다. 즉, Event 에 대한 응답으로 이것이 발생하기를 원합니다 .

" 이벤트 " 는 게임이 Papyrus에 알리는 작업 또는 상태 변경입니다. 다음과 같은 수백 가지 이벤트가 있습니다.

  • 물체 또는 캐릭터와 상호 작용 (레버 당기기, 문 열기, 시체 약탈).
  • 잠금장치 따기 , 무장 , 무장 , 또는 무언가를 버리거나
  • 장소에 들어가거나 떠나거나
  • 전투에 돌입하거나 떠나거나 , 전투 에서 거나 , 죽어가던가 .
  • 외 기타

간단히 말해서, 우리가 게임에서 어떤 행위에 대해 반응하고 싶다면 필요한 것이 Event 라는 것입니다.


활성화 이벤트 트리거

여태껏 모르셨을 수도 있지만, 우리가 만들어왔던 예시들은 이미 Papyrus로 보낸 이벤트를 사용합니다. 이것이 보스가 석관에서 나올 때를 아는 방법입니다. Ambushes Tutorial을 완료했다면 보스가 Activate Parent로 트리거 볼륨을 사용한다는 것을 기억할 수 있습니다. 

- 위 부분은 스크립트가 아닌 레벨 디자인 튜토리얼에서 진행한 부분입니다.


플레이어가 트리거 볼륨에 들어가면 트리거가 보스를 활성화시켜 보스를 일으킵니다.


작성자 팁:

이 부분을 이해하시면 다음이 쉽습니다. 레벨 디자인 부분을 공부하지 않으신 분들을 위해 간단히 설명해 드리면,

베데스다는 이미 레벨 디자인에서 OnTriggerEnter 이라는 이벤트 스크립트를 만들어 놓았고, 우리가 생성하려는 스크립트와

충돌시켜 드로거를 일으키려는 것입니다.



여기에는 기존 스크립트가 있지만 기본적으로 발생하는 작업은 다음과 같습니다.
  • 플레이어가 트리거와 충돌하여 onTriggerEnter 이벤트가 발생합니다.
  • 트리거의 스크립트는 이에 대한 응답으로 Activate 이벤트를 보냅니다.
  • 드로거 보스는 트리거의 활성화 자식이므로 활성화도받습니다.
  • 드로거 보스의 스크립트가 활성화에 반응하여 그를 무덤에서 나오게합니다.


동일한 트리거를 사용하여 두 개의 죽은 드로거에 Activate 이벤트를 보낼 수도 있습니다 .


각 드로거에 대해 :

  1. 드로거를 두 번 클릭 하여 속성 창을 엽니다.
  2. Activate Parents 탭을 찾아 선택합니다 .
  3. 빈 목록을 마우스 오른쪽 버튼으로 클릭하고 'New'를 선택합니다. Ref 선택 활성화 대화 상자가 나타납니다.
  4. 'Select Reference in Render Window '을 클릭합니다.
  5. 십자형 커서가 나타나면 트리거 볼륨을 두 번 클릭합니다.


트리거가 표시되지 않는 경우 " M "을 사용 하여 마커의 가시성을 전환해야합니다.

두 드로거는 이제 플레이어가 방아쇠를 당길 때 활성화 이벤트를받습니다. 그러나 우리는 실제로 이 이벤트를 사용하여 아직 아무것도하지 않았습니다. 다음으로 해당 이벤트에 응답하는 스크립트를 작성합니다.


부활 스크립트 만들기

초기 설정

스크립팅을 시작할 시간입니다. 선호하는 텍스트 편집기( Notepad ++Sublime Text를 설치하시면 좋습니다)를 열고 

"LokirsDraugrResurrection.psc" 라는 새 파일을 만듭니다 . 다음 두 줄의 스크립트로 적어넣기 시작하시면 됩니다.


scriptName LokirsDraugrResurrection extends Actor
{Resurrects the two dead Draugr in Lokir's Tomb.}


스크립트 설명:

  • scriptName LokirsDraugrResurrection - 스크립트의 이름입니다. 스크립트 이름은 파일 이름과 정확히 일치해야합니다 . 
  • extends Actor - 이 스크립트는 Actor (드로거)에 배치되므로 Actor가 할 수있는 모든 작업을 수행 할 수 있습니다. 
  • {...} - 중괄호 안의 텍스트는 주석과 유사한 파일 설명입니다. 필수는 아니지만 여기에있는 것이 좋습니다. 


onActivate 이벤트를 수신하도록 지시하고 싶습니다. 플레이어나 NPC와 같은 다른 Object가 Object를 "사용"하거나 "활성화"하려고 할 때 발생합니다. 이 경우 매복 트리거의 스크립트가 활성화를 전송합니다. 

scriptName LokirsDraugrResurrection extends Actor
{Resurrects the two dead Draugr in Lokir's Tomb.}
 
Event OnActivate(ObjectReference akActionRef)   
  ; Cast a Reanimate spell on the Draugr
EndEvent


#작성자 첨언:

어려우실 수도 있지만, OnActivate는 앞의 스크립트 작성 강의에서도 매번 사용했던 이벤트 트리거입니다. 크게 다를 거 없습니다.


주문 캐스팅

다음으로 Activate 이벤트가 수신되면 드로거에게 Reanimate 주문을 시전해야합니다. 이렇게하려면 "Property"를 만들어야합니다 . 이 경우 우리가 사용할 Spell 유형 의 속성입니다 . 이를 통해 Creation Kit에 어떤 특정 주문을 사용할지 알릴 수 있습니다.


아래와 같이 Spell 속성 을 "declare(선언)" 하여 시작하십시오 . 

scriptName LokirsDraugrResurrection extends Actor
{Resurrects the two dead Draugr in Lokir's Tomb.}
 
Spell property reanimateSpell auto
 
EVENT OnActivate(ObjectReference akActionRef)   
  ; Cast a Reanimate spell on the Draugr
EndEVENT


스크립트 설명:

  • Spell - Property의 Type 입니다. 파피루스에게 우리 가 사용할 주문 을 제공하겠다고 알려줍니다 .
  • property  - 예약어입니다. 파피루스에게 우리가 기대하는 새 속성을 알려주는 방법입니다.
  • reanimateSpell - 변수에 부여하는 이름입니다. 게임 내에서 Papyrus는이 속성을 참조 할 때마다 주문을 사용합니다.
  • auto - 또 다른 예약어입니다. - Papyrus에게 변수에 대한 'get'및 'set'함수를 자동으로 생성하도록 지시합니다. 여기에서 세부 사항에 대해 걱정하지 마십시오. 세부사항까지는 중요하지 않습니다.
  • ; - 세미콜론은 파피루스의 주석 문자입니다. 이를 사용하여 스크립트가 수행하는 작업에 대한 메모를 보관하십시오. 세미콜론 뒤의 모든 것은 게임에서 무시되므로 원하는 내용을 막 적어놓아도 됩니다.


주문을 정의했지만 아직 아무것도하지 않습니다. Spell 속성은 다음에 사용할 Cast 기능을 가지고 있습니다 . 아래의 onActivate 이벤트 내에서 새 스크립트 줄을 복사합니다. 어디가 바뀌었는 지는 아시겠죠?

scriptName LokirsDraugrResurrection extends Actor
{Resurrects the two dead Draugr in Lokir's Tomb.}
 
Spell property reanimateSpell Auto
 
EVENT OnActivate(ObjectReference akActionRef)   
  ; Cast a Reanimate spell on the Draugr   
  reanimateSpell.Cast(Self, Self)
EndEVENT


많은 함수와 마찬가지로 함수가 무엇을해야하는지 알려주기 위해 하나 이상의 "인수 "를 전달 해야합니다. 이 경우 Cast 에는 소스와 대상이 필요합니다. 이 예에서는 주문을 "시전"하기 위해 드로거가 필요했습니다. 예약어 "Self" 가 이 경우에 유용합니다. 두 위치에 모두 전달함으로써 Papyrus는 스크립트가 첨부 된 동일한 대상(드로거)을 참조하고자한다는 것을 자동으로 인식합니다. 이 경우 "self"는 우리가 부활 할 드로거에 대한 새 속성을 만드는 것과 동일합니다. 훨씬 더 간단합니다.

스크립트를 Save하고 컴파일 한 다음 Creation Kit로 돌아갑니다.


스크립트 첨부

Editor로 돌아가서 드로거 중 하나를 두 번 클릭하여 속성 창을 연 다음 Scripts 탭으로 이동합니다 ( 'End'키를 눌러 바로 이동할 수 있습니다. 목록의 마지막 탭입니다). 여기에서 스크립트를 연결합니다.

  1. Add를 클릭 합니다.
  2. Add script... 창에서 새로운 스크립트인 'LokirsDraugrResurrection'의 이름을 입력합니다.
  3. 스크립트를 두 번 클릭하여 드로거에 추가합니다.

이 Reference에 스크립트가 첨부되어 있지만, 우리는 여전히 Creation Kit에 어떤 주문을 발동할지 알려야합니다. 우리는 이와 같은 이벤트를 위해 만들어진 특별한 주문인 "dunReanimateSelf"를 사용할 것입니다.

다음 작업을 수행하지 않으면 스크립트에서 사용하는 모든 속성 (외부 리소스)이 올바르게 등록되지 않습니다. (이것은 속성이 local 이름 전용 이기 때문 입니다.) 속성의 이름이 기존 외부 개체와 동일한 경우에도이 단계가 없으면 제대로 작동하지 않습니다.
- 잘 따라가면 크게 신경 안쓰셔도 됩니다


  1. Scripts 탭 에서 LokirsDraugrResurrection 을 선택합니다 .
  2. Properties를 클릭 합니다.
  3. 나타나는 목록에는 reanimateSpell 이라는 단일 속성 만 있습니다 .
  4. reanimateSpell을 선택하고 Edit value 클릭 합니다 .
  5. 이 목록에는 유효한 형식 (이 경우 Spell) 만 표시됩니다.
  6. dunReanimateSelf를 선택합니다 . OK를 클릭하십시오.

다른 Draugr에도 이 과정을 똑같이 해 줍니다. 작업을 저장하고 게임에서 사용해보세요!


부활 디버깅

언뜻보기에 모든 것이 예상대로 작동했을 것입니다. 그러나 계속 플레이했다면 드로거가 Activate 이벤트를 수신 때마다 부활이 발생한다는 것을 알았을 것 입니다. 여기에는 플레이어가 드로거 시체를 약탈 할 때도 포함됩니다! (드로거 시체 클릭해도 부활하는 겁니다;;;;)

우리가 의도한 부분은 아니죠! 그러나 이와 같은 예기치 않은 버그는 약간의 추가 로직을 사용하여 처리 할 수 있습니다.

제어 변수 를 사용하여 부활이 한 번만 발생하도록하는 것과 같이, 이 문제를 해결할 수있는 여러 가지 방법이 있습니다. 스크립트가 플레이어의 활성화를 무시하도록 할 수도 있지만, 그래도 NPC에 의해 우발적으로 다시 부활 할 수 있습니다.

그러므로 triggerbox가 활성화를 보낼 때만 부활이 발생하도록 할 것입니다. 이번에는 트리거에 할당 할 다른 속성 ( 이번에 는 Object Reference)을 만들어 이를 수행 합니다.

이 새 속성을 OnActivate() 이벤트 에서 제공 하는 매개 변수 인 "akActionRef" 와 비교합니다 . 이 매개 변수는 일종의 특수 변수로,이 onActivate 이벤트 내에서만 사용할 수 있으며 Papyrus는 Activate를 담당하는 Reference에 자동으로 할당합니다.

수정된 코드는 다음과 같습니다.


scriptName LokirsDraugrResurrection extends Actor
{This Script lives on the dead minion draugr in Lokir's Tomb. It handles their resurrection}
 
Spell property reanimateSpell Auto          ; this is the special self-resurrection spell to use
objectReference property myTrigger auto     ; This is the reference we are waiting on to send an activate
 
Event OnActivate(ObjectReference akActionRef)   
;I've been activated - see if was my trigger   
  if (akActionRef == myTrigger)      
     ;Cast a Reanimate spell on the Draugr      
     reanimateSpell.Cast(Self, Self)   
  EndIf
EndEvent

작성자 첨언: if라는 조건문을 넣어서 특정 상황에서만 발생하도록 처리한 겁니다!


스크립트 설명:

  • objectReference- 새 속성의 데이터 유형입니다.
  • myTrigger- 이전과 마찬가지로 새 속성에 대해 선택한 이름입니다.
  • if- 이것은 "if"문의 시작입니다 . if 아래의 테스트 조건이 true이면 스크립트가 실행됩니다. 그렇지 않으면 Papyrus는 아래 의 해당 "endIf " 다음에 해당하는 명령 처리를 다시 시작 합니다.
  • (akActionRef == myTrigger) -이것이 테스트 조건입니다. "=="는 "같음"으로 해석되는 논리 연산자입니다. 이 경우 akActionRefmyTrigger 가 동일한 참조로 채워진 경우에만 "if" 문이 계속 되도록 지시 합니다.
  • endIf- "if" 문 을 닫는 데 필요 합니다. 더 복잡한 작업을 위해 서로 여러 개의 if 문을 가질 수 있으므로, 이를 사용하여 논리를 추적하는 것이 중요합니다. "if" 문이 다른 "if"문 안에 있도록 하여 여러 번 중첩시킬 수도 있습니다.


이제 마지막으로해야 할 일은 새 속성에 값을 할당하는 것입니다. 이를 위해 Creation Kit로 돌아가서 죽은 두 명의 드로거 중 하나를 더블 클릭합니다. 스크립트 탭으로 이동하여 LokirsDraugrResurrection 스크립트를 선택하십시오 . 그런 다음 속성을 누르십시오. 그런 다음 새 myTrigger 속성을 선택하고 "Edit Value"를 누릅니다. 이제 "Pick Reference in Render Window "을 선택합니다. 마지막으로, 보스 드로거가 무덤에서 나오도록 트리거하는 파란색 활성화 상자를 두 번 클릭합니다.

플러그인을 저장 한 다음 계속해서 테스트하십시오.

드로거는 이제 한 번만 부활 할 것입니다. 플레이어가 활성화 상자를 통과 할 때마다 Draugr이 부활(보스 드로거 트랩이 트리거)하지 않는 이유는 doOnce 라는 스크립트에 첨부 된 속성 때문입니다. triggerbox(defaultActivateSelf)에 첨부 된 스크립트를 자세히 확인하여 속성에 기본값 이나 자동 값을 할당하는 방법을 확인하는 것이 좋습니다.


후... 이제 사실상 다 끝났습니다.

스크립트를 수정하는 정도로는 마지막편은 필요 없다고 생각합니다.

마지막편은 거의 스크립트를 통해 모드를 생성하는 부분에 가깝다고 보시면 됩니다.

공부가 거의 다 끝났다고 생각하시는 분들을 위해 베데스다에서 만들어 놓은 스크립트 목록을 따 드리겠습니다.

이를 조금씩 수정하면서 새로운 기능을 하는 모드를 만들어 낼 수도 있겠죠!


완성된 스크립트 목록:


툴갤의 공장장이 되어주세요!

여기까지 공부하신 분들 고생 많으셨습니다