[워3 에디터 강좌] 변수의 기초 by storm

이번 강좌에서는 변수를 이해하고 간단하게 활용하는 방법에 대해서 알아보도록 한다. 프로그래밍 용어가 벌떡 등장하니까 긴장하는 사람도 있을지 모르겠지만, 어차피 이 워크래프트3 에디터에서는 직접적인 코딩을 하지 않아도 되므로 개념만 이해한다면 큰 어려움 없이 써먹을 수 있으니 안심해도 된다.



변수란 무엇인가?

변수(variable, 줄여서 var)란 말그대로 '변할 수 있는 수'이다. 게임뿐 아니라 어떤 프로그램이든, 일정한 데이터를 저장해둘 필요가 있고 또 그 값은 경우에 따라서 변경될 수 있으며 필요할 때 꺼내서 써먹어야 한다. 이를 위해서 프로그래밍에서는 필요한 데이터에 이름을 붙여서 저장해두는 것이다.

이론이 너무 길면 지루하므로 대강 이정도만 알아두고 바로 워3 에디터에서 변수를 생성하고 활용해보도록 하자. 우선 예제맵을 다운로드 받아서 에디터를 통해 연다.
▶예제맵 다운로드: TriggerEX_07.w3x

예제맵을 보면, 맵 우측 하단에 닭과 토끼들이 몇 마리 있을 것이다. 만약 플레이어가 닭을 잡을 때마다 몇 마리를 잡았는지 화면에 나타나게 하려면 어떻게 해야 할까? 우선 필요한 것은 닭이 죽을 때마다 숫자를 세어야 하고 또 그 숫자를 저장해 두어야만 한다. 그리고 그 숫자를 화면에 출력하면 된다.

이를 위해서는 변수가 필요하다. 변수를 만들려면 트리거 에디터 상에서 Ctrl +  B를 눌러 변수창을 연 다음 Ctrl + N을 눌러 새로운 변수 만들기를 선택한다. 그러면 아래 그림과 같이 변수를 생성하는 창이 열리는데, 변수 이름에는 ChickenKilled 와 같이 의미를 알아보기 쉬운 이름을 넣고, 변수 종류정수 (integer)로 선택한다. 그런데 왜 변수 종류를 정수로 해야 할까? 이 변수값은 닭을 죽인 수를 저장하는 것이므로, 0에서 시작해서 1, 2, 3, 4, 5...와 같은 식으로 정수값만 존재할 수 있다. (닭을 반만 죽이거나 0.2 만큼만 죽일 수는 없기에) 그래서 정수형태로 데이터를 저장하는 것이다. 그리고 초기값은 기본값인 0으로 내버려두면 된다. 왜냐하면 처음에는 한 마리도 죽이지 않은 상태이기 때문이다.
자 그러면 닭을 죽인 마리수를 저장할 변수는 마련되었다. 이제 닭이 죽으면 이 변수를 변경시키는 트리거를 짤 차례다. 트리거를 하나 생성시키고, 이벤트/조건/액션을 설정해보자. 우선 이벤트는 당연히 유닛 카테고리에 있는 유닛 - 특정 플레이어의 유닛이 특정상태가 되면 작동이 가장 적당하다. (참고로 닭과 토끼는 플레이어 2로 배정되어 있다)
그러면 조건은 무엇이 될까? 닭이 죽었을 때만 숫자를 셀 것이므로 유닛 타입 비교를 해서 죽은 유닛이 닭하고 같은 타입인지를 따져봐야 한다. 새로운 조건 만들기에서 유닛-타입 비교 항목을 고른 다음 비교 대상을 닭으로 지정한다. - 중립 | 멜리 | 마을 에 있다.

마지막으로 액션 항목을 설정해야 한다. 어떤 액션이 필요할까? 액션에서 해야 할 일은 두가지이다. 첫 번째는 죽은 닭의 수를 세는 것이고, 두 번째는 그 수를 화면에 보여주는 것이다.

우선 죽은 닭의 수를 세는 액션을 만들어보자. 닭이 몇 마리나 죽었는지를 기록하기 위해서 우리는 조금전에 변수를 하나 만들어놓았었다. 그리고 그 값은 일단 0인 상태다. 이 액션에서 해야할 일은 그 값에 +1을 해주는 것이다. 일단 새로운 액션 만들기를 해서 일반 카테고리에 있는 전역변수 설정을 선택한다. 그러면 아래와 같은 창이 나타날 것이다.

[참고] 변수는 크게 전역 변수와 지역 변수 두 가지로 구분 할 수 있는데, 프로그래밍 강좌가 아니므로 그런 것이 있다는 정도만 알아두고 넘어가도록 한다.
여기서 변수를 클릭해서 만들어 놓은 변수를 지정해주자. (변수명은 각자 설정한 이름이 나타날 것이다) 문제는 그 다음이다. 값 항목을 어떻게 해야 할까? 속편하게 +1 이렇게 할 수 있으면 참 좋겠는데, 프로그래밍의 세계는 그렇게 만만하지가 않다.

우선 정답부터 말하자면 (변수명) = (변수명) + 1 과 같은 식으로 설정해야 맞다. 아마 프로그래밍을 전혀 공부한 적이 없는 사람이라면 여기서 조금 의아해 할 수 있다. 이것을 수학 공식처럼 받아들이면 말도 안되는 일이기 때문이다. 처음에 변수의 초기값을 0으로 해놓았는데, 저 공식대로라면 0 = 0 + 1 이 되어 버린다. 하지만 이것은 겉보기와는 달리 수학 공식이 아니다. 프로그래밍에서 말하는 변수의 선언이다. 즉 변수의 값이 변수 값 더하기 1이라는 뜻이 아니라, 변수의 원래 값에 1을 더한 다음 그 결과값을 변수에 저장한다는 뜻이다.

만약 이 강좌에서 설명한대로 변수 이름을 ChickenKilled로 했다면, ChickenKilled = ChickenKilled + 1 과 같은 형태가 되어야 한다. 그리고 이 뜻은, ChickenKilled라는 이름의 변수에 원래 저장되어 있는 값에다가 1을 더한 다음, 그 결과값을 원래 있던 값 대신에 ChickenKilled라는 변수에 저장한다는 얘기다. 이렇게 하면 ChickenKilled라는 변수는 처음에 0 이었다가 닭이 죽을때마다 1씩 더해진 값으로 변경되어 저장된다.


그러면 트리거 에디터에서 이것을 어떻게 설정할 수 있을까? 전역 변수 설정의 액션 텍스트 '전역 변수 ChickenKilled의 값을 (으)로 설정합니다' 에서 을 클릭하면 아래 그림과 같은 창이 나타난다.
그러면 함수 항목에 있는 + 1 에서 다시 을 클릭한 다음에

위와 같이 만들어 놓은 변수 이름을 지정하고 [확인]을 누르면
이와 같이 ChickenKilled = ChickedKilled + 1 의 형태로 변수가 선언된다.


그러면 이번에는 이 변수값을 화면에 출력시키는 액션을 만들 차례다. 화면에 일정한 메세지를 표시하는 방법은 여러가지가 있지만 여기서는 가장 간단한 방법을 우선 해보도록 한다.

새로운 액션 만들기에서 퀘스트 카테고리를 선택한 다음, 퀘스트 메시지 출력을 고른다. 그러면 액션 텍스트가 (모든 플레이어 그룹)에게 퀘스트 갱신 형태로 메시지(을)를 출력합니다로 나타난다. 맨 앞에 있는 (모든 플레이어 그룹)은 메시지를 누구에게 보여줄 것인지를 고르는 항목이고, 퀘스트 갱신 형태로... 부분은 메시지 출력 형식을 고르는 항목이다. 여러 가지 형식이 있으니 나중에 직접 바꾸어 가며 해보도록 하고, 여기서 중요한 것은 출력할 메시지를 지정하는 일이다.

액션 텍스트에서 메시지를 클릭하면 아래 그림과 같이 문자열 창이 나타난다. 만약 특정한 어떤 문자열(텍스트)를 나타나게 하고 싶으면 값(A): 항목에 원하는 텍스트를 적어넣으면 되는데, 여기서는 변수를 출력시켜야 하므로 함수(F): 문자열 연결 항목을 이용해야 한다.
여기서 String 1 을 클릭한 다음 값 항목에 죽은 닭의 수: 라고 입력한 다음 [확인]을 누르자. '~닭의 수:' 뒤에 한 칸 띄어쓰기를 해주면 나중에 화면에 출력될 때 더 보기 좋다.
그 다음, String 2 를 클릭하고 함수(F): 항목에서 변환 - 정수를 문자열로 변환을 선택한 다음, 문자열 [ ((트리거를 작동시킨 플레이어)의 번호) ]를 클릭해서 변수 ChickenKilled를 지정하고 [확인]을 누른다.
여기까지 잘 했다면, 액션 텍스트가 아래와 같이 완성될 것이다.
ChickenKilled라는 변수에 저장된 값은 정수형, 즉 수학적인 계산이 가능한 값이다. 그런데 화면에 출력하기 위해서는 정수형태의 값을 문자형태로 변환해야만 한다. 바로 위에서 한 것이 바로 그 작업이다. 프로그래밍을 공부해 본 사람이라면 이미 알고 있겠지만, 사람의 눈에는 똑같아 보여도 숫자와 문자는 데이터의 저장 형태가 다르기 때문에 필요에 따라서 이렇게 변환을 해야만 한다.

예를 들어, 정수 형태로 저장된 '25'라는 수는 수학적 계산을 하는데 활용할 수 있지만, 문자열 형태로 저장된 '25'는 '이십오'가 아니라 '2'라는 글자와 '5'라는 글자가 나란히 있는 것일 뿐이므로 계산을 할 수 없다. 정수값 25에 10을 더하면 결과가 35가 되지만 문자열 25에 10을 더하면 '2510'이 된다. 그리고 이것은 '이천오백십'이 아니라 2, 5, 1, 0 이라는 문자의 나열일 뿐이다.

그러면 이제 지도 시험을 눌러서(Ctrl + F9) 테스트 플레이를 해보자. 트리거가 제대로 설정되었다면 아래 스크린샷처럼 닭이 죽을때마다 메시지가 화면에 표시될 것이다.
▶완성된 예제맵 다운로드: TriggerEX_07done.w3x

 오늘의 핵심 포인트
  • 변수는 데이터를 저장해두는 상자 같은 것이다.
  • 변수의 종류는 저장할 데이터의 형식을 나타낸다 (정수, 실수, 문자열 등)
  • 변수에 어떤 값이 들어있던 상관 없이 변수의 이름만 불러오면 들어있는 데이터를 꺼내 쓸 수 있다
  • 변수를 선언하면 선언된 값으로 바뀐다
  • 화면에 변수를 출력하려면 반드시 문자열로 변환해야 한다 (정수나 실수 형태의 값은 그대로 화면에 출력할 수 없다)

덧글

  • 마제스트 2009/05/31 22:49 # 답글

    오 업데이트 되었군요! 감사히 보겠습니다. 워3가 좋아서가 아니라 스톰님 강좌가 좋아서 보고 있습니다!
  • storm 2009/05/31 22:57 # 답글

    마제스트// 'ㅁ'/
  • gagqt 2009/08/14 11:30 # 삭제 답글

    아 전역 어쩌구 액션이 없어요 ㅜㅜ 액션에서 일반에 들어갔는데
  • storm 2009/08/15 23:03 # 답글

    gagqt// 제가 쓰는 워3하고 뭔가 버전이나 한글화 패지 상태가 다른 것 같습니다. 강좌 2편에 나오는대로 워3를 다시 설치해보세요.
  • ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 2009/08/22 22:26 # 삭제 답글

    님아 설명이 어려워요.. 어떻개 좀 쉽개 쉽개좀 다 하긴 다하는대.. 기억은 안 남을듯..
  • ATree 2009/08/23 16:50 # 삭제 답글

    세심한 부분까지 설명해주시니 강좌에서 친절함이 묻어나는데요!! ^^ 다음강좌도 기대되요~~!
  • ㄷㄷㄷ 2009/09/06 12:21 # 삭제 답글

    헐 왜난 닭이 없지
  • xkzlwm 2010/01/16 03:16 # 삭제 답글

    와우...하기힘드네 ㅋ
    감사합니다..
  • 학생 2010/09/01 16:47 # 삭제 답글

    오오...이런 방식이면 퀘스트를 만들 수 있겟네요.
    음...감사합니다. 많을 것을 배워갑니다..꾸벅(__

    근데 혹시 텍스트를 강조할 수 있는 방법도 있나요? 색깔 같은 걸 변경하면 눈에 띄기 쉬울 것 같은데...
  • 토노 2011/02/13 01:18 # 삭제 답글

    아..갑자기 난이도가 급격하게 상승한것 같네요 ㅋㅋㅋㅋ
    설명도 예전에 나온것은 재끼셔서...살짝 고생 ㅠㅠ

    예전에 한것 구체적인 설명은 아니더라도...조금은...
    (예를들면.. 새 트리거를 만드세요. 라던가..ㅋ)
  • turtle 2011/02/18 21:55 # 삭제 답글

    이 값을 리더보드에 표시할려면 어떻해 해야돼요?
    도저히 할 수가 없어서..ㅜ.ㅜ
    (리더보드 맞죠? 게임 실행할 때 점수 나오는 그것)
  • 우와아 2011/10/20 10:35 # 삭제 답글

    정말 감사드려요 막 시작한 뉴비인데요. 이렇게 상세하고 이해하기 쉽게 써주셔서 ^^
  • The Name 2013/02/15 11:16 # 삭제 답글

    질문 하나만 올릴게요.
    저는 팜을 지으면, 맵상 어디에 있어도 그 갯수를 인식하고 그 갯수만큼 1분에 한번씩 골드가 들어오게 하려고 하는데, 그건 어떻게 활용하면 되나요?
  • storm 2013/02/18 18:15 #

    트리거를 2개로 나누어서 설정해야 할 것 같네요.

    [첫번째 트리거] 팜이 건설될 때 갯수 인식

    이벤트: '특정 플레이어의 유닛이 특정 상태가 되면 작동' 을 지정하신 후에 플레이어 선택(유저)하시고 상태는 건설완료

    조건: '유닛-타입 비교'를 지정하신 후에 '트리거를 작동시킨 유닛 타입 == 팜 으로 설정

    액션: 변수명 = 변수명 + 1 (여기서 쓸 변수명은 미리 만들어놓으셔야 합니다)



  • storm 2013/02/18 18:18 #

    [두번째 트리거] 1분 마다 한 번씩 팜 갯수에 비례해서 골드 지급

    이벤트: '특정 시간마다 작동' - 60초로 설정

    조건: 없어도 됩니다

    액션: '플레이어 자원 추가' 선택하시고 플레이어 지정하신 후에 금 수치를 조정

    예) 팜 1개당 100골드씩 준다면

    함수: 변수명 x 100

    으로 하시면 됩니다.
    변수명은 첫번째 트리거에서 팜 갯수 저장하는 변수를 쓰시면 되구요.
  • The Name 2013/02/20 11:31 # 삭제 답글

    정말 감사합니다. 제대로 써볼게요. 근데, 괜찮으시다면 멀티보드 활용법도 알려주세요. 제가 아무리 손대봐도 멀티보드에 문자가 나타나지를 않네요. 팜 문제는 제가 어떻게든 혼자서 해결을 했는데 말이죠. 머리를 깨지도록 써서요. ㅋ
  • storm 2013/02/22 16:06 #

    활용법 설명은 꽤 긴데 ㅎㅎ
    메일 주소 알려주시면 제가 만들었던 맵 중에 멀티보드 들어간 맵 보내드릴게요.
  • The Name 2013/03/01 10:08 # 삭제 답글

    아 감사합니다.
    제 이메일 주소는 knight9977@naver.com
    입니다. 그럼 기다리고 있을게요 ㅎㅎ
  • The Name 2013/03/13 10:08 # 삭제 답글

    저번에 이 메일 보내실 때 VBA강의를 보내주셨네요. ㅎㅎ
    이번에는 워3 멀티보드 맵을 보내주시면 감사하겠습니다.
    바쁘신 가운데 신경써주셔서 감사합니다.
    수고하세요.
    Knight9977@naver.com
댓글 입력 영역



통계 위젯 (화이트)

333
206
501319