일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 크래프톤 정글랩
- 오픽 im1
- 게임 독학
- 크래프톤 정글 게임랩
- protobuf란
- 유니티 스토리
- 크래프톤 정글 게임 랩
- 유니티
- unity 게임
- unity 공부
- 게임 개발
- 크래프톤 게임 정글 랩
- unity 설치
- Unity 독학
- 유니티 미연시
- Unity Chess
- protobuf 란?
- 유니티 독학
- 유니티 퀘스트
- 유니티 대화
- unity 게임 개발
- ETRI 연구연수
- unity 강의
- node.js
- 유니티 체스
- 크래프톤
- unity 개발
- 게임 개발 독학
- 오픽 im1 5일
- unity
- Today
- Total
하참이의 아이디어노트
Unity 강의 5일차 (3) - 캐릭터 애니메이션 본문
본 강의는 다음 문서를 참고하여 제작하였습니다. 자세한 내용은 하단 링크를 참조하시거나 댓글로 질문 남겨주시면 성심성의껏 답변 드리겠습니다.
3.3강 - 생동감 있는 캐릭터 만들기 - Unity Learn
개요: 이제 게임은 그럴싸하게 만들어졌는데, 플레이어 캐릭터의 생동감이 부족하네요. 캐릭터가 지면을 미끄러지듯 이동하는 것이 아니라, 달리고, 점프하고, 사망하는 등의 애니메이션을 만
learn.unity.com
이제 게임으로 보일만한 요소는 얼추 가춰졌습니다 (아직 만족 못하시는 분들도 계실 것 입니다. 이해합니다.)
게임이 움직이기는 하지만 뭐 사운드도 없고, 캐릭터는 그냥 공중을 날듯이 해괴한 모습으로 점프하고있고... 고쳐야할점이 산더미네요.
그렇게 생각하시면 오히려 좋습니다! 더 다양한 기능을 배우고 싶다는 뜻 이니까요.
이번시간에는 캐릭터에게 애니메이션을 추가하는 방법을 배워봅시다.
Player에게 적용되어있는 Animator 컴포넌트에 Controller를 더블클릭하여 '애니메이션 컨트롤러'에 접근합니다.


해당 애니메이션 창은 Window - Animation - Animator로도 접근할 수 있습니다.
흠... 무언가들이 엄청 연결되어있네요. Walk를 더블클릭해봅시다.

헉! 영문모를 폴더로 온것같아요!
바로 Animator에서 강조하는 Animation이 들어있는 Assets 폴더입니다. Clips에는 여러가지 Animation이 들어있는 것을 확인 할 수 있죠.
최하단의 Idle을 클릭하면 다음과 같이 애니메이션을 볼 수 있고, Clips에서 고른 다양한 애니메이션을 미리 볼 수 있습니다.

Walk를 한 번만 클릭하여 Walk 애니메이션에 대한 정보를 Inspector 창에 띄워봅시다.

최하단에 Transactions가 존재하는 것을 볼 수 있습니다.
애니메이션은 자연스러움이 중요합니다. 그리고 어느 상태에서 어느 상태로 이동하느냐가 자연스러움을 만드는데에 큰 역할을 합니다. Transactions는 해당 애니메이션에서 어떤 애니메이션으로 이동할 수 있는지 경로를 나타냅니다. Animator창에서도 Walk는 Idle과 Run이 연결되어있는 것을 볼 수 있습니다.
Idle을 누르고 Transactions에서 Idle -> Walk를 클릭해봅시다.

맨 하단에서 애니메이션이 할당 된 게임 오브젝트가 전환되는 애니메이션을 수행하는 것을 볼 수 있습니다.
그리고 프로그래스바 사이에는 Condition이라는 것이 존재합니다.
애니메이션이 전환되기 위한 조건값들을 의미합니다.

Static_b가 false이고 Speed_f가 0.25 이상이어야 한다고 하네요. (Greater)
한 번 조정을 해 보겠습니다.
Animator 창 에서 Parameter값들을 봅시다.

이 Parameters는 애니메이션들을 전환하기 위한 condition에 사용 되는 변수들입니다.
맨 위에 Speed_f가 보이는 것을 확인할 수 있습니다. 값을 0.3으로 변경해봅시다.

게임을 실행해보면 walk_static이 적용되며 캐릭터가 움직이는 것을 확인할 수 있습니다.

하지만 걷는것은 배경의 속도에 비해 캐릭터가 너무 여유로워보입니다.
달리기 위한 속도를 체크해봅시다.

0.5로 설정되어있네요. 넉넉하게 Speed_f를 1로 수정해봅시다.

사진으로만 봤는데도 캐릭터가 매우 역동적으로 움직이는 것을 확인할 수 있습니다.
하지만 점프를 하는 것 역시 애니메이션이 자연스럽지 않네요. 점프 애니메이션은 없을까요?
Animator 창의 좌측에 Jumping탭이 있는것을 보아 점프 애니메이션도 준비되어있는 것을 확인할 수 있습니다.


이번에는 스크립트를 이용하여 애니메이션을 전환해보겠습니다.
PlayerController를 다음과 같이 수정합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private Rigidbody playerRb;
public float jumpForce = 10;
public float gravityModifier = 1;
public bool isOnGround = true;
public bool gameOver = false;
private Animator playerAnim;
// Start is called before the first frame update
void Start()
{
playerRb = GetComponent<Rigidbody>();
playerAnim = GetComponent<Animator>();
Physics.gravity *= gravityModifier;
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && isOnGround)
{
playerRb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
isOnGround = false;
playerAnim.SetTrigger("Jump_trig");
}
}
private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("Ground"))
{
isOnGround = true;
}
if (collision.gameObject.CompareTag("Obstacle"))
{
gameOver = true;
Debug.Log("Game Over");
}
}
}
캐릭터가 굉장히 역동적으로 점프하는 것을 볼 수 있습니다.

그런데 점프 애니메이션이 너무 빨리 끝납니다. 땅에 닿기도 전에 달리기 애니메이션이 나오네요.
이럴 경우엔 애니메이션의 재생 속도를 줄여 애니메이션의 길이를 늘리는 방법이 있습니다.
Running_Jump의 Speed를 0.7정도로 수정해봅시다.

이것 외에도 점프를 자연스럽게 바꾸는 법은 Player 오브젝트의 Rigidbody.Mass를 변경하거나 PlayerController에서 부여했던 JumpForce, GravityModifier를 수정할 수 있습니다.
성인 남성의 몸무게는 약 70정도 합니다. Mass를 70으로 변경하여봅시다. 또한 중력 가속도는 1.9이므로 Gravity Modifier를 1.9로 설정해보죠. 이렇게 현실과 비슷한 단위를 사용하여 디테일하게 조절할 수 있습니다. 단, 이러면 점프가 너무 무거워지겠네요. JumpForce를 강하게 하여 점프력을 키워봅시다. JumpForce는 800으로 해보겠습니다.
마지막으로 사망 처리 애니메이션을 설정해보겠습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private Rigidbody playerRb;
public float jumpForce = 10;
public float gravityModifier = 1;
public bool isOnGround = true;
public bool gameOver = false;
private Animator playerAnim;
// Start is called before the first frame update
void Start()
{
playerRb = GetComponent<Rigidbody>();
playerAnim = GetComponent<Animator>();
Physics.gravity *= gravityModifier;
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && isOnGround && !gameOver)
{
playerRb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
isOnGround = false;
playerAnim.SetTrigger("Jump_trig");
}
}
private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("Ground"))
{
isOnGround = true;
}
if (collision.gameObject.CompareTag("Obstacle"))
{
gameOver = true;
Debug.Log("Game Over");
playerAnim.SetBool("Death_b", true);
playerAnim.SetInteger("DeathType_int", 1);
}
}
}
게임이 오버되었을 경우 점프를 막고, 게임 사망 처리를 하였습니다.
이제는 진짜 미니게임이라고 불러도 훌륭하겠네요!
다음시간에는 효과음과 이펙트에 대해 다뤄보도록 하겠습니다.
감사합니다!
'Unity > Unity 기초' 카테고리의 다른 글
Unity 강의 6일차 (1) - 풍선, 폭탄, 부울 (0) | 2025.01.21 |
---|---|
Unity 강의 5일차 (4) - 파티클 및 음향 효과 (0) | 2025.01.20 |
Unity 강의 5일차 (2) - 점프 게임 디테일 추가 (0) | 2025.01.20 |
Unity 강의 5일차 (1) - 점프 게임 환경 설정 (0) | 2025.01.20 |
Unity 강의 4일차 (1) - 물어 오기 놀이 (0) | 2025.01.17 |