-
Unity 2D 애니메이션 공부Unity 2021. 3. 20. 21:06
이번주도 저번주처럼 유튜브와 Unity 공식 문서를 보면서 공부해본 애니메이션...
사실 여태 만들었던 2개의 게임 중 하나에만 애니메이션이 들어가있었고, 그 마저도 다른 팀원이 해줘서 부끄럽게도 애니메이션 관련해서 잘 아는 편이 아니었다. 분명 예전에 튜토리얼 따라해보면서 배우긴 했지만 많이 까먹었기에 복습할 겸 정리해두려 한다.
1. StateMachine
현재 사용한 에셋에는 idle(대기상태), walk, jump이렇게 3가지의 애니메이션이 번갈아 동작된다. 가만히 있다가 점프 / 걷기가 가능하고 걷다가 점프도 가능해서 삼각형모양으로 transition이 그려진다.
AnyState의 경우 공식문서를 읽어보니 항상 존재하는 state로 현재 어느 state에 존재하는지와 상관없이 다른 특정 state로 뛰어넘을 수 있게 만들어주는 state이다. 그렇기에 anystate로 가거나 할 순 없고, 약간 goto문같은 느낌으로 사용되는 듯 하다.
주황색으로 칠해진 Idle은 디폴트 스테이트이다. Entry(진입)에서 디폴트 스테이트를 향해 트랜지션하는것이 기본이고 Exit는 스테이트 머신을 빠져나오는데 사용한다.
2. Animation Parameter
애니메이션 컨트롤러 내에 정의된 변수로 스크립트 상에서 값의 할당 / 접근이 가능하다. 아래 사진의 2가지 값은 전부 Bool타입의 변수로 현재 걷고 있는가?와 점프중인가? 이렇게 2가지가 있다.
parameter에는 bool값만 있는게 아니고 int, float, trigger 이렇게 3종류가 더 있어서 총 4종류의 parameter가 있다. 스크립트에서는 Animator클래스의 SetBool, SetInt, SetFloat, SetTrigger, ResetTrigger등의 함수로 접근이 가능하다. 이 매개변수들은 상태를 바꾸는데 (ex idle -> walk)필요한 변수들이다.
아래는 유니티 다큐멘테이션에서 가지고 온 코드 예제이다. (근데 번역체가 완벽하게 깔끔하진 않다 / 주석 몇 개는 내가 넣은거)
docs.unity3d.com/kr/530/Manual/AnimationParameters.html
유니티 - 매뉴얼: 애니메이션 파라미터
스테이트 머신 기초 스테이트 머신 트랜지션 애니메이션 파라미터 애니메이션 파라미터는 애니메이션 컨트롤러 내에서 정의된 변수로서, 스크립트를 통해 값을 할당하거나 접근할 수 있습니다
docs.unity3d.com
using UnityEngine; using System.Collections; public class SimplePlayer : MonoBehaviour { Animator animator; void Start () { animator = GetComponent<Animator>(); } void Update () { float h = Input.GetAxis("Horizontal"); // horizontal방향 움직임(화살표 좌우) float v = Input.GetAxis("Vertical"); //vertical방향 움직임(화살표 위아래) bool fire = Input.GetButtonDown("Fire1"); //임의로 유저가 지정한 키값인듯 animator.SetFloat("Forward",v); animator.SetFloat("Strafe",h); animator.SetBool("Fire", fire); } void OnCollisionEnter(Collision col) { if (col.gameObject.CompareTag("Enemy")) { animator.SetTrigger("Die"); } } }
+) SetFloat나 SetTrigger같은 경우 매개변수 형태를 다양하게 쓸 수 있는것 같다. ID를 전달하거나 변수 이름을 전달하거나 등등...!
골드메탈님 유튜브보고 따라한 코드는 이렇다 (일부만 발췌해옴)
if(Input.GetButtonDown("Jump") && animator.GetBool("isJumping") == false) { rigid.AddForce(Vector2.up * jumpSpeed, ForceMode2D.Impulse); animator.SetBool("isJumping", true); } //Animator if(Mathf.Abs(rigid.velocity.x) < 0.3) //횡이동 속도 0.3보다 작으면 멈춘 상태로 간주,Idle로 전환 { animator.SetBool("isWalking", false); } else //움직이고 있는 상태 { animator.SetBool("isWalking", true); }
기존에는 이중점프를 방지하게 하기 위해서 지금 점프중인가? 라는 걸 bool타입의 isJump 변수를 생성해서 땅과 충돌하면 false로 바꾸고 다시 점프 가능하게 해주었다. isJump가 false이고, Jump키가 눌렸을때만 점프가능하게 했었는데, 애니메이션 컨트롤러의 불리언값 isJumping을 불러와서 얘가 false면 점프하게 만들어주었다.
animator.getBool("isJumping");
* Animator클래스의 getBool을 이용하면 매개변수로 전달한 변수의 값을 가져올 수 있다.
참고로 땅에 닿았을때는 아래 코드처럼 bool값을 false로 만들어주어 다시 점프를 재개할 수 있게끔 만들어주었다.
private void OnCollisionEnter2D(Collision2D collision) { if(collision.gameObject.tag == "Land") { animator.SetBool("isJumping", false); } }
3. Transition inspector
예시로 가져온 jump -> idle transition Transition은 애니메이션 상태를 옮겨가는 통로를 의미한다. Animator창에서 화살표(transition)을 클릭하면 inspector창에 위와 같은 여러 세팅들이 나온다. 하나씩 차례대로 찾아봤다.
* HasExitTime
애니메이션이 전환될때 지금 실행중인 애니메이션이 끝날때까지 기다려줄것인가? 를 의미
0~1사이 값을 가진다. 0은 하나도 기다리지 않는 것, 1은 끝까지 기다려 주는것을 의미한다.
* Transition Duration
애니메이션이 넘어가는데 얼마나 시간을 줄것인가?
0~1사이 값을 가진다. 0이면 상태전이가 바로 일어남, 1을 주면 매우 천천히 일어남 0.5는 한 50퍼센트정도 실행되다 기다려주는 정도를 나타낸다.
* Transition Offset
애니메이션이 어디서부터 실행될지 결정
이 값을 늘릴경우 애니메이션이 그만큼 뒤에서 실행된다. (이미지가 더 편할것 같아서 캡쳐해왔음)
idle 애니메이션이 반(0.5) 잘리고 실행된다 * Interruption Source
언제 애니메이션을 중단시킬 수 있는가?
None, CurrentState, next State, current state then next state, next state then current state가 있음
공식 문서에서 캡쳐해온 설명..! * Ordered Interruption
현재 전환이 순서와 관계없이 다른 전환에 의해 중단될 수 있는지 여부
+) 체크해두면 전환이 순서와 관계없이 중단됨에 따라 혼선이 일어날 수도 있으니 사용에 주의가 필요하다는 말도 있음
* Conditions
이 transition이 언제 일어나는지 조건을 설정할 수 있다. 아래 이미지는 jump->idle이므로 walking과 jumping불리언 변수 모두가 false여야한다.
참고로 조건이 아무것도 없으면 ExitTime만 고려한다. 그래서 Exit Time이 0인데 Conditions가 없는 상태라면 유니티 에디터에서 warning을 띄워준다.
여기까지 기본적인 것들을 공부해봤다. 더 알게 되는게 있으면 차차 추가할 예정..!
* 공부하는데 참고한 자료들(접은글)
더보기골드메탈님
www.youtube.com/playlist?list=PLO-mt5Iu5TeZGR_y6mHmTWyo0RyGgO0N_
유니티 기초 2D 플랫포머 [BE2]
유니티의 물리엔진을 활용한 2D 플랫포머 기초 강좌 채널. 에셋 : http://u3d.as/2mvJ
www.youtube.com
케이디님
www.youtube.com/playlist?list=PLUZ5gNInsv_PR72-V9bTABaZu2py4DJq8
유니티 강좌 [입문, 초보]
유니티 강좌 - 초보자와 입문자를 위한 유니티
www.youtube.com
유니티 공식 문서
docs.unity3d.com/kr/2019.4/Manual/AnimationSection.html
애니메이션 - Unity 매뉴얼
Unity의 애니메이션 기능은 리타겟팅 가능한 애니메이션, 런타임 시점에 애니메이션 비중의 완벽 제어, 애니메이션 재생 중 이벤트 호출, 고급 상태 머신 계층 구조 및 전환, 얼굴 애니메이션을
docs.unity3d.com
'Unity' 카테고리의 다른 글
Unity2D Player 이동 구현 (0) 2021.03.15 Unity 날씨 변화 구현하기 (0) 2021.01.05