
애니메이션 파라미터를 이전에 Trigger로 연결했다. 그러면 애니메이션 2개만 서로 연결하기에는 적합하다. 예를 들어 점프와 달리기 애니메이션만 있는 경우는 적합하다.
하지만 만약 애니메이션 상태 5개를 왔다갔다 해야한다면? 트리거로 연결하고 관리하기 번거롭고 짜증난다. 그럼 이런 경우 어떻게 해야 효율적으로 애니메이션 상태를 왔다갔다할 수 있을까?
애니메이션 파라미터로 "Int"를 이용하자. 각 애니메이션에 1,2,3,4,5 식으로 번호를 붙여주면, 원하는 번호의 애니메이션을 호출하면 된다. >.<
그럼 레츠끼끼.
애니메이션 파라미터 : 애니메이션 컨트롤러에 정의하는 변수로 스크립트에서 애니메이션 상태머신을 제어할 때 사용한다.
애니메이션 상태 (정수 1~5)까지에 따라 애니메이션이 바뀌도록 MovementController cs를 수정하자!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MovementController : MonoBehavior
{
public float movementSpeed = 3.0f;
Vector2 movement = new Vector2();
Animator animator;
string animationState = "AnimationState";
/* 하드코딩을 피하기 위해서. 문자열을 변수에 한번 대입해놓고 문자열을 참조해야 할 떼마다 이 변수를 사용해서 버그가 일어날 가능성을 원천차단해야 한다. */
Rigidbody2D rb2D;
//Rigidbody2D의 참조를 저장할 변수를 선언한다.
**enum CharStates**
{ **/* "enum"데이터 형식을 사용하면 열거형 상수를 선언할 수 있다. 각 열거형 상수는 뒤에 적은 int 등의 값과 일치하므로 열거형을 참조하면 해당 값을 얻을 수 있다. */**
walkEast = 1,
walkSouth = 2,
walkWest = 3,
walkNorth = 4,
idleSouth = 5
}
private void Start()
{
rb2D = GetComponent<Rigidboidy 2D>();
/* GetComponent 메서드는 Type 형식의 파라미터를 입력 받아서 현재 게임 오브젝트가 지닌 컴포넌트 중에서 Type이 동일한 컴포넌트가 있으면 반환하는 메서드다. */
animator = GetComponent<Animator>();
}
private void Update()
{
**UpDateState();
/* 애니메이션 상태 머신을 업데이트하려고 작성한 함수를 호출한다. 코드를 깔끔하게 유지하고 가독성을 높이고자 업데이트 로직을 별도의 메서드로 옮겼다. */**
}
void FixedUpdate()
{
**MoveCharacter();**
}
private void MoveCharacter()
{
**movement.x = Input.GetAxisRaw("Horizontal");
movement.y = Input.GetAxisRaw("Vertical");**
/* Input 클래스는 사용자의 입력을 획득할 수 있는 방법을 제공한다. 이 코드는 GetAxisRaw() 메서드를 사용해서 사용자 입력을 획득하고 획득한 값을 Vector2 구조체의 x와 y 변수에 대입한다. GetAxisRaw() 메서드는 입력을 받을 2D 축을 지정하는 Horizontal 이나 Vertica(수직)을 파라미터로 받고, 유니티 입력 매니저가 전달하는 -1, 0, 1 을 반환한다. */
movement.Normalize();
// 벡터를 정규화(normalize)해서 플레이어가 대각선, 수직, 수평, 어느 방향으로 움직이든 일정한 속력을 유지하게 한다.
rd2D.velocity = movement * movementSpeed;
// movement벡터와 movementSpeed을 곱한 결과를 velocity에 대입하면 플레이어가 움직인다.
}
**private void UpdateState()
{
if(movement.x > 0)
{
animator.SetInteger(animationState, (int)CharStates.walkEast);
}**
else if (movement.x < 0)
{
animator.SetInteger(animationState, (int)CharStates.walkWest);
}
else if(movement.y > 0)
{
animator.SetInteger(animationState, (int)CharStates.walkNorth);
}
else if(movement.y < 0)
{
animator.SetInteger(animationState, (int)CharStates.idleSouth);
}
}
} SetInteger() 는 문자열과 int값, 2개의 파라미터를 받는다.