작성자 | 아제라테스 | ||
---|---|---|---|
작성일 | 2019-01-09 20:08:46 KST | 조회 | 3,910 |
제목 |
공허의 유산 캠페인 구조의 공허 포격기 무기 만들기.
|
이번에 알아볼 것은 <공허 포격기의 충전 구조를 가지는 무기 만들기>입니다. 그러나 기본적으로는 공허 포격기의 무기 구조에 대해서 많이 말할 것입니다. 무기의 전체적인 구조를 알 수만 있다면 이를 응용하는 것은 그렇게 어려운 일은 아니니까요! 먼저 들어가기에 앞서서, 공허 포격기의 충전 시각 효과는 상당히 특수한 것으로, 충전 효과를 연출하기 위해서는 모델 자체에 붙어있는 요소에 따라서만 결정됩니다. 공허 포격기의 광선에서 팔레트 스왑만한 이 광선을 봅시다.
협동전 - 피닉스 사령관으로 플레이하면 생산할 수 있는 우주모함 용사 클로라리온이 사용하는 태양 광선 모델에 붙어있는 애니메이션 순서를 보면 Attack xx로 이름이 붙어있습니다. 다른 광선 무기들을 보면 이와같은 Attack N애니메이션이 없는 경우가 많이 있습니다. 하여 이 글의 내용을 똑같이 따라한다고 한들, 모든 광선이 "충전된 효과"를 연출하는 것은 아닙니다. 예를 들어서 알라라크 영웅이 사용하는 대공무기를 보면
이와같이 생성-서기-죽음-전역서기 같이 일부만을 갖고 있습니다(다른 광선들은 이것도 없는 경우가 많습니다) 그러므로 다양한 광선들의 충전 효과를 연출하고싶다면 행위자 항목에서 광선 모델에 적합하게 애니메이션 재생 효과에서 속성을 잘 잡아줘야만합니다. 광선 모델이 갖고있는 애니메이션 순서의 문제로 인하여 임의의 광선에 대해서 모두 충전 효과를 재생하는 행위자는 존재하지 않거니와 모든 광선을 가지고 충전 효과를 재생할 수도 없습니다.
이 충전 공격을 구현하기 위해서 필요한 광선은 1) 새로운 2개의 행위자로 정의해야하며 2) 광선 무기로 생성되는 무기의 소리는 유닛 자체에서 행위자 이벤트를 통하고 3)지속효과를 생성하여 공격자 자체에 동작을 계속 중첩하여 동작의 중첩수로 피해량을 전환하고, 그에 맞춰서 광선도 전환하는 구조를 갖고 있습니다.
이 세 가지 요소가 모두 종합되어있는 것이며, 어느 것 하나 분리될 수 없습니다. 그러나 걱정할 것은 없습니다. 어렵지 않습니다. 앞으로 서술할 공허 포격기의 이 공격 구조는 자유의 날개 공격 구조와는 본질적으로 다르며 그렇기때문에 대상을 초기화해도 충전이 유지되고 최대 충전까지 쉽게 도달할 수 있습니다.
당연한 이야기지만 본 게시글에 사용된 효과명을 똑같이 따라갈 필요는 없습니다. 제가 편한 스타일대로 효과명을 지정한 것이기때문에, 실제로 만져볼 때에는 자신에게 편한 이름으로 지정해주세요. 다만 효과명은 일관적이어야만 사후관리가 쉽습니다.
1. 효과와 동작, 유효성 검사기 구조 파악
먼저 알아볼 것은 행위자를 배제하고 이 효과가 실제로 재생되기위해서 필요한 알고리즘입니다. 물론 공허의 유산 캠페인 의존관계 혹은 협동전 의존관계등을 보아도 돼겠습니다만, 이들은 가독성 좋게 만들어져있는 것이 아니라서 가지를 쳐내는 것이 꽤 괴롭습니다. 여기서는 제가 따로 만들은 것을 베이스로 보겠습니다.
무기의 효과에 이어줄 것으로 가장 먼저 만들어야할 것은 지속효과 생성입니다. 효과는 아래와 같이 구성하면 됍니다.
1)주기 지속 시간
이 부분이 광선 무기의 실질적인 공격 주기를 결정합니다. 광선 '무기'의 공격 주기가 아무리 줄어들어도 이 지속 효과의 주기 지속 시간을 같이 줄여주지 않으면 표기와 실재의 동기화가 이루어지지 않게 되므로 주의해야합니다.
2)주기효과 및 효과-최초
일반적인 경우에 대해서 두 개의 항목은 같은 효과를 공유합니다. 그러나 우주모함 - 클로라리온의 태양광선은 요격기 사출도 겸해야하기때문에 아래와 같이 다르게 잡혀있습니다.
매 주기마다 발생하는 VoidRayAdvancedChargeBeamImpactSet은 아래와 같은 효과 묶음으로 되어있습니다. 효과 항목을 <모음>으로 만들어주세요.
효과항목은
1번)VoidRayDamageInitialDummy (적에게 피해 알림용 더미 피해)
2번)VoidRayAdvancedChargeBeamDamageSwitch (동작의 중첩 수에 따른 피해 효과 전환)
3번)VoidRayCasterAB (매 공격마다 공허 포격기 자신에게 동작을 중첩하여 피해 효과를 바꿔주기 위한 장치)
로 구성되어있습니다. 1번 항목은 PrismaticBeamMUInitial 과 같은 것이기때문에 넘어가겠고, 2번 항목을 보기 전에 3번 항목부터 먼저 보도록 하겠습니다. 3번 항목은 동작 적용으로 만들고, 아래와 같이 정의하면 됍니다.
그리고 동작 그 자체는 이렇게 만들어져있습니다.
유효성 검사기는 신경쓰지 않아도 좋습니다. 최초 효과인 VoidRayAdvancedChargeBeamInitialCP 항목과 합쳐서 보면 "공허 포격기가 공격을 맞추면 공허 포격기에 VoidRayCasterAB라는 동작이 걸리고, 이것을 최대 30번까지 중첩한다"가 됩니다. 이 부분이 핵심입니다. 그리고 강화 효과 플래그에서 중첩 다시 고침을 반드시 체크해야만합니다 그렇지 않으면 아무리 공격해도 정상적으로 공격력과 광선이 갱신되지 않게 되버립니다. 그리고 이 동작에서 보면 새로 고침 효과에 VoidRayAdavancedChargeBeamCounterCheck라는 효과가 있습니다. 이 효과는 2번 항목의 VoidRayAdvancedChargeBeamDamageSwitch효과와 연동됩니다.
일단 상대적으로 간단한 DamageSwitch 항목 (모음의 3번째 효과) 부터 보겠습니다. 효과 항목을 전환으로 만들어주세요.
전환 효과는 반드시 유효성 검사기를 동반해야만 각 효과를 상호배타적으로(Mutually exclusively)만들 수 있습니다. 그리고 그 유효성 검사기의 항목은 VoidRayCasterABPhase<1 OR 2Ready OR 3Low>로 잡혀있습니다. 이름에서 봐도 딱 알 수 있듯이, 이것은 앞서 본 VoidRayCasterAB에 관련되어있습니다. 사례전환으로 나오는 피해량은 너무 뻔한 것이니 굳이 따로 더 보지는 않겠습니다.
그리고 CounterCheck를 보겠습니다. 이 효과도 역시 전환으로 만들어주세요.
이 전환 효과에도 위와 같은 유효성 검사기가 사용되고 있음을 볼 수 있습니다. 그런데 중요한게 있습니다, 위의 피해 전환 효과에는 <VoidRayCasterABPhase1>이라는 유효성 검사기가 있는데 아래의 중첩 체크에는 이 부분이 없습니다. 사실 피해전환에서 Phase1에 대해서 피해 1을 재생하지 않고, (기본) 기본 효과로 피해 1을 줘도 됩니다. Phase1은 광선 공격 효과를 제어하는 데에 사용됩니다.
이제 남은 것은 Phase2AB, Phase3Set 뿐인데, 이들을 알아보기 전에 먼저 유효성검사기부터 보겠습니다. 유효성 검사기 항목을 유닛 비교 동작 개수로 만들어주세요. VoidRayCasterAB라는 동작의 갯수가 몇 개인가?를 따지는 것입니다. 공허 포격기의 충전 공격은 1단계)초기 충전 없음 -> 2단계) 중간 단계 강화됨 -> 3단계) 최종 강화됨 이 구분으로 나뉘어져있고, 동작의 갯수로 분할한다면 세 개의 Inequality를 가지면 됩니다. 즉 동작의 갯수를 n(VoidRayCasterAB)로 정의하고 A 와 B는 A<B관계를 만족하는 적당한 양의 정수라고 한다면
1단계 : n(VoidRayCasterAB) < A
2단계 : A≤n(VoidRayCasterAB)<B
3단계 : B≤n(VoidRayCasterAB)
로 짜면 됍니다. 동작의 갯수는 반드시 양의 정수로 잡혀있기때문에 1단계는 0부터 A-1개까지이므로 A-1-0+1=A개이고 2단계는 B-1-A+1=B-A개, 3단계는 B개로 부등식이 완전히 Mutually Exclusive합니다.
그리고 2단계는 A≤n(VoidRayCasterAB) && n(VoidRayCasterAB)<B 라는 두 개의 부등식을 결합한 것입니다. 그렇기때문에 유닛 비교 동작 개수로 정의되는 유효성 검사기는 4개를 만들어야하고, 결합으로 정의되는 유효성 검사기를 하나 만들어야합니다.
1단계 부등식
2단계 부등식
3단계 부등식
그리고 충전 공격의 시간 길이를 조절하는 부분이 바로 이 지점입니다. 광선 공격의 주기가 0.5초이고 충전 단계가 넘어가기 위한 갯수가 12와 24이기때문에 한 번 충전하려면 6초 최대 충전하려면 12초가 걸립니다. 캠페인에서는 9-18로 잡혀있기때문에 몇 초 걸리지 않고 금방 충전됩니다. 캠페인 의존관계를 들여다보면 VoidRayCasterABPhase3Low가 아니라 Phase3Ready로 잡혀있는데, 논리적으로 볼 때 최대 충전 단계 이상의 충전은 더이상 존재하지 않기때문에 3Low로 해도 아무런 문제가 없습니다. 그저 행위자 데이터를 수정할 때의 일관성의 문제일 뿐입니다.
이제 CounterCheck 항목만 따라가면, 효과 알고리즘은 다 끝납니다.
VoidRayAdvancedChargeBeamPhase2AB는 동작 적용 효과이고 다음과 같습니다.
이 동작 효과는 광선의 굵기와 공격 효과음, 그리고 공허 포격기의 무기에 추가되는 충전 광선에 관여합니다.
VoidRayAdvancedChageBeamPhase3Set은 모음 효과이고 아래 두 개의 효과를 내포합니다.
Phase2 동작이 제거되어야지만 완전히 충전된 광선과 효과음을 재생할 수 있기때문에 (행위자 제어의 문제가 큽니다) Phase3Set은 Phase2동작을 제거하고 그 다음에 Phase3동작을 적용하도록 구성되어있습니다.
Phase 2, 3과 VoidRayCaster는 모두 같은 지속 시간을 가지도록 일관성있게 만져줘야만합니다. 그렇지 않으면 광선 공격과 피해량간의 불일치가 일어날 수 밖에 없습니다.
이것으로 효과 알고리즘 자체는 다 보았습니다. 글로 써서 설명이 길어졌을 뿐, 실제로 이 전체를 다 만들고 효과를 이어보면 그다지 길지도, 또 복잡하지도 않습니다. 이제 행위자를 살펴봅시다.
2. 행위자 구조 파악
공허 포격기의 광선 공격에 대해서, 시각 및 청각 효과는 다음과 같은 부분들이 있습니다
1)무기에서 발사되는 광선
2)공허 포격기의 포신에 붙는 추가 광선
3)공격 효과음 및 무기 애니메이션 제어
하나하나 만만한 것은 아니지만, 그래도 천천히 들여다보면 전혀 이해할 수 없는 것도 아닙니다. 먼저 1)무기에서 발사되는 광선 부터 보겠습니다. 여기에는 2개의 새로운 행위자가 필요합니다. 모든 공격은 반드시 <행동>이라는 행위자로 정의되어야만하고, 그렇기에 공허 포격기의 광선 공격도 예외가 될 수는 없습니다.
1)무기에서 발사되는 광선
먼저 행동 행위자를 만들어서 부모는 일반 공격 기본, 장식물 아님 유형으로 선택해서 만들어주세요.
이 행위자의 이벤트를 XML구문으로 나타내면 아래와 같습니다 (verbatim은 빼고 보면 됍니다)
\begin{verbatim}
<CActorAction id="VoidRayAdvancedAttack" parent="GenericAttackBase">
<On Terms="Effect.VoidRayAdvancedChargeBeamInitialCP.Start; At Caster" Send="Create"/>
<On Terms="Effect.VoidRayDamageInitialDummy.Start; FromEffectTreeDescendant" Send="ActionDamage"/>
<On Terms="Effect.VoidRayAdvancedChargeBeamInitialCP.Stop" Send="Destroy"/>
<Beam value="VoidRayAttackBeam2"/>
<LaunchAttachQuery Methods="Weapon 1"/>
<ImpactSiteOps Ops="SOpAttachHarness SOpAttachVolumeNoVizEnhance SOpForwardLaunchGuide"/>
<ActionFlags index="AlignedImpactsAndDamages" value="1"/>
<ActionFlags index="LaunchForceSite" value="1"/>
<Lifetime value="-1.000000"/>
</CActorAction>
\end{verbatim}
먼저 광선의 시작과 끝에는 반드시 광선 최초 효과인 VoidRayAdvancedChargeBeamInitialCP가 있기때문에 여기서 광선 행위자를 만들고(Send=Create) 끝나면 파괴하는(Send=Destroy)항목이 있습니다. 그리고 피해 알림 효과 더미에 불과했던 Dummy 데미지가 여기서 FromEffectTreeDescendant로 구성됩니다. 충격 자리 연산을 보면 음량/시각 효과 향상이 없는데, 이는 공허 포격기가 자체적으로 광선과 효과음을 변경하기때문입니다.
그리고 발사 부착 질의를 보면 무기 1로 지정하고, 대체할 수 없는 경우 중앙을 따르게 되는데, 공허 포격기의 무기 1 지점은 다음과 같습니다.
바로 공허 포격기의 수정이 보이는 이 지점입니다. 여기가 Weapon 01로 지정되어있습니다. 따라서 이 설정에 의하여 공허 포격기의 광선 공격은 분광 핵으로부터 시작됩니다. 그러므로 다른 무기에도 광선 공격의 시작점을 잘 잡아주려면 무기의 부착 지점이 어떻게 되어있는지 주의깊게 살펴봐야합니다. 이밖의 설정도 잘 따라가면 됍니다.
마지막으로 이 행동으로 사용할 광선은 광선 모델을 바로 지정하면 안됍니다. 광선 항목에서 "행위자"로 따로 지정해줘야지만 광선이 정상적으로 생기고 파괴됩니다. 만약 행동 항목의 광선 항목에서 바로 광선을 지정하면 이렇게 됩니다.
정말 끔찍하군요.
이제 광선 행위자를 만듭시다. 광선(단순)을 선택하여 부모는 광선 단순 애니메이션 양식 연속으로, 그리고 장식물 아님 체크를 해줍시다. 그리하여 아래와 같이 만듭시다.
여기서 다만 별칭 항목과, 이벤트 3,13, 14 항목은 필요 없습니다. 저게 없어도 광선은 알아서 잘 충전됩니다. (캠페인 데이터에는 저 Signal이 있긴 한데, 무엇을 제어하기 위해서 넣은 것인지 도저히 모르겠습니다) 따라서 저 항목을 빼고 XML구문으로 나타내면 다음과 같습니다. (이것도 verbatim은 빼고 보면 됍니다)
\begin{verbatim}
<CActorBeamSimple id="VoidRayAttackBeam2" parent="BeamSimpleAnimationStyleContinuous">
<On Terms="ActorCreation; ValidateEffect VoidRayCasterABPhase1" Send="AnimPlay Attack Attack,02 PlayForever"/>
<On Terms="ActorCreation; ValidateEffect VoidRayCasterABPhase2Ready" Send="AnimPlay Attack Attack,04 PlayForever"/>
<On Terms="ActorCreation; ValidateEffect VoidRayCasterABPhase3Low" Send="AnimPlay Attack Attack,06 PlayForever"/>
<On Terms="Effect.VoidRayAdvancedChargeBeamPhase2AB.Start" Send="AnimPlay Attack Attack,04 PlayForever"/>
<On Terms="Effect.VoidRayAdvancedChargeBeamPhase3AB.Start" Send="AnimPlay Attack Attack,06 PlayForever"/>
<On Terms="ActorOrphan" Send="Destroy"/>
<On Terms="Effect.VoidRayAdvancedChargeBeamInitialCP.Stop; At Effect" Send="TimerSet 0.125000 DelayDestroy"/>
<On Terms="TimerExpired; TimerName DelayDestroy" Send="Destroy"/>
<On Terms="Effect.VoidRayAdvancedChargeBeamInitialCP.Stop; At Effect" Send="AnimBracketStop BSD"/>
<Model value="VoidRayAttackBeam"/>
<Supporter Subject="_Unit" Scope="Caster" Actor="Find"/>
<Host Subject="_Unit" Scope="Caster" Actor="Find"/>
</CActorBeamSimple>
\end{verbatim}
이 광선(단순)행위자에서 광선 모델을 지정해줘야만합니다. 먼저 이벤트 4,5,6의 의미는 다음과 같습니다.
:: 효과를 검증하라. VoidRayCasterAB값이 12보다 작으면( == Phase1) 광선 애니메이션을 공격-변형 02 재생 무한반복으로 재생하라.
:: 효과를 검증하라. VoidRayCasterAB값이 12에서 24안에 있으면( == Phase2Ready) 광선 애니메이션을 공격-변형 04 재생 무한반복으로 재생하라.
:: 효과를 검증하라. VoidRayCasterAB값이 24보다 크면( ==Phase3Low) 광선 애니메이션을 공격-변형 06 재생 무한반복으로 재생하라.
그리고 동작이 바로 적용되는 순간에도 광선 애니메이션은 변형되어야하기때문에 이벤트 7,8이 있습니다. 이를 해석하면
:: 효과 VoidRayAdvancedChargeBeamPhase2AB가 시작되면 광선 애니메이션을 공격 -변형 04 재생 무한반복으로 재생하라.
:: 효과 VoidRayAdvancedChargeBeamPhase3Set이 시작되면 광선 애니메이션을 공격-변형 06 재생 무한반복으로 재생하라.
이벤트 9부터 12는 광선 공격을 정지했을 때 광선을 파괴하는 데에 사용됩니다. 9 ActorOrphan-Destroy는 행위자의 연결이 더이상 없으면, 이 행위자를 파괴하라는 메시지이고 10부터 12는 다음과 같습니다
10 :: 효과 VoidRayAdvancedChargeBeamInitialCP가 정지되면, DelayDestroy라는 타이머를 만들고 지속시간을 0.125초로 하라
11 :: DelayDestroy라는 타이머가 만료되었다면 이 행위자를 파괴하라.
12 :: 효과 VoidRayAdvancedChargeBeamInitialCP가 정지되면, 행위자가 생성될 때 애니메이션 묶음 시작으로 생성된 BSD(Birth-Stand-Death, 생성-서기-소멸) 애니메이션 묶음을 정지하라.
이제 남은 호스트와 호스트 지원자까지 이어주면 광선 연출의 문제는 다 끝났습니다. 여기까지만 보면 충전으로 강화되는 광선 무기에 대한 일반론적인 부분은 사실상 끝납니다. 이제 다음 문제로 넘어가서 공허 포격기에 관련된 나머지 데이터를 봅시다.
2)공허 포격기의 포신에 붙는 추가 광선
공허 포격기에 분광 정렬 능력을 사용하면 광선 세 줄기가 포신에 붙는 것을 볼 수 있습니다. 이 부분을 만들려고합니다. 다행스럽게도, 이것에 대해서는 이미 정의된 데이터가 있기때문에 이를 재활용하는 것만으로도 충분합니다!
공허의 유산 멀티 기준 의존관계로 VoidRayEnhancementAddition 을 검색하면 3가지 항목이 나옵니다. 01,02,03이 있는데 다음과 같이 똑같이 따라하면 됍니다.
공허 포격기가 공격을 개시하면 가장 먼저 획득하는 동작은 VoidRayCasterAB입니다. 첫 번째 광선 기지죠. 그렇기때문에 이 동작에 대해서 광선 기지가 생기도록 만들어야합니다.
\begin{verbatim}
<On Terms="Behavior.VoidRayCasterAB.On" Send="Create"/>
<On Terms="Behavior.VoidRayCasterAB.Off" Send="AnimBracketStop BSD"/>
\end{verbatim}
두 번째 광선 기지는 2단계 충전 또는 3단계 충전에서 생겨야만합니다. 그리고 위의 데이터 구조에서 보았듯이 3단계 충전 단계가 적용되면 2단계 충전 동작은 제거됩니다. 그래서 두 번째 광선 기지는 두 개의 동작에 대해서 정의되어야만합니다. 2단계건 3단계건 VoidRayCasterAB 동작은 여전히 공허 포격기가 갖고있기때문에 결과적으로 2단계 충전 상태일 때 공허 포격기는 2개의 광선 기지를 가지게 됩니다.
\begin{verbatim}
<On Terms="Behavior.VoidRayChargeBeamPhase2.On" Send="Create"/>
<On Terms="Behavior.VoidRayChargeBeamPhase2.Off" Send="AnimBracketStop BSD"/>
<On Terms="Behavior.VoidRayChargeBeamPhase3.On" Send="Create"/>
<On Terms="Behavior.VoidRayChargeBeamPhase3.Off" Send="AnimBracketStop BSD"/>
\end{verbatim}
마지막 광선 기지는 오직 3단계 충전 단계에서 가지기만 하면 충분합니다. 따라서 3단계 충전 동작에 대해서만 정의됩니다. 그러면 1단계 충전 기지는 VoidRayCasterAB가 가져오고, 2단계 충전 기지는 Phase2를 지우고 Phase3을 갖고 있을 때 또 가져오고, 3단계 충전 기지는 이 행위자에서 가져오므로, Phase3 동작을 가지면 3 개의 광선 충전 기지를 가지게 됩니다.
\begin{verbatim}
<On Terms="Behavior.VoidRayChargeBeamPhase3.On" Send="Create"/>
<On Terms="Behavior.VoidRayChargeBeamPhase3.Off" Send="AnimBracketStop BSD"/>
\end{verbatim}
호스트 자리 연산을 보면 <자리 연산 부착 무기 03 05 07>을 갖고 있는데, 다시 공허 포격기의 모델을 컷신 편집기로 찾아보면
무기 03번은 공허 포격기의 중심으로부터 오른쪽으로 나와있으며
무기 05번은 왼쪽
그리고 무기 07번은 위로 나와있습니다. 이를 이용하여 광선 충전 기지를 부착하는 것입니다. 광선 충전 기지를 구현하고싶다면, 역시나 사용하려는 유닛 모델의 부착 지점을 주의깊게 잘 살펴봐야함을 알 수 있습니다. 그리하여 성공적으로 구현되는 광선 공격은 아래의 스크린샷 처럼 이루어지게 됩니다.
여기서 하나 빼놓은 것이 있습니다! 바로 공허 포격기가 공격을 시작하면 몸체와 분광 핵 중앙에 생성되는 광선인데, 이것은 유닛 행위자에서 제어합니다. 이 행위자는 VoidRayCenterBeam 으로 검색하면 찾을 수 있습니다. 이 부분은 마지막 항목에서 몇 줄 추가하면 돼는 것이므로 거기서 다루겠습니다.
3)공격 효과음 및 무기 애니메이션 제어
이제 이것만 하면 됍니다. 다 왔습니다! 공허 포격기의 유닛 행위자는 정말 끔찍할 정도로 스파게티 코드라는 말밖에 할 수 없습니다. 왜냐하면 공허 포격기는 자유의 날개 시절의 무기 구조와 군단의 심장의 무기 구조를 모두 다 간직하고 있고 이제 우리는 이 래더 데이터에 캠페인 데이터를 집어넣을 것이기 때문입니다. 물론 캠페인 데이터라고 깨끗한 것은 아닙니다. 오히려 더 헷갈리게 만들어놨습니다. 정말 이 부분이 많이 헷갈립니다. 공격 효과음 제어는 사실 굉장히 간단한 것이기때문에 그닥 문제되는 것은 없습니다만, 문제는 공허 포격기가 공격을 시작하여 충전 단계에 돌입하면 위 스크린샷처럼 포신을 벌린 상태로 계속 남아있어야하기때문입니다. 이것을 제어하는 원리를 파악하는 것이, 처음에는 그닥 쉽지 않았습니다.
일단은 상대적으로 쉬운 공격 효과음부터 보겠습니다. 공허 포격기로 가서 유닛 자체의 행위자를 다음과 같이 정의합니다.
이것만 봐서는 뭐가 뭔지 알 수 없습니다! 침착하게, 공격 효과음 제어에 해당하는 부분만 XML 구문으로 보면 아래와 같습니다.
\begin{verbatim}
<On Terms="Effect.VoidRayAdvancedChargeBeamInitialCP.Start; ValidateUnit VoidRayCasterABPhase1" Send="Create VoidRaySound1"/>
<On Terms="Effect.VoidRayAdvancedChargeBeamInitialCP.Stop" Target="VoidRaySound1" Send="Destroy"/>
<On Terms="Effect.VoidRayAdvancedChargeBeamInitialCP.Start; ValidateUnit VoidRayCasterABPhase2Ready" Send="Create VoidRaySound2"/>
<On Terms="Effect.VoidRayAdvancedChargeBeamInitialCP.Stop" Target="VoidRaySound2" Send="Destroy"/>
<On Terms="Effect.VoidRayAdvancedChargeBeamInitialCP.Start; ValidateUnit VoidRayCasterABPhase3Low" Send="Create VoidRaySound3"/>
<On Terms="Effect.VoidRayAdvancedChargeBeamInitialCP.Stop" Target="VoidRaySound3" Send="Destroy"/>
<On Terms="Behavior.VoidRayChargeBeamPhase2.On" Target="VoidRaySound1" Send="Destroy"/>
<On Terms="Behavior.VoidRayChargeBeamPhase2.On; IsStatus WeaponAttacking 1" Send="Create VoidRaySound2"/>
<On Terms="Behavior.VoidRayChargeBeamPhase3.On" Target="VoidRaySound2" Send="Destroy"/>
<On Terms="Behavior.VoidRayChargeBeamPhase3.On; IsStatus WeaponAttacking 1" Send="Create VoidRaySound3"/>
\end{verbatim}
이제 XML 구문 각 줄을 해석해봅시다.
<On Terms="Effect.VoidRayAdvancedChargeBeamInitialCP.Start; ValidateUnit VoidRayCasterABPhase1" Send="Create VoidRaySound1"/>
:: 무기 지속 효과를 시작하고 VoidRayCasterAB 동작의 갯수가 12개 이하가 참이라면 공허 포격기 공격 소리 1을 재생하라
<On Terms="Effect.VoidRayAdvancedChargeBeamInitialCP.Stop" Target="VoidRaySound1" Send="Destroy"/>
:: 무기 지속 효과가 정지하였다면 공허 포격기 공격 소리 1을 파괴하라.
<On Terms="Effect.VoidRayAdvancedChargeBeamInitialCP.Start; ValidateUnit VoidRayCasterABPhase2Ready" Send="Create VoidRaySound2"/>
::무기 지속 효과가 시작하고 VoidRayCasterAB 동작의 갯수가 12개 이상에서 24개 이하가 참이라면 공허 포격기 공격 소리 2를 재생하라
<On Terms="Effect.VoidRayAdvancedChargeBeamInitialCP.Stop" Target="VoidRaySound2" Send="Destroy"/>
::무기 지속 효과가 정지하였다면 공허 포격기 공격 소리 2를 파괴하라.
<On Terms="Effect.VoidRayAdvancedChargeBeamInitialCP.Start; ValidateUnit VoidRayCasterABPhase3Low" Send="Create VoidRaySound3"/>
:: 무기 지속 효과를 시작하고 VoidRayCasterAB 동작의 갯수가 24개 이상이 참이라면 공허 포격기 공격 소리 3을 재생하라
<On Terms="Effect.VoidRayAdvancedChargeBeamInitialCP.Stop" Target="VoidRaySound3" Send="Destroy"/>
:: 무기 지속 효과가 정지하였다면 공허 포격기 공격 소리 3을 파괴하라.
<On Terms="Behavior.VoidRayChargeBeamPhase2.On" Target="VoidRaySound1" Send="Destroy"/>
::Phase2 동작을 이 유닛이 가지고 있다면 공허 포격기 공격 소리 1을 파괴하라
<On Terms="Behavior.VoidRayChargeBeamPhase2.On; IsStatus WeaponAttacking 1" Send="Create VoidRaySound2"/>
:: Phase2 동작을 가지고 있고 상태가 WeaponAttacking 1이라면 공허 포격기 공격 소리 2를 재생하라.
<On Terms="Behavior.VoidRayChargeBeamPhase3.On" Target="VoidRaySound2" Send="Destroy"/>
:: Phase3 동작을 이 유닛이 가지고 있다면 공허 포격기 공격 소리 2를 파괴하라.
<On Terms="Behavior.VoidRayChargeBeamPhase3.On; IsStatus WeaponAttacking 1" Send="Create VoidRaySound3"/>
::Phase3 동작을 가지고 있고 상태가 WeaponAttacking 1이라면 공허 포격기 공격 소리 3을 재생하라.
주의 :: 행위자에서 "파괴" 처리는 별다른 대상을 지정하지 않는다면 그 행위자 자체를 파괴해버립니다. 그리고 파괴의 대상은 값을 입력해도 "만들기"와는 다르게 무엇을 지정하는지 표시하지 않습니다. 이 부분에서 함정에 빠지기 굉장히 쉽습니다. GUI로 직접 다루는 경우 이렇게 만져줘야만합니다.
그렇지 않으면 잘만 공격하다가 갑자기 유닛이 깡그리 사라져버립니다.
그런데 여기서 갑자기 WeaponAttacking 이라는 "상태"가 등장합니다. 이 부분이 공허 포격기의 포신을 제어하는 부분입니다. 포신의 제어는 애니메이션 묶음 재생으로 이루어지고, 그 미묘한 부분을 제어해주는 변수가 바로 StatusSet으로 시작하는 "상태"입니다.
공허 포격기는 유닛 행위자 안에서 다음 3 개의 Status를 가집니다.
먼저 앞선 3개의 ActorCreation (행위자 생성) 항목은, 이 유닛이 생성되었을 때 동시에 WeaponAnim, WeapinAttacking, WeaponEnhanced 라는 "상태 변수"를 만들고, 그 초기값을 0으로 지정한다는 의미입니다.
그리하여 무기를 사용했을 때(WeaponStart.*.AttackStart) 조건을 검사하여 상태가 WeaponAnim 0 이라면(IsStatus WeaponAnim 0) 애니메이션 묶음을 시작하여 그 이름을 Powered로 정의하고
이와 같은 형태로 재생한다는 의미입니다. 이 지점이 바로, 공허 포격기가 공격을 시작하면 포신을 활짝 여는 부분입니다.
그리고 그 밖의 항목들은 무기를 시작하면 WeaponAnim, Attacking, Enhanced 항목의 값 0을 1로 수정하고, 멈추면 다시 0으로 초기화한다는 내용입니다.
무기 애니메이션 제어에 관련된 Status를 알았으니 이제 남은 항목들의 XML구문을 보고 해석합시다.
\begin{verbatim}
<On Terms="Behavior.VoidRayCasterAB.On; IsStatus WeaponAnim 0" Send="AnimBracketStart Powered Attack Stand,Channel Attack,End"/>
<On Terms="Behavior.VoidRayCasterAB.On" Send="StatusSet WeaponEnhanced 1"/>
<On Terms="Behavior.VoidRayCasterAB.Off" Send="StatusSet WeaponEnhanced 0"/>
<On Terms="Behavior.VoidRayCasterAB.Off; IsStatus WeaponAttacking 0" Send="AnimBracketStop Powered"/>
<On Terms="Behavior.VoidRayCasterAB.Off; IsStatus WeaponAttacking 0" Send="StatusSet WeaponAnim 0"/>
<On Terms="Effect.VoidRayAdvancedChargeBeamInitialCP.Start" Send="Create VoidRayCenterBeam"/>
\end{verbatim}
<On Terms="Behavior.VoidRayCasterAB.On; IsStatus WeaponAnim 0" Send="AnimBracketStart Powered Attack Stand,Channel Attack,End"/>
:: 공허 포격기가 VoidRayCasterAB 동작을 가지고 있고, Status가 WeaponAnim 0을 만족한다면 Powered라는 이름으로 정의된 애니메이션 묶음을 시작하라. 내용은 공격/서기-집중/공격-끝이다.
<On Terms="Behavior.VoidRayCasterAB.On" Send="StatusSet WeaponEnhanced 1"/>
::공허 포격기가 VoidRayCasterAB 동작을 가지고 있다면 WeaponEnhanced Status의 값을 1로 정의하라.
<On Terms="Behavior.VoidRayCasterAB.Off" Send="StatusSet WeaponEnhanced 0"/>
::공허 포격기가 VoidRayCasterAB 동작을 갖고있지 않다면 WeaponEnhanced Status 값을 0으로 정의하라.
<On Terms="Behavior.VoidRayCasterAB.Off; IsStatus WeaponAttacking 0" Send="AnimBracketStop Powered"/>
::공허 포격기가 VoidRayCasterAB 동작을 갖고있지 않고 WeaponAttacking Status가 0이라면 Powered로 정의된 애니메이션 묶음을 정지하라.
<On Terms="Effect.VoidRayAdvancedChargeBeamInitialCP.Start" Send="Create VoidRayCenterBeam"/>
:: 무기 지속 효과가 시작되었다면 공허 포격기 중앙 광선을 만들어라. (몸체와 분광 핵 사이의 광선)
이러한 제어 구문을 추가하는 것으로 공허 포격기의 포신이 제어됩니다. 사실 일부는 굳이 정의하지 않아도 괜찮은 것 같습니다. WeaponEnhanced는 군단의 심장에 넘어오면서 "분광 정렬" 능력에 대해서 공격 효과음을 제어하기 위해서 추가된 Status로 보이기 때문입니다.
그래서 실제적인 흐름을 보면 다음과 같습니다.
1) 공허 포격기가 무기를 사용함. 이 때 WeaponAnim의 값은 0인데 공격을 시작하면 WeaponAnim의 값이 1로 증가하게되고, 또 공허 포격기가 VoidRayCasterAB 동작을 획득한다. 그러므로 Powered로 정의된 애니메이션 묶음을 시작하여 포신을 여는 애니메이션을 취한다. (또한 상기의 WeaponStart로도 열린다) 그리고 VoidRayCasterAB는 5초동안 지속되기때문에, 지속시간동안 포신은 닫히지 않는다.
2)공허 포격기가 무기를 사용하면 Weapon Attacking의 값이 1로 정의되고 정지하면 0으로 정의된다. 공허 포격기가 공격을 정지하여 WeaponAttacking 0인 상태에서 VoidRayCasterAB의 지속시간이 만료되어 사라지면 Powered로 정의된 애니메이션 묶음을 정지하고, 포신을 닫는다.
3)VoidRayCasterAB 동작이 더이상 없고 WeaponAttacking의 값이 0이면 WeaponAnim의 값을 0으로 정의한다. (이걸로 다시 포신을 개방하는 것이 가능)
상당히 난잡하고 참조가 여러번 일어납니다만, 어쨌든 정상적으로 동작하기때문에 이대로 내버려두어도 괜찮을 것 같습니다. 이것으로 공허의 유산 캠페인 구조를 가지는 공허 포격기의 전체적인 구조를 살펴보았습니다.
© PlayXP Inc. All Rights Reserved.