-
[Unity] 2D Platformer Game 개발 #3: 플레이어 애니메이터 움직임2023년 12월 13일
- 유니얼
-
작성자
-
2023.12.13.:11
728x90안녕하세요! 이번 포스트에서는 Unity를 사용하여 2D 플랫포머 게임을 개발하는 시리즈의 세 번째 글로, 플레이어의 애니메이터 움직임을 구현하는 방법에 대해 알아보겠습니다. 이 글을 따라오면 플레이어의 움직임을 자연스럽게 표현할 수 있는 기초적인 애니메이션을 구현할 수 있습니다.
1. 플레이어 애니메이터 설정
게임 오브젝트의 애니메이터 컴포넌트를 사용하여 플레이어의 움직임을 제어할 것입니다. 아래는 설정 단계입니다.
1-1. 애니메이터 컨트롤러 생성
Project 창에서 "Assets" 폴더 우클릭 → "Create" → "Animator Controller"로 새로운 애니메이터 컨트롤러를 생성합니다. 생성한 애니메이터 컨트롤러에 이름을 부여합니다. (예: "PlayerAnimator")
1-2. 플레이어에 애니메이터 컴포넌트 추가
플레이어 캐릭터에 애니메이터 컴포넌트를 추가합니다. 생성한 애니메이터 컨트롤러를 애니메이터 컴포넌트에 할당합니다.
2. 애니메이션 레이어 설정
2-1. 애니메이션 클립 추가
애니메이터 컨트롤러에서 플레이어의 상태에 따라 움직임을 표현할 애니메이션 클립들을 추가합니다. (Idle, Run, Walk등) 2D 게임에서 애니메이터에서 사용할 애니메이션을 추가하는 방법은 여러가지가 있습니다. 애니메이션을 만들때 사용할 리소스들은 이전 글에서 다운 받으실 수 있습니다.
https://unialgames.tistory.com/entry/Unity2DPlatfomerGameDevStep1
방법 1 :
애니메이션으로 만들 이미지를 여러장 선택하고 Animator가 설정된 Player 게임 오브젝트에 드래그 드랍 시키면 해당 애니메이션을 저장하고 애니메이터에 애니메이션이 추가 됩니다.
방법 2 :
플레이어 게임 오브젝트를 선택하고 애니메이션 창을 띄웁니다.(Ctrl + 6) 그리고 Create버튼을 누르거나 기존 애니메이션에서 Create New Clip 버튼을 눌러서 새로운 애니메이션을 추가합니다. 그리고 사용할 이미지 리소스를 드레그 드랍 시키면 애니메이션이 만들어 집니다.
2-2. 파라미터 추가
애니메이터 창에서 "Parameters" 창을 열고, "Bool" 타입의 파라미터들을 추가합니다. (예: "isMoving", "isRunning" 등) 각 파라미터는 특정 상태를 나타내고, 코드에서 조작하여 애니메이션을 변경할 때 사용됩니다.
3. 스크립트 작성
이제 플레이어의 움직임에 따라 애니메이션을 변경하는 스크립트를 작성해봅시다. 스크립트는 플레이어의 입력 및 상태를 감지하여 애니메이터에 전달하는 역할을 합니다.
PlayerController.cs
[RequireComponent(typeof(Rigidbody2D))] public class PlayerController : MonoBehaviour { public float walkSpeed = 5.0f; public float runSpeed = 8.0f; public float CurrentMoveSpeed { get { if (IsMoving) { if (IsRunning) { return runSpeed; } else { return walkSpeed; } } else { return 0; } } } Vector2 moveInput; [SerializeField] private bool _isMoving = false; public bool IsMoving { get { return _isMoving; } set { _isMoving = value; animator.SetBool(AnimationStrings.IsMoving, _isMoving); } } [SerializeField] private bool _isRunning; public bool IsRunning { get { return _isRunning; } set { _isRunning = value; animator.SetBool(AnimationStrings.IsRunning, _isRunning); } } private bool _isFacingRight = true; public bool isFacingRight { get { return _isFacingRight; } private set { if (_isFacingRight != value) { transform.localScale *= new Vector2(-1, 1); } _isFacingRight = value; } } Rigidbody2D rb; Animator animator; private void Awake() { rb = GetComponent<Rigidbody2D>(); animator = GetComponent<Animator>(); } // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } private void FixedUpdate() { rb.velocity = new Vector2(moveInput.x * CurrentMoveSpeed, rb.velocity.y); } public void OnMove(InputAction.CallbackContext context) { moveInput = context.ReadValue<Vector2>(); IsMoving = moveInput != Vector2.zero; SetFacingDirection(moveInput); } private void SetFacingDirection(Vector2 moveInput) { if(moveInput.x > 0 && !isFacingRight) { isFacingRight = true; } else if(moveInput.x < 0 && isFacingRight) { isFacingRight = false; } } public void OnRun(InputAction.CallbackContext context) { if (context.started) { IsRunning = true; } else if (context.canceled) { IsRunning = false; } } }
AnimationStrings.cs
public class AnimationStrings { //Lesson_4 public static string IsMoving => "isMoving"; public static string IsRunning => "isRunning"; }
마무리
이제 여러 가지 상태에 따른 애니메이션을 추가하고, 플레이어의 움직임을 더욱 다양하게 표현할 수 있습니다. 다음 블로그 글에서는 TileMap Editor를 통해서 배경을 꾸미는 법에 대해서 다룰 예정입니다.
반응형다음글이전글이전 글이 없습니다.댓글