> For the complete documentation index, see [llms.txt](https://docs.overdare.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.overdare.com/korean/manual/studio-manual/game-development/actionsequence/creating-actionsequences.md).

# 액션시퀀스 제작하기

## 개요

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

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

## 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" %}
[Broken mention](broken://pages/p2S6gDDGo66tzq8ECaHo)
{% endcontent-ref %}
