# 액션시퀀스 제작하기

## 개요

액션시퀀스를 생성하고 트랙을 구성하여 연출을 완성한 뒤, 실행을 통해 결과를 확인하는 전체 제작 과정을 단계적으로 설명합니다.

본 문서에서는 액션시퀀스를 직접 제작하며, 기본적인 제작 흐름과 사용 방법을 익힐 수 있습니다.

## 3단 히트 액션

### 학습 효과

<figure><img src="/files/gYOpU0JSr2E70aY6F7T5" alt=""><figcaption></figcaption></figure>

이 튜토리얼을 완료하면 다음과 같은 구성을 만들 수 있습니다.

* 1단, 2단, 3단으로 이어지는 연속 공격 애니메이션 구성
* 각 타격 타이밍에 맞는 충돌 판정과 스크립트를 통한 데미지 처리
* 타격 시점에 맞춰 재생되는 히트 이펙트
* 3단 히트 구간에서 카메라 쉐이크 적용
* 3단 히트 진행 중 플레이어 조작 비활성화 처리
* 버튼 입력으로 액션시퀀스 실행

### 사용 에셋 목록

<table><thead><tr><th width="140.9998779296875">에셋 타입</th><th width="229">에셋 Id</th><th>설명</th></tr></thead><tbody><tr><td>애니메이션</td><td>ovdrassetid://18169100</td><td>1단 히트</td></tr><tr><td>애니메이션</td><td>ovdrassetid://18171100</td><td>2단 히트</td></tr><tr><td>애니메이션</td><td>ovdrassetid://18173300</td><td>3단 히트</td></tr></tbody></table>

### 튜토리얼

<table data-full-width="true"><thead><tr><th width="233.33331298828125">단계</th><th width="590">작업 내용</th><th>비고</th></tr></thead><tbody><tr><td><ol><li>액션시퀀스 생성</li></ol></td><td><ul><li>액션시퀀스 서비스 하위에 액션시퀀스 인스턴스를 추가합니다.<img src="/files/Z6xSqRO80gQgQiv41RiT" alt=""></li><li>이름을 3-HitCombo로 변경합니다.<br><img src="/files/vNHB4LASErsXrVLbYSOw" alt=""></li></ul></td><td><ul><li>액션시퀀스 이름은 중복되지 않아야 합니다.</li></ul></td></tr><tr><td><ol start="2"><li>액션시퀀서 에디터 열기</li></ol></td><td><ul><li>액션시퀀스 인스턴스에 마우스를 올리면 표시되는 Open 버튼을 클릭합니다.<br><img src="/files/x36mXFjJn8c2btAkARnX" alt=""></li></ul></td><td><ul><li>플레이 중 편집한 내용은 즉시 반영되지 않으며, 재실행 시 적용됩니다.</li></ul></td></tr><tr><td><ol start="3"><li>애니메이션 트랙<br>(1단 히트)</li></ol></td><td><ul><li>Add Track 버튼을 눌러 Animation Track을 추가합니다.<br><img src="/files/qiqQa9Mh5ujhVhSleKgk" alt=""></li><li>트랙을 선택하고 트랙 프로퍼티 패널에서 Ovdr Asset Id에 1단 히트용 애니메이션 Id를 지정합니다.<br>(ovdrassetid://18169100)<br><img src="/files/BN3fpWjn6H7YrzXMZkPo" alt=""></li><li>Blend in / Out Time을 0으로 설정합니다.<img src="/files/SLnDRvDFtWZOiTbMgdUs" alt=""></li></ul></td><td></td></tr><tr><td><ol start="4"><li>미리보기</li></ol></td><td><ul><li>재생 버튼 또는 Spacebar를 눌러 타임라인을 재생하고 애니메이션을 확인합니다.<br><img src="/files/Uh8TcY6sM9pTh70Xbx0W" alt=""></li></ul></td><td></td></tr><tr><td><ol start="5"><li>애니메이션 트랙<br>(2단 히트)</li></ol></td><td><ul><li>새로운 Animation Track을 추가합니다.<br><img src="/files/Cw3fovN0J5EoC3M1bUyV" alt=""></li><li>트랙을 선택하고 Ovdr Asset Id에 2단 히트용 애니메이션 Id를 지정합니다. (ovdrassetid://18171100)<br><img src="/files/MQc68To8OnxHDfVdQvAQ" alt=""></li><li>Blend in / Out Time을 0으로 설정합니다.<br><img src="/files/SLnDRvDFtWZOiTbMgdUs" alt=""></li><li>섹션 위치를 1단 히트 이후로 조정합니다.<br><img src="/files/7s2BAkHBKfDIibXCfFCJ" alt=""></li></ul></td><td></td></tr><tr><td><ol start="6"><li>애니메이션 트랙<br>(3단 히트)</li></ol></td><td><ul><li>새로운 Animation Track을 추가합니다.<br><img src="/files/wjGGmKd9FLaYW9HEMtkU" alt=""></li><li>트랙을 선택하고 Ovdr Asset Id에 2단 히트용 애니메이션 Id를 지정합니다. (ovdrassetid://18173300)</li><li>Blend in / Out Time을 0으로 설정합니다.</li><li>섹션 위치를 2단 히트 이후로 조정합니다.<br><img src="/files/1ghT32VKDEMDaTYJuxD9" alt=""></li><li>재생해서 애니메이션을 확인합니다.<br><img src="/files/tsdjYe6ZsfKtrQflwsOH" alt=""></li></ul></td><td></td></tr><tr><td><ol start="7"><li>애니메이션 블렌드</li></ol></td><td><ul><li>애니메이션이 전환될때 끊기지 않도록 하기 위해 각 애니메이션의 Blend in / Out Time 0.25로 모두 변경합니다.<br><img src="/files/PENQbuqiVFn5Tr4vigab" alt=""></li><li>각 애니메이션의 시작과 끝을 겹치도록 배치합니다.<br><img src="/files/AWfRg2HgoWTFag1X49il" alt=""></li><li>타임라인을 재생하고 애니메이션을 확인합니다.</li><li>블렌드 시간에 의해 애니메이션의 원본 길이가 0.25초 만큼 온전히 표현되지 않는 것을 방지하기 위해, 섹션의 길이를 원래 길이보다 늘립니다.<br><img src="/files/uLa0R6tOW8ghSsnbjaMm" alt=""></li><li>타임라인을 재생하면서 애니메이션 전환이 자연스러운지 확인하고 섹션 길이를 조정합니다.</li></ul></td><td><ul><li>블렌드 구간에서는 이전 애니메이션과 다음 애니메이션이 동시에 적용되며, 시간에 따라 가중치가 변화하면서 부드럽게 전환됩니다. 이 구간에서는 <strong>원본 애니메이션이 100% 그대로 재생되지 않고</strong>, 다른 애니메이션과 <strong>혼합된 결과</strong>가 적용됩니다.</li></ul></td></tr><tr><td><ol start="8"><li>저장</li></ol></td><td><ul><li>Save 또는 Ctrl + S를 눌러 작업 내용을 저장합니다.<br>(저장이 완료되면 Sequence Changes Saved 메시지가 출력됩니다.)<br><img src="/files/JVBcuVuW2DQRY7gXxs1g" alt=""></li></ul></td><td><ul><li>작업 내용이 누락되지 않도록 자주 저장합시다!</li><li>변경사항이 있으면 액션시퀀스 이름 및 저장 버튼에 *가 표시됩니다.<br><img src="/files/4ehtqT9wJsAHW89UROis" alt=""></li></ul></td></tr><tr><td><ol start="9"><li>상체 애니메이션 적용</li></ol></td><td><ul><li>1단/2단 히트 애니메이션 트랙의 Slot Type을 Upper Body로 변경합니다.<br><img src="/files/OHXuig75t94p3cPuHPVV" alt=""></li></ul></td><td><ul><li>Slot Type에 따라 애니메이션이 적용되는 신체 범위가 결정됩니다.</li></ul></td></tr><tr><td><ol start="10"><li>뷰포트 카메라 조작</li></ol></td><td><ul><li>뷰포트를 클릭한 후, WASD 키로 카메라를 이동하고 마우스 우클릭으로 회전하여 캐릭터의 측면에서 애니메이션이 잘 보이도록 카메라 위치를 조정합니다.<br><img src="/files/FKcAoBs0nVvAojw5XPpH" alt=""></li></ul></td><td></td></tr><tr><td><ol start="11"><li>충돌 트랙</li></ol></td><td><ul><li>Collision Track을 추가합니다.<br><img src="/files/eq4npZM2BUU9cJJ0PgjI" alt=""></li><li>트랙 목록에서 Collision Track의 Value 필드가 보이도록 충돌 트랙을 전부 펼칩니다.<br><img src="/files/RWG34u5EDj7uwG8NHl5E" alt=""></li><li>타임라인의 Value 영역에서 마우스 휠 버튼 클릭 또는 Ctrl + 좌클릭을 통해 마커를 애니메이션 트랙 수에 맞춰 적절한 위치에 3개 추가합니다.<br><img src="/files/Cs2DLBBMWJDwOXpnwjEz" alt=""></li><li>스크러버를 움직이면서, 애니메이션 타이밍에 맞춰 3개 키프레임의 위치를 조정합니다.<br>(충돌체 위치는 아직 신경쓰지 마세요!)<br><img src="/files/CjyNCwj5N3HnMoMKKbKY" alt=""></li></ul></td><td><ul><li>타임라인의 가로 축은 Ctrl + 마우스 휠 업/다운으로 확대/축소할 수 있습니다.</li></ul></td></tr><tr><td><ol start="12"><li>충돌 상세 설정</li></ol></td><td><ul><li>각 키프레임을 선택하고 Collider Type을 Box로 변경합니다.<br><img src="/files/tWG7AOQ3THpaD35PyCTm" alt=""></li><li>Collider 필드가 전부 보이도록 펼치고 각 키프레임의 Box Extent를 (100, 150, 100)으로 변경합니다.<br><img src="/files/AAPo2BzrbeMjuCW4jNRi" alt=""></li><li>Attachment Offset 필드가 전부 보이도록 펼치고 각 키프레임의 Relative Location을 (0, 0, -100)으로 변경합니다.<br><img src="/files/WksOpFRK3uXzdSWkPN30" alt=""></li><li>각 키프레임의 Collision Event Name을 Hit1, Hit2, Hit3으로 변경합니다.<br><img src="/files/Y1lya24b3ZY0XPzcOyyO" alt=""></li><li>스크러버를 움직이면서, 충돌체 위치가 자연스러운지 확인하고 조정합니다.<br><img src="/files/SfKZp7YV4uINF9O7wOPe" alt=""></li><li>작업 내용을 저장합니다.</li></ul></td><td><ul><li>Collision Event Name은 스크립트 이벤트 연결에 사용됩니다.</li></ul></td></tr><tr><td><ol start="13"><li>액션시퀀스 실행</li></ol></td><td><ul><li>액션시퀀스 하위로 Script를 추가하고 이름을 CollisionTrackScript로 변경합니다.<br><img src="/files/ZQsMHGlMFsE1kVYb45lN" alt=""></li><li><p>스크립트를 열고 충돌 처리를 위해 아래의 내용을 작성합니다.</p><pre class="language-lua"><code class="lang-lua">local Sequence = script.Parent
for i = 1, 3 do
Sequence:Hit("Hit" .. i):Connect(function(self, other)
if self == other then
return
end
    print("Hit" .. i, self, other)    local caster = self:FindFirstChild("Humanoid")    local target = other:FindFirstChild("Humanoid")    if caster and target then	      target.Health -= 40	      print("Health : ", target.Health, " / ", target.MaxHealth)    endend)
end
</code></pre></li><li><p>StarterPlayer.StarterCharacterScripts 하위에 LocalScript를 추가하고 아래의 내용을 작성합니다.<br><img src="/files/GnCz3Q46WAlL1hoqfefy" alt=""></p><pre class="language-lua"><code class="lang-lua">local Players = game:GetService("Players")
local LocalPlayer = Players.LocalPlayer
local PlayerGui = LocalPlayer:WaitForChild("PlayerGui")
local ScreenGui = PlayerGui:WaitForChild("ScreenGui")
local PlayButton1 = Instance.new("TextButton")
PlayButton1.Position = UDim2.new(0.5, 0, 0.1, 0)
PlayButton1.Text = "Play 3-Hit Combo"
PlayButton1.TextScaled = true
PlayButton1.Parent = ScreenGui
PlayButton1.Activated:Connect(function()
local character = LocalPlayer.Character
local humanoid = character:WaitForChild("Humanoid")
local actionRunner = humanoid:GetActionRunner()
local key = "3-HitCombo"local transitionTime = 0actionRunner:Play(key, transitionTime)print("Play : " .. key)	
end)
</code></pre></li></ul></td><td><ul><li>액션시퀀스 실행 및 이벤트 연결은 서버측 Script, LocalScript에서 모두 가능합니다.</li></ul></td></tr><tr><td><ol start="14"><li>충돌 판정 확인</li></ol></td><td><ul><li>플레이 인원을 2인으로 설정하고 플레이 테스트를 실행합니다.<br><img src="/files/yygvJKH7S0wbUZ7oH8Cj" alt=""></li><li>Player1 캐릭터를 Player2 캐릭터 앞에 이동시킨 뒤, Play 3-Hit Combo 버튼을 눌러 액션시퀀스를 실행하고 모든 공격이 적중했을 때 캐릭터가 사망하는지 확인합니다.<br><img src="/files/ZAFIAi8bnWltKGWYa0f6" alt=""></li><li>플레이 테스트를 종료합니다.</li></ul></td><td><ul><li>스튜디오 툴바의 <strong>View 탭</strong>에서 <strong>Show Collision</strong>을 활성화하면, 플레이 중 충돌 트랙의 판정이 발생할 때 해당 영역이 뷰포트에 시각적으로 표시됩니다.<br><img src="/files/mMOq5sXVqKTiutmj2Pdk" alt=""></li></ul></td></tr><tr><td><ol start="15"><li>컨트롤 트랙</li></ol></td><td><ul><li>액션시퀀스 하위에 Part를 추가한 다음, Part 하위에 VFXPreset을 추가합니다.<br><img src="/files/3tF50l8mJXE9mWz469XJ" alt=""></li><li>Part의 이름을 HitFXPart, VFXPreset의 이름을 HitFX1로 변경합니다.<br><img src="/files/UEfpjb9dz3t0smizkY9B" alt=""></li><li>HitFXPart의 CanCollide를 false, Transparency를 1로 변경합니다.<br><img src="/files/fPUmJFEriBvkaXFQV70l" alt=""></li><li>HitFX1의 외형을 Simple Hit, Enabled를 false로 변경합니다.<br><img src="/files/fxipnum0uA6Jaq5ecVF6" alt=""></li><li>Control Track을 추가합니다.<br><img src="/files/kjevVJBbLK2K84zuq9XW" alt=""></li><li>트랙을 선택하고 Ref Object 필드에서 참조 연결 버튼을 클릭한 다음, 레벨 브라우저에서 HitFXPart을 선택합니다.<br><img src="/files/1PLMfoNBfng0c6JFqmMk" alt=""></li></ul></td><td><ul><li>액션시퀀스 하위에 객체를 구성할 때 혼선을 방지하기 위해 <strong>동일 이름 객체 사용을 권장하지 않습니다.</strong></li></ul></td></tr><tr><td><ol start="16"><li>이펙트 설정<br>(1단 히트)</li></ol></td><td><ul><li>트랙 목록에서 HitFXPart 하위의 HitFX1의 Value 필드가 보이도록 컨트롤 트랙을 전부 펼칩니다.<br><img src="/files/czbR0XnI8M6cjsI9fFXY" alt=""></li><li>타임라인의 Value 영역에서 마우스 휠 버튼 클릭 또는 Ctrl + 좌클릭을 통해 키프레임을 하나추가합니다.<br><img src="/files/0TsucslWuiVaBNKEy1H2" alt=""></li><li>키프레임을 선택하고 Time 필드를 0으로 변경합니다.<br>(Value 필드가 false가 아닌 경우, false로 설정합니다.)<br><img src="/files/BySX6nfg1Hk3vwqLgJvB" alt=""></li><li>1단 히트 충돌 위치에 맞춰 키프레임을 삽입하고, Value 필드를 true로 설정합니다.<br><img src="/files/DvNvrqjaYLLaHi3Milw2" alt=""></li></ul></td><td></td></tr><tr><td><ol start="17"><li>컨트롤 트랙 세부 조정</li></ol></td><td><ul><li>컨트롤 트랙을 클릭한 다음, Attachment Offset 필드가 전부 보이도록 펼치고 Relative Location 필드를 (100, 100, 0)으로 변경합니다.<br><img src="/files/CPOMdjN7fxR2pYmnoGQG" alt=""></li><li>스크러버를 움직이면서, 이펙트 위치가 자연스러운지 확인하고 조정합니다.<br><img src="/files/h6ngt2oxI6zYt1bsf1RN" alt=""></li></ul></td><td></td></tr><tr><td><ol start="18"><li>이펙트 설정<br>(2단 히트)</li></ol></td><td><ul><li>1단 히트와 동일한 이펙트를 재사용하기 위해, 2단 히트 충돌 위치 직전에 맞춰 키프레임을 삽입하고, Value 필드를 false로 설정합니다.<br><img src="/files/WO61ebzJj4GTQW4r3qlN" alt=""></li><li>이어서 충돌 위치에 맞춰 키프레임을 삽입하고, Value 필드를 true로 설정합니다.<br><img src="/files/ONDAUK6jRpkQ4sHhEBuP" alt=""></li><li>작업 내용을 저장합니다.</li></ul></td><td></td></tr><tr><td><ol start="19"><li>이펙트 설정<br>(3단 히트)</li></ol></td><td><ul><li>새로운 이펙트를 사용하기 위해, Part 하위에 VFXPreset을 추가합니다.</li><li>VFXPreset의 이름을 HitFX2로 변경합니다.<br><img src="/files/pB5LNdbNKiI9154Si5Hq" alt=""></li><li>HitFX2의 외형을 Explosion, Enabled를 false로 변경합니다.<br><img src="/files/4lwntyhxSSLBqLPYH68z" alt=""></li><li>트랙 목록에서 HitFX2의 Value 필드가 보이도록 컨트롤 트랙을 전부 펼칩니다.<br><img src="/files/tuwnP1mPiPZWnsYZKpjN" alt=""></li><li>타임라인의 Value 영역에서 마우스 휠 버튼 클릭 또는 Ctrl + 좌클릭을 통해 키프레임을 추가합니다.</li><li>키프레임을 선택하고 Time 필드를 0으로 변경합니다.<br>(Value 필드가 false가 아닌 경우, false로 설정합니다.)<br><img src="/files/BySX6nfg1Hk3vwqLgJvB" alt=""></li><li>3단 히트 충돌 위치에 맞춰 키프레임을 삽입하고, Value 필드를 true로 설정합니다.<br><img src="/files/voz154KFp6thOTuNqdgD" alt=""></li><li>3단 이펙트의 위치가 바닥에 표시되도록, 컨트롤 트랙의 OriginPosition의 Y에 키프레임을 추가하고 Value 필드를 -100으로 변경합니다.<br><img src="/files/ahKwtNSNZf7R2sE9h7jX" alt=""></li><li>이펙트 출력 전에 미리 위치가 바뀌도록 키프레임 위치를 3단 히트 이펙트 출력 전으로 조정합니다.<br><img src="/files/fBPemOMTjtusArATlBks" alt=""></li><li>재생해서 1<del>3단 히트의 이펙트 출력 위치를 확인합니다.</del><br><img src="/files/sXDgj75ckGaXjpLvE2eI" alt=""></li><li>12단 히트 이펙트의 위치에 영향이 생기지 않도록, 타임라인 시작 위치에 OriginPosition의 Y의키프레임을 추가하고 Time 필드는 0, Value 필드는 0으로 변경합니다.<br><img src="/files/ykAq6y4tEMyDYleTHlSb" alt=""></li><li>1단 히트에서 3단 히트로 위치가 서서히 변하지 않도록, 2단 히트와 3단 히트 사이에 키프레임을 추가하고, Value 필드를 0으로 변경합니다.<br>(이렇게 하면 2단 히트 이후, 이펙트가 보이지 않는 동안 위치가 변화하고 3단 히트에만 변경된 위치가 적용됩니다.)<br><img src="/files/xTl8UbUrqMbTtDm1eKTJ" alt=""></li><li>스크러버를 움직이면서, 이펙트 위치가 자연스러운지 확인하고 조정합니다.<br><img src="/files/lWDfsL1iJKqtJlxuOLa5" alt=""></li></ul></td><td></td></tr><tr><td><ol start="20"><li>소켓 부착 이펙트 설정</li></ol></td><td><ul><li>액션시퀀스 하위에 Part를 추가한 다음, Part 하위에 VFXPreset을 추가합니다.<br><img src="/files/RphCGXZ1wNMyXlMcYapA" alt=""></li><li>Part의 이름을 HandFXPart, VFXPreset의 이름을 HandFX로 변경합니다.<br><img src="/files/fC19RNG0xulKTlxx7mLx" alt=""></li><li>HandFXPart의 CanCollide를 false, Transparency를 1로 변경합니다.</li><li>HandFX의 외형을 Energy Pulse, Enabled를 false로 변경합니다.<br><img src="/files/sxnAitaZOtX5uk2M4IxB" alt=""></li><li>Control Track을 추가합니다.<br><img src="/files/yF9J0g65Gnvfl6XH7Ddn" alt=""></li><li>Ref Object 필드에서 참조 연결 버튼을 클릭한 다음, 레벨 브라우저에서 HandFXPart을 선택합니다.<br><img src="/files/VnjUNbhJEa1fPvOH3DKe" alt=""></li><li>Socket Name을 LeftHand로 변경합니다.<br><img src="/files/HRk81AxQE89tGPCU4LXi" alt=""></li><li>트랙 목록에서 HandFXPart 하위의 HandFX의 Value 필드가 보이도록 컨트롤 트랙을 전부 펼칩니다.</li><li>타임라인의 Value 영역에서 마우스 휠 버튼 클릭 또는 Ctrl + 좌클릭을 통해 키프레임을 추가합니다.</li><li>키프레임을 선택하고 Time 필드를 0으로 변경합니다.<br>(Value 필드가 false가 아닌 경우, false로 설정합니다.)<br><img src="/files/ur57r9jzduyL8GQIDpBX" alt=""></li><li>2단 히트 애니가 끝나는 시점에 맞춰 키프레임을 삽입하고, Value 필드를 true로 설정합니다.<br><img src="/files/ALqREmBvWroIpcsFm6OE" alt=""></li><li>3단 히트 이펙트가 재생되는 시점에 맞춰 키프레임을 삽입하고, Value 필드를 false로 설정합니다.<br><img src="/files/tGavtApvgv1yzPotv96n" alt=""></li><li>스크러버를 움직이면서, HandFX의 생성 및 소멸 타이밍이 자연스러운지 확인하고 조정합니다.<br><img src="/files/gUQ18Q99lvTlfbfwEkBw" alt=""></li><li>작업 내용을 저장합니다.</li></ul></td><td></td></tr><tr><td><ol start="21"><li>카메라 쉐이크 트랙</li></ol></td><td><ul><li>CameraShake Track을 추가합니다.<br><img src="/files/sSPo2mkvj4dgMWc90aJW" alt=""></li><li>편집 카메라/캐릭터 카메라 시점 전환을 클릭합니다.<br><img src="/files/R4giNmmgyNFIR0HasNyC" alt=""></li><li>CameraShake Track의 Shake Type을 Ultimate로 변경합니다.<br><img src="/files/UO5gRB3Ya2J3CeZ0wGIy" alt=""></li><li>스크러버를 움직이면서, 3단 히트 이펙트가 재생되는 시점에 맞춰 섹션의 위치를 조정합니다.<br><img src="/files/BH5OgRJ4dFQdMnji1jD0" alt=""></li><li>카메라 쉐이크가 자연스러운지 확인하고 섹션 위치와 길이를 조정합니다.</li><li>편집 카메라/캐릭터 카메라 시점 전환을 클릭해서 기본 카메라로 복구합니다.</li><li>작업 내용을 저장합니다.</li></ul></td><td><ul><li>카메라 관련 트랙(Camera Shake, Camera FOV, Camera Zoom 등)의 연출을 확인하려면 <strong>편집 카메라/캐릭터 카메라 시점 전환 버튼</strong>을 통해 시점을 변경해야 합니다.</li><li>런타임에서 카메라 효과는 액션시퀀스를 실행한 Player에게만 적용됩니다.</li></ul></td></tr><tr><td><ol start="22"><li>트리거 트랙</li></ol></td><td><ul><li>Trigger Track을 추가합니다.<br><img src="/files/bPuSHc3bTPb8jCsO7y2V" alt=""></li><li>3단 히트 애니메이션의 길이에 맞춰 섹션의 위치와 길이를 조정합니다.<br><img src="/files/UNn0GqEkRCrafIQZqe5R" alt=""></li><li>Trigger Name 필드를 MovementStateControl로 변경합니다.<br><img src="/files/F1vMfevX22dzl0koXtLJ" alt=""></li><li>액션시퀀스 하위로 LocalScript를 추가하고 이름을 TriggerTrackScript로 변경합니다.<br><img src="/files/DcnZW79us7EdxGTdtC8f" alt=""></li><li><p>스크립트를 열고 조작 상태를 제어하기 위해 아래의 내용을 작성합니다.</p><pre class="language-lua"><code class="lang-lua">local Sequence = script.Parent
local Players = game:GetService("Players")
local StarterGui = game:GetService("StarterGui")
local LocalPlayer = Players.LocalPlayer
local InitWalkSpeed = nil
local InitJumpHeight = nil
local function SetMovementState(humanoid, state)
local toWalkSpeed = state == false and 0 or InitWalkSpeed
local toJumpHeight = state == false and 0 or InitJumpHeight
humanoid.WalkSpeed = toWalkSpeedhumanoid.JumpHeight = toJumpHeightStarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Joystick, state)StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.JumpButton, state)print("SetMovementState : ", state)
end
Sequence:TriggerStarted("MovementStateControl"):Connect(function(self)
if self ~= LocalPlayer.Character then
return
end
local humanoid = self:WaitForChild("Humanoid")if InitWalkSpeed == nil or InitJumpHeight == nil then    InitWalkSpeed = humanoid.WalkSpeed    InitJumpHeight = humanoid.JumpHeightendSetMovementState(humanoid, false)
end)
Sequence:TriggerEnded("MovementStateControl"):Connect(function(self)
if self ~= LocalPlayer.Character then
return
end
local humanoid = self:WaitForChild("Humanoid")SetMovementState(humanoid, true)
end)
</code></pre></li></ul></td><td></td></tr><tr><td><ol start="23"><li>재생 길이 정리</li></ol></td><td><ul><li>스크러버를 3단 히트 애니메이션이 끝나는 위치로 이동시킵니다.<br><img src="/files/hG2ptwFqGn3LpjYHggdw" alt=""></li><li>재생 길이 설정 버튼을 눌러, 재생 종료 위치를 실제 연출 길이 만큼 조정합니다.<br><img src="/files/wnbKFOdcgr2aELGY5yuv" alt=""><br></li><li>작업 내용을 저장합니다.</li></ul></td><td><ul><li>액션 시퀀스 실행 시 생성되는 복제 객체의 생성 및 파괴 시점을 명확히 하기 위해, 액션이 종료된 경우 재생 길이도 함께 정리하는 것이 좋습니다. <strong>재생 길이가 불필요하게 길 경우 객체 제거 시점</strong>이 지연될 수 있습니다.</li></ul></td></tr><tr><td><ol start="24"><li>결과 확인</li></ol></td><td><ul><li>플레이 테스트를 실행하고 결과를 확인합니다.<br>(3단 히트 애니메이션이 실행되면, 재생이 종료되기 전까지 이동이 비활성화되는지 확인해봅시다.)<br><img src="/files/NpZKsnchOzTPLhWERi95" alt=""></li></ul></td><td></td></tr></tbody></table>

## 피격 반응

### 학습 효과

<figure><img src="/files/m04uqe4bmafw7WatAyxu" alt=""><figcaption></figcaption></figure>

이 튜토리얼을 완료하면 다음과 같은 구성을 만들 수 있습니다.

* 공격 적중시 피격 반응 재생
* 타격 시점에 맞춰 재생되는 피격 이펙트

### 사용 에셋 목록

<table><thead><tr><th width="140.9998779296875">에셋 타입</th><th width="229">에셋 Id</th><th>설명</th></tr></thead><tbody><tr><td>애니메이션</td><td>ovdrassetid://18178100</td><td>피격</td></tr></tbody></table>

### 튜토리얼

<table data-full-width="true"><thead><tr><th width="233.33331298828125">단계</th><th width="590">작업 내용</th><th>비고</th></tr></thead><tbody><tr><td><ol><li>액션시퀀스 생성</li></ol></td><td><ul><li>액션시퀀스 서비스 하위에 액션시퀀스 인스턴스를 추가합니다.</li><li>이름을 HitReaction로 변경합니다.<br><img src="/files/fZMd4ZXuoJKRMJJbAczz" alt=""></li></ul></td><td><ul><li>액션시퀀스 이름은 중복되지 않아야 합니다.</li></ul></td></tr><tr><td><ol start="2"><li>액션시퀀서 에디터 열기</li></ol></td><td><ul><li>액션시퀀스 인스턴스에 마우스를 올리면 표시되는 Open 버튼을 클릭합니다.</li></ul></td><td><ul><li>플레이 중 편집한 내용은 즉시 반영되지 않으며, 재실행 시 적용됩니다.</li></ul></td></tr><tr><td><ol start="3"><li>애니메이션 트랙</li></ol></td><td><ul><li>Add Track 버튼을 눌러 Animation Track을 추가합니다.<br><img src="/files/6FVokBiANVpK1qmyewwU" alt=""></li><li>Ovdr Asset Id에 1단 히트용 애니메이션 Id를 지정합니다. (ovdrassetid://18178100)</li><li>Blend in / Out Time을 0으로 설정합니다.<br><img src="/files/yTdb2rIecIcn3qJYioOx" alt=""></li><li>재생 길이를 실제 연출 길이 만큼 조정합니다.<br><img src="/files/yj4NECtCO6jiygtZa5lp" alt=""></li></ul></td><td><ul><li>F키를 눌러 재생 길이에 맞춰 타임라인을 화면에 채울 수 있습니다.</li></ul></td></tr><tr><td><ol start="4"><li>미리보기</li></ol></td><td><ul><li>재생 버튼 또는 Spacebar를 눌러 타임라인을 재생하고 애니메이션을 확인합니다.</li><li>작업 내용을 저장합니다.</li></ul></td><td></td></tr><tr><td><ol start="5"><li>액션시퀀스 실행</li></ol></td><td><ul><li><p>3단 히트 액션을 만들면서 생성한 StarterPlayer.StarterCharacterScripts.LocalScript에 아래의 내용을 작성합니다.</p><pre class="language-lua"><code class="lang-lua">-- (이전 내용에 이어서)
local PlayButton2 = Instance.new("TextButton")
PlayButton2.Position = UDim2.new(0.5, 0, 0.1, 60)
PlayButton2.Text = "Play HitReaction"
PlayButton2.TextScaled = true
PlayButton2.Parent = ScreenGui
PlayButton2.Activated:Connect(function()
local character = LocalPlayer.Character
local humanoid = character:WaitForChild("Humanoid")
local actionRunner = humanoid:GetActionRunner()
local key = "HitReaction"local transitionTime = 0actionRunner:Play(key, transitionTime)print("Play : " .. key)	
end)
</code></pre></li><li>플레이 테스트를 실행합니다.</li><li>Play HitReaction 버튼을 눌러 액션시퀀스를 실행하고 액션이 재생되는지 확인합니다.</li><li>플레이 테스트를 종료합니다.</li></ul></td><td><ul><li>액션시퀀스는 LocalScript에서도 실행할 수 있습니다.</li></ul></td></tr><tr><td><ol start="6"><li>이펙트 설정</li></ol></td><td><ul><li>액션시퀀스 하위에 Part를 추가한 다음, Part 하위에 VFXPreset을 추가합니다.<br><img src="/files/Vp1RPmRhS0UA60xuQjVk" alt=""></li><li>Part의 이름을 ReactionFXPart, VFXPreset의 이름을 BloodFX로 변경합니다.<br><img src="/files/ygb5cVif4OOuygKX5p1F" alt=""></li><li>ReactionFXPart의 CanCollide를 false, Transparency를 1로 변경합니다.</li><li>BloodFX의 외형을 Blood, Enabled를 false로 변경합니다.<br><img src="/files/548PPnGDhKwM8z6QzU2E" alt=""></li><li>Control Track을 추가합니다.<br><img src="/files/YQhR7RyXwbqdUrdHBhCJ" alt=""></li><li>Ref Object 필드에서 참조 연결 버튼을 클릭한 다음, 레벨 브라우저에서 ReactionFXPart을 선택합니다.<br><img src="/files/0fIY22eE2UTPkJZegZuY" alt=""></li><li>트랙 목록에서 BloodFX의 Value 필드가 보이도록 컨트롤 트랙을 전부 펼칩니다.</li><li>타임라인의 Value 영역에 키프레임을 추가합니다.</li><li>키프레임을 선택하고 Time 필드를 0으로 변경합니다.<br>(Value 필드가 false가 아닌 경우, false로 설정합니다.)<br><img src="/files/pyfCOCjfMISo49BRPIns" alt=""></li><li>적당한 시점에 키프레임을 추가하고 Value 값을 true로 설정합니다.<br><img src="/files/E67oLrnG62Xh9XmFXqEP" alt=""></li><li>컨트롤 트랙을 클릭하고 Relative Location 필드를 (0, 100, 0)으로 변경합니다.<br><img src="/files/VpfYITJKx2hNg0svdYmr" alt=""></li><li>스크러버를 움직이면서, 이펙트 위치가 자연스러운지 확인하고 조정합니다.<br><img src="/files/9aTqI7clTftk1EPBynuh" alt=""></li><li>작업 내용을 저장합니다.</li></ul></td><td></td></tr><tr><td><ol start="7"><li>공격 적중시 피격 표현</li></ol></td><td><ul><li>3-HitCombo 액션시퀀스 하위의 CollisionTrackScript를 엽니다.</li><li><p><code>target.Health -= 40</code> 아래에 다음의 코드를 추가합니다.</p><pre class="language-lua"><code class="lang-lua">target.ActionRunner:Play("HitReaction")
</code></pre></li></ul></td><td></td></tr><tr><td><ol start="8"><li>결과 확인</li></ol></td><td><ul><li>플레이 테스트를 실행합니다.</li><li>Player1 캐릭터를 Player2 캐릭터 앞에 이동시킨 뒤, Play 3-Hit Combo 버튼을 눌러 액션시퀀스를 실행하고 공격이 적중할 때 마다 피격 액션이 재생되는지 확인합니다.<br><img src="/files/Ad6RBhBKonLvU4Ymar7Z" alt=""></li></ul></td><td></td></tr></tbody></table>

## 회복 액션

### 학습 효과

<figure><img src="/files/cNfNWRWqLOmeKAcztZi7" alt=""><figcaption></figcaption></figure>

이 튜토리얼을 완료하면 다음과 같은 구성을 만들 수 있습니다.

* 회복 효과 표현
* 이벤트 트랙을 활용하여 특정 시점에 맞춰 이벤트 처리

### 사용 에셋 목록

<table><thead><tr><th width="140.9998779296875">에셋 타입</th><th width="229">에셋 Id</th><th>설명</th></tr></thead><tbody><tr><td>애니메이션</td><td>ovdrassetid://18884200</td><td>마법 시전</td></tr></tbody></table>

### 튜토리얼

<table data-full-width="true"><thead><tr><th width="233.33331298828125">단계</th><th width="590">작업 내용</th><th>비고</th></tr></thead><tbody><tr><td><ol><li>액션시퀀스 생성</li></ol></td><td><ul><li>액션시퀀스 서비스 하위에 액션시퀀스 인스턴스를 추가합니다.</li><li>이름을 HealSpell로 변경합니다.<br><img src="/files/3qxZ675ey4J8A0QjiqXz" alt=""></li></ul></td><td><ul><li>액션시퀀스 이름은 중복되지 않아야 합니다.</li></ul></td></tr><tr><td><ol start="2"><li>액션시퀀서 에디터 열기</li></ol></td><td><ul><li>액션시퀀스 인스턴스에 마우스를 올리면 표시되는 Open 버튼을 클릭합니다.</li></ul></td><td><ul><li>플레이 중 편집한 내용은 즉시 반영되지 않으며, 재실행 시 적용됩니다.</li></ul></td></tr><tr><td><ol start="3"><li>애니메이션 트랙</li></ol></td><td><ul><li>Add Track 버튼을 눌러 Animation Track을 추가합니다.<br><img src="/files/6FVokBiANVpK1qmyewwU" alt=""><br></li><li>Ovdr Asset Id에 1단 히트용 애니메이션 Id를 지정합니다. (ovdrassetid://18884200)</li><li>Blend in / Out Time을 0으로 설정합니다.<br><img src="/files/Z3MkRow0vXqII0XptMnz" alt=""></li><li>Slot Type을 Upper Body로 변경합니다.</li></ul></td><td></td></tr><tr><td><ol start="4"><li>미리보기</li></ol></td><td><ul><li>재생 버튼 또는 Spacebar를 눌러 타임라인을 재생하고 애니메이션을 확인합니다.</li><li>작업 내용을 저장합니다.</li></ul></td><td></td></tr><tr><td><ol start="5"><li>액션시퀀스 실행</li></ol></td><td><ul><li><p>3단 히트 액션을 만들면서 생성한 StarterPlayer.StarterCharacterScripts.LocalScript에 아래의 내용을 작성합니다.</p><pre class="language-lua"><code class="lang-lua">-- (이전 내용에 이어서)
local PlayButton3 = Instance.new("TextButton")
PlayButton3.Position = UDim2.new(0.5, 0, 0.1, 120)
PlayButton3.Text = "Play HealSpell"
PlayButton3.TextScaled = true
PlayButton3.Parent = ScreenGui
PlayButton3.Activated:Connect(function()
local character = LocalPlayer.Character
local humanoid = character:WaitForChild("Humanoid")
local actionRunner = humanoid:GetActionRunner()
local key = "HealSpell"local transitionTime = 0actionRunner:Play(key, transitionTime)print("Play : " .. key)	
end)
</code></pre></li><li>플레이 테스트를 실행합니다.</li><li>Play HealSpell 버튼을 눌러 액션시퀀스를 실행하고 액션이 재생되는지 확인합니다.<br><img src="/files/7kZhoZiZ4FZDz1iFE5Fd" alt=""></li><li>플레이 테스트를 종료합니다.</li></ul></td><td><ul><li>액션시퀀스는 LocalScript에서도 실행할 수 있습니다.</li></ul></td></tr><tr><td><ol start="6"><li>이펙트 설정</li></ol></td><td><ul><li>액션시퀀스 하위에 Part를 추가한 다음, Part 하위에 VFXPreset을 추가합니다.<br><img src="/files/KrIeWgupQea34VZv146x" alt=""></li><li>Part의 이름을 HealFXPart, VFXPreset의 이름을 HealFX로 변경합니다.<br><img src="/files/5C3tLvHAo2ZlYezQcB9g" alt=""></li><li>HealFXPart의 CanCollide를 false, Transparency를 1로 변경합니다.</li><li>HealFX의 외형을 Heal, Enabled를 false로 변경합니다.<br><img src="/files/rpODBZHAzbCrPoJk7RTk" alt=""></li><li>Control Track을 추가합니다.<br><img src="/files/Or6DWsRhS8p8AYOPfE71" alt=""></li><li>Ref Object 필드에서 참조 연결 버튼을 클릭한 다음, 레벨 브라우저에서 HealFXPart을 선택합니다.<br><img src="/files/FYf2ZgfxvYmVvngleaPU" alt=""></li><li>트랙 목록에서 HealFX의 Value 필드가 보이도록 컨트롤 트랙을 전부 펼칩니다.</li><li>타임라인의 Value 영역에 키프레임을 추가합니다.</li><li>키프레임을 선택하고 Time 필드를 0으로 변경합니다.<br>(Value 필드가 false가 아닌 경우, false로 설정합니다.)<br><img src="/files/I86p86jlVzt0lfVd0h3r" alt=""></li><li>애니메이션이 끝나는 시점에 맞춰 키프레임을 추가하고, Value 필드를 true로 변경합니다.<br><img src="/files/ADLzyQSV3V8psJPtDuWs" alt=""></li><li>스크러버를 움직이면서, 이펙트 위치가 자연스러운지 확인하고 조정합니다.<br><img src="/files/m6Zc1TMKnGKBrI3OZAyp" alt=""></li><li>작업 내용을 저장합니다.</li></ul></td><td></td></tr><tr><td><ol start="7"><li>재생 길이 설정</li></ol></td><td><ul><li>스크러버를 2초에 두고, 재생 길이를 조정합니다.<br><img src="/files/xAzM9IQH9IgfqAfpMmrQ" alt=""></li></ul></td><td></td></tr><tr><td><ol start="8"><li>이벤트 트랙</li></ol></td><td><ul><li>Event Track을 추가합니다.<br><img src="/files/XrVZFnYXQpqolbE2op3w" alt=""></li><li>Value 필드가 보이도록 이벤트 트랙을 전부 펼칩니다.</li><li>컨트롤 트랙의 마지막 키프레임 이후에 키프레임을 4개 추가합니다.<br>(추가된 키프레임은 스크립트에서 회복 처리를 위해 사용됩니다.)<br><img src="/files/mfDCom3CAPHLoG2y4HyH" alt=""></li><li>각 키프레임의 Collision Event Name을 Heal1, Heal2, Heal3, Heal4로 변경합니다.<br><img src="/files/VezZ20HbB4M0RCgohc1H" alt=""></li><li>작업 내용을 저장합니다.</li><li>액션시퀀스 하위로 Script를 추가하고 이름을 EventTrackScript로 변경합니다.<br><img src="/files/5HdlCUbMVn5FfAgIgfFY" alt=""></li><li><p>스크립트를 열고 조작 상태를 제어하기 위해 아래의 내용을 작성합니다.</p><pre class="language-lua"><code class="lang-lua">local ActionSequence = script.Parent
local HealAmount = 20
for i = 1, 5 do
ActionSequence:GetMarkerReachedSignal("Heal" .. i):Connect(function(self)
local humanoid = self:WaitForChild("Humanoid")
humanoid.Health += HealAmount
print("Health : ", humanoid.Health, " / ", humanoid.MaxHealth)
end)
end
</code></pre></li></ul></td><td></td></tr><tr><td><ol start="9"><li>결과 확인</li></ol></td><td><ul><li>플레이 테스트를 실행하고 결과를 확인합니다.<br><img src="/files/EMqGJOgoT4eNUD3U39kO" alt=""></li></ul></td><td></td></tr></tbody></table>

## 학습 자료

{% content-ref url="/pages/LdDj7Trv4lsS7sQCWGPk" %}
[동작 원리](/korean/manual/studio-manual/game-development/actionsequence/actionsequence-mechanism.md)
{% endcontent-ref %}

{% content-ref url="/pages/PtyLZJRyDFQAC6cztJRF" %}
[트랙 종류](/korean/manual/studio-manual/game-development/actionsequence/actionsequence-track-types.md)
{% endcontent-ref %}

## 유용한 자료

{% content-ref url="/pages/GWE1QQYA5ZKybkJcVPtz" %}
[캐릭터 애니메이션](/korean/manual/studio-manual/character/character-animation.md)
{% endcontent-ref %}

{% content-ref url="/pages/p2S6gDDGo66tzq8ECaHo" %}
[VFXPreset 에셋 리스트](/korean/manual/studio-manual/object/vfx/vfxpreset-asset-list.md)
{% endcontent-ref %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.overdare.com/korean/manual/studio-manual/game-development/actionsequence/creating-actionsequences.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
