본문 바로가기

로블록스 개발 중급

게임에서 직접 만든 커스텀 애니메이션 사용하기

이번 포스팅에서는 이전 포스팅(로블록스 애니메이션 에디터 사용하기)에서 직접 만든 애니메이션을 실제 본인의 게임에 적용시켜 보자.

디폴트 애니메이션을 커스텀 애니메이션으로 바꾸기

로블록스에서 기본으로 제공하는 캐릭터의 애니메이션을 바꿔보자. 애니메이션을 바꾸기 위해서는 교체하고 싶은 애니메이션의 ID가 필요하다. 애니메이션의 ID는 알아서 구하자. 직접 올린 것이든 아니든, ID는 로블록스 서버에서 원하는 애니메이션에 들어가보면 쉽게 구할 수 있다.

교체 자체는 Script에서 진행한다. ServerScriptService에 Script를 추가해서 아래의 내용을 넣자.

local Players = game:GetService("Players")

-- 캐릭터의 휴머노이드의 애니메이션 트랙을 교체한다.
local function onCharacterAdded(character)
    local humanoid = character:WaitForChild("Humanoid")
 
    -- 애니메이션 트랙 모두 일단 정지.
    for _, playingTracks in pairs(humanoid:GetPlayingAnimationTracks()) do
        playingTracks:Stop(0)
    end
 
    -- 애니메이션 트랙을 모두 교체
    local animateScript = character:WaitForChild("Animate")
    animateScript.run.RunAnim.AnimationId = "rbxassetid://616163682"        -- Run
    animateScript.walk.WalkAnim.AnimationId = "rbxassetid://616168032"      -- Walk
    animateScript.jump.JumpAnim.AnimationId = "rbxassetid://616161997"      -- Jump
    animateScript.idle.Animation1.AnimationId = "rbxassetid://616158929"    -- Idle (Variation 1)
    animateScript.idle.Animation2.AnimationId = "rbxassetid://616160636"    -- Idle (Variation 2)
    animateScript.fall.FallAnim.AnimationId = "rbxassetid://616157476"      -- Fall
    animateScript.swim.Swim.AnimationId = "rbxassetid://616165109"          -- Swim (Active)
    animateScript.swimidle.SwimIdle.AnimationId = "rbxassetid://616166655"  -- Swim (Idle)
    animateScript.climb.ClimbAnim.AnimationId = "rbxassetid://616156119"    -- Climb

end
 
local function onPlayerAdded(player)
    player.CharacterAppearanceLoaded:Connect(onCharacterAdded)
end
 
Players.PlayerAdded:Connect(onPlayerAdded)

Using Animation Weight

하나의 상태에 여러 애니메이션이 등록되는 경우가 있다. 위의 idle 상태처럼 애니메이션이 2개가 설정되어 있을 때는 애니메이터가 각 애니메이션의 Weight를 따지고 나서 랜덤하게 플레이한다. 예를 들어 아래의 코드처럼 애니메이션 1은 weight 가 5, 애니메이션 2는 weight가 15라고 가정해보자.

    -- 디폴트 애니메이션 교체
    animateScript.idle.Animation1.AnimationId = "rbxassetid://616158929"    -- Idle (Variation 1)
    animateScript.idle.Animation2.AnimationId = "rbxassetid://616160636"    -- Idle (Variation 2)
    -- idle 애니메이션1은 weight가 5
    animateScript.idle.Animation1.Weight.Value = 5
    -- idle 애니메이션2은 weight가 15
    animateScript.idle.Animation2.Weight.Value = 10

이 상태에는 1은 5이고 2는 15이므로 각각 25%와 75%의 비중을 가지게 된다. 즉, 애니메이터는 애니메이션1은 25%의 확률로, 애니메이션 2는 75%의 확률로 플레이하게 한다.

각 상태에 따른 애니메이션의 정의는 다음과 같다.

  • Cheer
    • animateScript.cheer.CheerAnim.AnimationId 
  • Climb
    • animateScript.climb.ClimbAnim.AnimationId 
  • Dance
    • animateScript.dance.Animation1.AnimationId
    • animateScript.dance.Animation2.AnimationId
    • animateScript.dance.Animation3.AnimationId
    • animateScript.dance2.Animation1.AnimationId
    • animateScript.dance2.Animation2.AnimationId
    • animateScript.dance2.Animation3.AnimationId
    • animateScript.dance3.Animation1.AnimationId
    • animateScript.dance3.Animation2.AnimationId
    • animateScript.dance3.Animation3.AnimationId 
  • Fall
    • animateScript.fall.FallAnim.AnimationId 
  • Idle
    • animateScript.idle.Animation1.AnimationId 
    • animateScript.idle.Animation2.AnimationId 
  • Jump
    • animateScript.jump.JumpAnim.AnimationId 
  • Laugh
    • animateScript.laugh.LaughAnim.AnimationId 
  • Point
    • animateScript.point.PointAnim.AnimationId 
  • Run
    • animateScript.run.RunAnim.AnimationId 
  • Sit
    • animateScript.sit.SitAnim.AnimationId 
  • Swim
    • animateScript.swim.Swim.AnimationId 
    • animateScript.swimidle.SwimIdle.AnimationId 
  • Tools
    • animateScript.toollunge.ToolLungeAnim.AnimationId
    • animateScript.toolnone.ToolNoneAnim.AnimationId
    • animateScript.toolslash.ToolSlashAnim.AnimationId 
  • Walk
    • animateScript.walk.WalkAnim.AnimationId 
  • Wave
    • animateScript.wave.WaveAnim.AnimationId

애니메이션 직접 플레이시키기

직접 애니메이션을 플레이하는 방법을 알아보자. 기본 애니메이션이 아니라, 예를 들어 특별한 스킬을 사용할 때의 애니메이션이라든지 하는 특별한 애니메이션을 사용할 때가 있을 것이다. 위의 방법과 마찬가지로 커스텀하게 제작한 애니메이션을 로블록스에 이미 Exporting 한 상태일 것으로 가정한다. Exporting한 애니메이션의 ID이 필요하다. 위에서도 밝혔듯이 애니메이션 ID는 로블록스에서 찾을 수 있다.

Humanoid일때의 애니메이션 플레이

인간형 캐릭터인 휴머노이드 객체를 포함하고 있는 rig의 경우는 Animator:LoadAnimation()으로 애니메이션을 불러올 수 있다. 불러온 애니메이션의 Play() 함수를 통해 플레이시킨다.

아래의 스크립트는 LocalScript이다. 로컬스트립트는 StarterPlayerScripts안에 놔두고 게임 시작시에 실행되도록 하는게 일반적이다. 

local Players = game:GetService("Players")
 
local player = Players.LocalPlayer
local character = player.Character
if not character or not character.Parent then
    character = player.CharacterAdded:Wait()
end
local humanoid = character:WaitForChild("Humanoid")
local animator = humanoid:WaitForChild("Animator")
 
-- 애니메이션 인스턴스를 생성하고 여기에 애니메이션 ID를 대입한다.
local kickAnimation = Instance.new("Animation")
-- 원하는 애니메이션 ID를 대입한다.
kickAnimation.AnimationId = "rbxassetid://2515090838"
 
-- 애니메이션을 불러온다.
local kickAnimationTrack = animator:LoadAnimation(kickAnimation)
 
-- 애니메이션 실행
kickAnimationTrack:Play()
 
-- 애니메이션에 이벤트가 있으면 GetMarkerReachedSignal()함수로 원하는 이벤트를 함수에 연결할 수 있다.
kickAnimationTrack:GetMarkerReachedSignal("KickEnd"):Connect(function(paramString)
    print(paramString)
end)

코드를 보고 해석하는 것도 좋은 방법이지만 굳이 글로 설명하자면, 애니메이터를 휴머노이드 객체에서 찾아와서, 애니메이터에서 원하는 애니메이션을 불러온다. 파라메터로 애니메이션 인스턴스에 애니메이션ID를 대입한다. 불려온 애니메이션은 애니메이션트랙 객체로 출력되는데 애니메이션 트랙 객체는 Play()함수로 플레이 할 수 있다. 마지막으로 애니메이션에 이벤트를 처리하기 위해 애니메이션 트랙의 GetMarkerReachedSignal()함수를 사용한다.

Humanoid가 없는 Rig의 애니메이션 플레이

휴머노이드가 없는 Rig에 커스텀 애니메이션을 플레이하기 위해서는 과정이 몇가지가 추가된다. 휴머노이드 객체가 있으면 휴머노이드 객체에서 애니메이터를 불러서 처리할 수 있지만, 휴머노이드가 없으므로 애니메이터를 새로 만들어야 한다. 일단 AnimationController를 만들어서 Rig에 자식으로 만들고, Animator를 만들어서 다시 AnimationController의 자식으로 만들어서 사용한다. 

하나의 rig에서 Humanoid와 AnimationController 양쪽에서 애니메이션를 로드할 수 없다. 한쪽에서만 로드할 수 있으므로 아래의 코드에서는 휴머노이드가 없다는 전제를 확실히 하기 위해서 휴머노이드가 만약에 있으면 아예 지워버리는 코드가 들어 있다.

-- 이 스크립트는 rig의 자식으로 되어있어야 한다.
local rig = script.Parent
 
-- 휴머노이드를 찾아보고 있으면 아예 지워버린다.
local humanoid = rig:FindFirstChildOfClass("Humanoid")
if humanoid then
    humanoid:Destroy()
end
 
-- 애니메이션 인스턴스 생성
local kickAnimation = Instance.new("Animation")
-- 생성된 애니메이션에 ID 대입
kickAnimation.AnimationId = "rbxassetid://2515090838"
 
-- 애니메이션 컨트롤러 생성
local animController = Instance.new("AnimationController")
animController.Parent = rig
-- 애니메이터 생성
local animator = Instance.new("Animator")
animator.Parent = animController
 
-- 애니메이터로 애니메이션 로드
local kickAnimationTrack = animator:LoadAnimation(kickAnimation)
 
-- 애니메이션 플레이
kickAnimationTrack:Play()
 
-- 이벤트 처리
kickAnimationTrack:GetMarkerReachedSignal("KickEnd"):Connect(function(paramString)
    print(paramString)
end)

'로블록스 개발 중급' 카테고리의 다른 글

CFrame 이해하기  (0) 2021.06.04
로블록스 중급 목차  (1) 2021.05.28
로블록스 애니메이션 에디터 사용하기  (0) 2021.05.27
배경음악 플레이하기  (0) 2021.05.20
로블록스의 Lighting 제어  (0) 2021.05.18