본문 바로가기

스타크래프트2 에디터/ㄴ 고급 강의

[트리거] 간단한 FPS용 이동 / 공격 (WASD 이동, 카메라 이동은 마우스)


※참고로 FPS처럼 캐릭터의 눈으로 보는 것처럼 한 것이 아니라 캐릭터에게 거리를 두고 (즉 3인칭 이동) 조작하는 것입니다.

   문서 시험 시에는 잘 작동하겠으나 배틀넷 접속 후 플레이 할 경우에는 트리거와 서버의 상호 작용 때문에 버튼 누른 후 반응이 느리다는 점 유의해 주세요.

   1.5 패치 이전에 작성된 글이라 약간 다를 수도 있는 점 유의해주세요.


 

먼저 맵에다 캐릭터로 설정할 유닛을 놓고 그 다음 구역을 하나 추가해 주세요. 그 후 구역 크기 설정은 XY 각각 0.25(최솟값)로 해주세요.



그 다음 트리거로 가서 위 그림처럼 [변수] 하나를 만들고 거기에서 유형을 [유닛]으로 설정해 주세요. 그리고 시작값을 만들어 놓은 캐릭터로 설정하세요. 전 해병으로 합니다.


그 다음 트리거 하나를 만들어서

 

이벤트 - [게임] - [지도 초기화] 만들어 주시고요,

 

행동은 여러가지 추가 해야합니다.

먼저

 

[카메라]
  -카메라 마우스 상대 모드 잠금 켜기/끄기
       플레이어: 1 (앞으로 플레이어 1은 자신을 뜻합니다.)
       켜기/끄기: 켜기

 

  -카메라 마우스 회전 켜기/끄기 전환
       플레이어: 1
       켜기/끄기: 켜기

 

  -카메라 경계 설정
       플레이어: 플레이어를 플레이어 그룹으로 변환
           플레이어: 1
       경계: 구역 001 (처음에 만든 구역)
       미니맵: 수행 안 함

  -카메라로 유닛 그룹 따르기
       플레이어: 1
       유닛 그룹: 유닛을 유닛 그룹으로 변환 (처음엔 '마지막으로 만든 유닛'인데 앞과 같이 바꾸어 주세요.)
           유닛: 해병 (앞에 만들었던 변수를 설정해 주세요.)
       따르기: 따르기
       현재 대상 유지: 현재 대상 지우기


[구역]

  -유닛에 구역 부착
       오프셋: XY 지점
           X: 0.0
           Y: 0.0
       유닛: 해병 [28.54, 38.98] (값)
       구역: 구역 001

 

이렇게 하면 카메라가 마우스 움직이는 대로 움직입니다.

 

여기까지 윗 그림 설명이었구요.


그 다음 트리거 하나를 더 만들어서

 

이벤트는

 

[타이머]

  -주기적인 이벤트
       시간 유형: 게임 시간
       지속 시간: 0.0001

 

행동은

 

[카메라]

  -카메라 경계 설정
       플레이어: 플레이어를 플레이어 그룹으로 변환
           플레이어: 1
       경계: 구역 001
       미니맵: 수행 안 함

이러면 카메라가 지속적으로 캐릭터를 쫓아갑니다.




다음은 캐릭터 이동입니다.


 

이벤트

 

[UI]

  -키 누름
       플레이어: 1
       키: W
       아래로: 아래로 (아래로, 위로 가 있는데 아래로는 누른 상태 위로는 누르지 않은 상태를 가리킵니다.)
       Shift: 제외 (제외 허용 요구가 있는데 이건 하시는 분 마음입니다.)
       제어: 제외
       Alt: 제외

행동

 

[일반] - [While 반복문]

을 하면 위와 같이

 

While (조건) 참, do (행동)이 나오는 데요.

 

조건에선

 

[비교]
     값 1: 트리거 켜짐
         트리거: 현재 트리거
     연산자: ==
     값 2: true

행동에선

 

[유닛]

  -지시 전달
       유닛: 해병 [28.54, 38.98]
       지시: 대상 지정한 지점에 지시
           능력 명령:  이동
           대상 지점: 극선 오프셋이 있는 지점
               지점: 유닛의 위치
                   유닛: 해병 [28.54, 38.98]
               각도: 플레이어의 카메라 Z축 회전
                   플레이어: 1
               거리: 0.5
       대기열: 기존 지시 바꾸기

[일반]

  -대기
       시간 유형: 게임 시간
       시간: 0.015

 

이렇게 만들어 주세요.




새 트리거의 이벤트는

 

[UI]

  -키 누름
       플레이어: 아무 플레이어
       키: W
       아래로: 위로 (누르지 않은 상태)
       Shift: 제외
       제어: 제외
       Alt: 제외

행동은

 

[트리거]

  -트리거 정지
       트리거: 앞으로 이동 (방금 전에 만든 트리거의 이름값입니다.)

 

이렇게 하면 W키를 통한 전진이 완성됩니다.

 

다음은 측면 이동인데요. (누를 버튼은 A나 D겠죠.)

 

[유닛]

  -지시 전달
       유닛: 해병 [28.54, 38.98]
       지시: 대상 지정한 지점에 지시
           능력 명령:  이동
           대상 지점: 극선 오프셋이 있는 지점
               지점: 유닛의 위치
                   유닛: 해병 [28.54, 38.98]
               각도: 산술 (실수)
                   값 1: 플레이어의 카메라 Z축 회전
                       플레이어: 1
                   연산자: +
                   값 2: 90.0
               거리: 0.5
       대기열: 기존 지시 바꾸기

굵은 글씨처럼 각도를 산술로 하고 하위 메뉴를 선택해서 위와 같이 하면 좌측이동을 합니다. 우측 이동은  연산자: (-) , 값 2: 90.0 이겠고요.

 

※뒤로 이동은 키 'W'를 키 'S'로 바꿔주시고
지시 전달에서 거리를 '0.5'에서 '-0.5'로 바꿔주시거나 위의 측면 이동처럼 -180도를 해주셔도 됩니다..

 

자 이렇게 하면 이동 트리거는 모두 완성이 되었습니다. ㅎ




다음은 공격 트리거 입니다.

 

공격 트리거는 트리거 하나로 해결됩니다.



 

....... 하나가 좀 복잡할 뿐이죠....

 

일단 이전에 [변수]- 유형 : [유닛] - [캐릭터 유닛] 설정 되어있어야 하고요.

 

이벤트랑 행동은 기본이고 지역변수도 설정해야 합니다.

 

먼저 "이벤트"

 

[UI]

  -마우스 클릭됨
       플레이어: 1
       마우스 버튼: 왼쪽
       아래로: 아래로

다음 "지역 변수"

(좌변은 모두 지역변수의 이름입니다.)

 

  -플레이어 = 0 <유형=정수>
  -대상 지점 = 지점 없음 <유형=지점>
  -대상 원 = 구역 없음 <유형=구역>
  -대상 그룹 = (비어 있는 유닛 그룹) <유형=유닛 그룹>
  -대상 유닛 = 유닛 없음 <유형=유닛>

 

이 정도로 생성만 하시면 됩니다.

 

그 다음..... 복잡한 행동입니다....

FPS이니 만큼 탄약 설정도 하면 좋겠지만 여기서 하면 또 글 넘어 갈까봐 생략합니다... 저도 힘들어요... (탄약을 미네랄, 가스를 남은 탄창의 갯수로 하거나 에너지를 이용해서 하면 될 듯 합니다.)

 

[유닛]

  -유닛이 각도를 향하게 만들기
       유닛: 해병 [28.54, 38.98]
       지속 시간: 0.0
       각도: 플레이어의 카메라 Z축 회전
           플레이어: 1

[일반]

  -For 문 (정수)
       시작: 1
       끝: 15 (플레이어 수가 중립 제외하고 적대 포함하면 15죠.)
       변수: 플레이어 (지역 변수 이름값)
       증가값: 1


그리고 For 문의 하위 행동입니다.

 

[변수]

  -변수 설정
       변수: 대상 지점 (지역 변수 이름값)
       값: 극선 오프셋이 있는 지점
           지점: 유닛의 위치
               유닛: 해병 [28.54, 38.98]
           각도: 플레이어의 카메라 Z축 회전
               플레이어: 1
           거리: 정수를 실수로 변환
               값: 플레이어
  -변수 설정
       변수: 대상 원 (지역 변수 이름값)
       값: 원을 구역으로 변환
           중앙: XY 지점
               X: 지점의 X
                   지점: 대상 지점
               Y: 지점의 Y
                   지점: 대상 지점
            반경: 1.0

  -변수 설정
       변수: 대상 그룹 (지역 변수 이름값)
       값: 조건에 일치하는 구역 내 유닛
           구역: 대상 원 (지역 변수 이름값)
           유닛 필터: 배제됨: 미사일, 소멸됨, 숨김
           플레이어: 15 (적대 플레이어)
           유닛 유형: 아무
           개수: 아무 양

  -변수 설정
       변수: 대상 유닛 (지역 변수 이름값)
       값: 유닛 그룹에서 가져온 무작위 유닛
           그룹: 대상 그룹 (지역 변수 이름값)
           유형: 살아 있음

[일반] - If (조건) then (행동) else (행동)

 

if then else 문의 하위 내용입니다.

 

If

  -[비교]
       값 1: 대상 유닛 (지역 변수 이름값)
       연산자: !=(일치하지 않을 경우) 
       값 2: 유닛 없음

  -[비교]
       값 1: 플레이어가 유닛 볼 수 있음
           플레이어: 1
           유닛: 대상 유닛 (지역 변수 이름값)
       연산자: ==
       값 2: true(참)
 

Then

 

[애니메이션]

  -애니메이션 재생
       대상: 유닛에서 가져온 행위자
           유닛: 해병 [28.54, 38.98]
       애니메이션: 공격
       식별자: 기본
       플래그: 옵션 없음
       혼합 시간: 기본 시간

 

[일반]

  -대기
       시간 유형: 게임 시간
       시간: 0.1

 

[환경]

  -유닛에 효과 만들기 (유닛으로부터)
       시전자: 해병 [28.54, 38.98]
       대상: 대상 유닛 (지역 변수 이름값)
       효과: 해병 - 가우스 소총 (피해)

 

Else

 

If Then Else 조건문

 

If

  -[비교]
       값 1: 플레이어 (지역 변수 이름값)
       연산자: ==
       값 2: 15 (적대 플레이어)

Then

 

[애니메이션]

  -애니메이션 재생
       대상: 유닛에서 가져온 행위자
           유닛: 해병 [28.54, 38.98]
       애니메이션: 공격
       식별자: 기본
       플래그: 옵션 없음
       혼합 시간: 기본 시간

 

[일반]

  -대기
       시간 유형: 게임 시간
       시간: 0.1

[환경]
  -지점에 효과 만들기 (유닛으로부터)
       시전자: 해병 [28.54, 38.98]
       지점: 극선 오프셋이 있는 지점
           지점: 유닛의 위치
               유닛: 해병 [28.54, 38.98]
           각도: 플레이어의 카메라 Z축 회전
               플레이어: 1
           거리: 정수를 실수로 변환
               값: 플레이어 (지역 변수 이름값)
       효과: 해병 - 가우스 소총 (피해)

Else

(없음)

 

이후의 트리거는 온갖 문장에서 밖으로 나와서 생성합니다.

 

[일반]

  -대기
       시간 유형: 게임 시간
       시간: 2.0

[트리거]

  -트리거 켜기/끄기 전환
       트리거: 현재 트리거
       상태: 켜기

[애니메이션]

  -애니메이션 완료 설정
       대상: 유닛에서 가져온 행위자
           유닛: 해병 [28.54, 38.98]
       식별자: 기본
       백분율: 100.0

 

휴 길었네요...

이상으로 트리거 부분은 끝입니다.



 

그 후에 이대로 그냥 해 버리면 적 유닛이 나오면 자동 공격하겠죠?

 

그러니 데이터에서 대상 캐릭터 유닛의 무기 필드에서 [무기 - 옵션] 을 클릭해서 [공격 시작 가능]을 체크 해제 해주시면 됩니다.


그리고 적에게 맞으면 플레이어가 저절로 도망갈텐데 이건 유닛 필드에서 [동작:응답]을 [도피 안 함 획득]으로 바꿔주시면 됩니다.

 

이러면 공격 모두 끝입니다.



그럼, 결과물을 보실까요?? (영상에는 도피 안 함 획득 설정을 안 해서 좀 이상합니다.)