이번 강의는 조금 어려울 수 있습니다.

코딩 관련 개념들이 상당히 많이 나옵니다.


어려움을 덜어드리기 위해 쉽게 용어 설명을 해드리겠습니다.


객체: 실행하는 동작을 담아두는 통이라 보시면 됩니다.

속성: 동작의 스타일입니다.

함수: 특정 동작을 정의해 놓은 구문입니다.

참조: 함수에게 넣어준 것을 함수 안에서 가져다 쓰는 거라고 보시면 됩니다.

호출: 함수를 실행시키는 거라 보시면 됩니다

인수: 참조할 놈(함수에게 넣어준 것)의 스타일입니다.





Bethesda Tutorial 


Papyrus Introduction to Properties and Functions


개요

이 튜토리얼은 당신이 Hello World 튜토리얼Variables and Conditionals 튜토리얼을 끝냈다는 가정하에 진행된다. 이번에는 앞선 2개의 튜토리얼보다 내용이 길고, 좀더 심화된 몇가지 주제를 소개한다. 잘 따라해보길 바란다!

당신은 다음 내용을 배우게 된다. :

  • 지난 튜토리얼에서 짚지 않고 넘어갔던 것들에 대하여 :
    • 스크립트의 첫째줄과 스크립트를 "확장시키는 것"의 의미
    • {}를 사용하여 당신의 스크립트에 툴팁을 추가하는 방법
  • 속성값들을 사용하고 이것을 에디터에 엮는 방법
  • 함수를 만들고 사용하는 방법


첫째줄

시작하기 전에, 이전 튜토리얼에서 대충 넘어갔던 것들을 다시 보자.

계속해서 따라왔다면, 당신의 스크립트 최상단을 보기바란다. 첫번째 문장은 다음과 같을 것이다. :

 Scriptname HelloWorldScript extends ObjectReference
  • Scriptname HelloWorldScript extends ObjectReference: 어느 스크립트든 이 문장으로 시작한다.
  • Scriptname HelloWorldScript extends ObjectReference: 여기에 스크립트의 이름을 짓는다. 우리는 언제 어느 스크립트에서나 이 스크립트가 필요할 때마다 "HelloWorldScript"를 쓰게 될 것이다.
  • Scriptname HelloWorldScript extends ObjectReference: 이것은 항상 필수적이라는 의미의 특별한 단어이다. 이 스크립트는 이미 존재하는 다른 스크립트에 기초한다.
  • Scriptname HelloWorldScript extends ObjectReference: 이 스크립트는 다른 스크립트를 (혹은 다른 스크립트에 기반하여) 확장한다. 여기서는 "ObjectReference" 스크립트를 사용한다.


스크립트 확장하기

사실상 당신이 쓰는 모든 스크립트는 다른 스크립트로 확장될 필요가 있을 것이다. 당신은 스크립트를 확장할 때, "내 스크립트는 이런 스크립트와 같은거야. 내가 추가했던 또 다른 물건들도 말이지." 라고 말하는 것과 같다.

어떤 스크립트를 확장하는 것은 또한 게임에게 "내 스크립트는 이런 타입의 오브젝트야"라고 말하는 것이다.

예를 들어, 게임 속에서 Reference가 될 오브젝트(우리의 빛나는 기둥 같은)에 스크립트를 추가하였다면, 당신의 스크립트는 "ObjectReference"스크립트를 "확장"시킬 필요가 있다. 퀘스트에 스크립트를 추가하고 싶다면, "Quest"스크립트를 "확장"시켜야 한다. 그런식이다.

스크립트 작성에 조금 더 익숙해지면, 스크립트를 확장하는 것들도 곧 익숙해질 것이다. 지금은, 스크립트를 어떤 오브젝트에 할당할 때, 또 다른 스크립트로 확장을 해야한다는 점만 알고 있으면 된다.


툴팁 추가

당신이 쓴 스크립트의 두번째 줄이 어디서 온건지 궁금하지 않은가? 아래 문장 말이다. :

  {This is my very first script!}

새로운 스크립트를 만들고 The Documentation String에 들어가게 되면, 아래 문장이 생성될 것이다. :



이제 스크립트 탭에서 스크립트 위로 마우스를 가져 가면 도구 설명으로 표시됩니다.




툴팁을 변경하려면 중괄호 {} 사이의 텍스트를 변경하십시오.
속성을 관리하는 데 도움이되는 도구 설명을을 추가 할 수도 있습니다. 이는 다음과 같은 결과를 가져옵니다.


 

속성

다음 속성 정의는 cipscis.com 에서 제공합니다.


스크립트는 데이터 파일의 내부 부분이 아니고 컴파일러는 Creation Kit의 필수 부분이 아니기 때문에 스크립트의 데이터 파일에서 정보를 직접 참조 할 수 없습니다. 특정 액터와 같은 데이터 파일의 무언가를 참조하려면 다른 것을 중간 매개체로 사용해야합니다. 이 "다른 것"을 Property라고합니다.

속성을 사용하면 스크립트가 모두 액세스 할 수있는 특수 인터페이스를 제공하여 데이터 파일의 정보를 사용할 수 있습니다. 스크립트의 관점에서 속성은 "Actor"또는 "Quest"와 같은 특정 유형의 임의의 정보 조각입니다. Creation Kit의 관점에서 보면 해당 유형의 정보를 편집중인 개체에 첨부 된 스크립트의 인스턴스에 삽입 할 수있는 지점입니다.

속성 선언은 몇 가지 추가 작업이 필요하고 함수 내에서 속성을 선언 할 수 없다는 점을 제외하면 변수 선언과 매우 유사합니다.


일반적인 속성 선언의 예를 살펴 보겠습니다.

스크립트의 "int count"줄 위에 다음을 추가합니다.

 Message property box1 auto 
{첫 번째 동작에 따라 나타나는 메세지 박스에 대한 포인터.}

 Message property box2 auto 
{두 번째 동작에 따라 나타나는 메세지 박스에 대한 포인터.}

 Message property box3 auto 
{세 번째 동작에 따라 나타나는 메세지 박스에 대한 포인터.}
  • Message property box1 auto : 속성 의 유형입니다. 이 경우에 "Message." (이는 스크립트에서 "int"유형이되도록 "count"변수를 정의한 방법과 유사합니다.)
  • Message property box1 auto : 이 메시지는 변수가 아닙니다. property 입니다.
  • Message property box1 auto 이 속성의 이름은 "box1"입니다. (이것은 "count"변수의 이름을 정의한 것과 유사합니다.)
  • Message property box1 auto 속성을 선언 할 때 사용하기 만 하면 되는 특수 키워드입니다. (거의 모든 속성은 "auto"키워드를 사용합니다. 지금은 이것이 왜 그런지 걱정하지 마십시오. 속성을 선언 할 때 "auto"를 추가하는 것을 잊지 마십시오.)


여기 {}에 중괄호가 있습니다. 도구 설명이 제공됩니다. 한 번 봅시다:

File -> Save를 누르십시오. 스크립트 창을 닫습니다. 그리고 기둥 Reference 탭에서 속성 버튼을 누르십시오. 속성 목록이 표시되어야합니다. 속성 이름 위로 마우스를 가져가서 확인해 봅시다.




메시지 상자 만들기

이제 속성에 연결할 Message 개체를 만듭니다 .

에서 Object Window 에서 "Miscellaneous"카테고리를 펼쳐 "Message"카테고리를 클릭. 메시지 목록에서 마우스 오른쪽 버튼을 클릭하고 컨텍스트 메뉴에서 "New"를 선택합니다.




다음을 입력:

  • ID : myMessageBox1
  • Message Text : Hello World! This is the first time the player activated the Pillar. 




다음을 입력하여 두 개의 메시지 상자를 더 만듭니다.

    • ID: myMessageBox2
    • Message Text: This is the second time the player activated the Pillar.
    • ID: myMessageBox3
    • Message Text: It's been three or more times activating the Pillar



메시지 상자를 스크립트의 속성에 연결

돌아가서 Pillar에 첨부 된 스크립트의 속성 창을 엽니 다.

"box1"이있는 줄을 클릭 한 다음 "Edit Value"버튼을 누르십시오. 그러면 myMessageBox1 항목을 선택해야하는 "Pick Object"목록이 생성됩니다. 마찬가지로 box2 및 box3 속성에 대해 각각 myMessageBox2 및 myMessageBox3을 선택합니다.





참조 창을 닫으려면 "OK"를 누른 다음 (누르지 않는다면 변경 사항을 잃게됩니다) 플러그인을 저장하십시오.

따라서 여기서 본질적으로 수행 한 작업은 속성 (box1, box2 및 box3)을 편집기의 세 가지 Message 개체 (myMessageBox1, myMessageBox2 및 myMessageBox3)에 연결한 것입니다.

세 개의 Message box가 각각 적절한 속성에 연결되어 있는지 확인하였다면, 스크립트를 계속 편집 할 준비가되었습니다.



속성에 대한 함수 호출

이제 이러한 메시지 상자를 게임에 표시해 보겠습니다.

편집 할 스크립트를 열고 다음 줄을 바꿉니다.


이렇게 표시 된 구문을,

if count == 1
  Debug.MessageBox( "Hello, World!" ) 
elseif count ==  2    
  Debug.MessageBox( "Hello, World. Again!" ) 
else    
  Debug.MessageBox( "Hello, World. Enough already!" ) 
endif


다음 구문으로 변경합니다.

if count == 1   
  box1.Show()
elseif count == 2   
  box2.Show()
else   
  box3.Show()
endif


 여기서 우리가 할 일은 box1, box2, box3 속성의 각 메시지 객체에 대해 "Show ()" 함수를 호출하는 것입니다 . 마침표 (.)는 오른쪽에있는 함수 ( "Show ()")가 왼쪽에있는 개체 ( "box1"속성 내부의 메시지)에서 불러와야 함을 의미합니다.

스크립트를 Save 하고 OK 을 눌러 Reference 편집 양식을 닫습니다. 그런 다음 플러그인을 저장합니다 . 그리고 게임을 실행하십시오! 

(COC MolagBalVoiceCell)

기둥을 클릭 할 때마다 각기 다른 메시지의 텍스트가 표시되어야합니다.

( "cannot call show () on a none object"에 대한 경고가 표시되면 돌아가서 속성이 메시지 객체에 제대로 연결되었는지 확인하고 열려있는 모든 양식에서 OK를 누르고 플러그인을 저장했는지 확인하십시오. 그런 다음 다시 시도하십시오.)

자, 이제 함수를 만들어 봅시다!


기능 생성

Debug에서 "MessageBox ()"함수를 호출하고 속성 내부의 메시지에서 "Show ()"를 호출 한 것과 같습니다. 자체 스크립트에서 만든 함수를 호출 할 수 있습니다. 그러나 새 함수를 호출하기 전에 먼저 만들어야합니다.

이것을 스크립트 하단에 추가하십시오.

Message  function GetMessage ( int currentCount )       
  Message selectedMessage if currentCount == 1        
     chosenMessage = box1     
  elseif currentCount == 2        
     chosenMessage = box2    
  else        
     chosenMessage = box3    
  endif Return chosenMessage endFunction


첫 번째 줄의 의미는 다음과 같습니다.

  • Message function GetMessage (int currentCount) : 여기서 우리는이 함수가 Message 객체를 반환 할 것이라고 말하고 있습니다. 이것은 선택 사항입니다. 함수는 아무것도 반환 하지 않아도 됩니다.
  • Message function GetMessage (int currentCount) : 여기서 우리는 속성을 선언 할 때 "property"를 사용한 것과 비슷한 "This is Function"이라고 말해주는 부분입니다.
  • Message function GetMessage(int currentCount):  함수의 이름입니다. 스크립트에서 "호출"하는 데 사용할 것입니다.
  • Message function GetMessage(int currentCount):  괄호 () 안의 모든 것은 함수를 "호출"할 때 우리가 제공해야하는 "인수"입니다. 이 경우 INTeger를 제공해야합니다. (int로 선언했으므로) 인수 이름을 "currentCount"로 지정합니다. 함수를 호출 할 때 함수에 전달하는 값을 참조하기 위해 함수에서이 이름을 사용합니다.


다음 줄 : 

  • Message chosenMessage:  유형이 Message인 변수를 선언합니다. ( "count"변수를 "int"유형으로 선언 한 것처럼 모든 종류의 개체에 대한 변수를 만들 수 있습니다.이 경우에는 "Message"개체입니다.)
  • Message chosenMessage  변수의 이름을 "chosenMessage"로 지정합니다.


다음 섹션에서는 selectedMessage를 box1, box2 또는 box3 속성에있는 Message 개체 중 하나로 만듭니다. 

("=="와 "="의 차이점에 유의하십시오.)


마지막으로,

Return chosenMessage


즉, GetMessage() 함수를 호출하면 현재 chosenMessage 속성에있는 Message 객체가 제공됩니다.

이제 새 기능을 사용하도록 스크립트를 변경합시다.

다음 줄을 바꿉시다:

if count == 1   
  box1.Show()
elseif count == 2   
  box2.Show()
else   
  box3.Show()
endif


이렇게 바꾸면 됩니다:

 GetMessage(count).Show()

여기서 우리가 할 일은 GetMessage()를 호출하고 매개 변수로 count를 전달하는 것입니다. GetMessage(count)가 메시지를 반환하기 때문에 Show()를 호출하면 게임에 메시지가 표시됩니다.


우리가 여태껏 만들어 낸 최종 스크립트는 다음과 같습니다.

Scriptname HelloWorldScript extends ObjectReference   
{This is my very first script!}

Message property box1 auto 
{Points to the message box that is shown on the first activation.}
  
Message property box2 auto 
{Points to the message box that is shown on the second activation.}
  
Message property box3 auto 
{Points to the message box that is shown on the third activation.}
  
int count  ;stores the number of times this object has been activated

  
Event OnActivate(ObjectReference akActionRef)    
  count = count + 1
     
  GetMessage(count).Show() 
endEvent

Message function GetMessage(int currentCount)   
  Message chosenMessage     
  
  if currentCount == 1       
     chosenMessage = box1    
  elseif currentCount == 2       
     chosenMessage = box2   
  else       
     chosenMessage = box3   
  endif
    
  Return chosenMessage   
endFunction


게임을 실행하면 메시지 상자가 올바르게 팝업되는 것을 볼 수 있습니다. (COC MolagBalVoiceCell)