일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 게임 엔진 공부
- 개인 프로젝트
- 4월
- 5월
- 코딩 테스트
- 유니티 심화과정
- 수학
- 2025년
- 다이나믹 프로그래밍
- 2024년
- 3월
- 2023년
- 자료 구조
- 유니티
- 10월
- 백준
- 코딩 기초 트레이닝
- 골드메탈
- 단계별로 풀어보기
- 1월
- 6월
- C/C++
- todolist
- c++
- 기초
- 2월
- 2022년
- 입문
- 개인 프로젝트 - 런앤건
- 프로그래머스
- Today
- Total
기록 보관소
[Unity/유니티] 기초-뱀서라이크: 2D 셀 애니메이션 제작하기[03] 본문
개요
유니티 독학을 위해 아래 링크의 골드메탈님의 영상들을 보고 직접 따라 해보면서 진행 상황을 쓰고 배웠던 점을 요약한다.
https://youtube.com/playlist?list=PLO-mt5Iu5TeYI4dbYwWP8JqZMC9iuUIW2
📚유니티 기초 강좌
유니티 게임 개발을 배우고 싶은 분들을 위한 기초 강좌
www.youtube.com
뱀서라이크: 2D 셀 애니메이션[03]
1. 방향 바라보기
//Plyaer Script
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour {
Vector2 inputVec; //키보드 입력 값 변수
public float speed; //속도 관리 변수
Rigidbody2D rigid;
SpriteRenderer spriter;
void Awake() {
rigid = GetComponent<Rigidbody2D>();
spriter = GetComponent<SpriteRenderer>();
}
void FixedUpdate() {
//위치 이동
Vector2 nextVec = inputVec * speed * Time.fixedDeltaTime;
rigid.MovePosition(rigid.position + nextVec);
}
void OnMove(InputValue value) {
inputVec = value.Get<Vector2>();
}
void LateUpdate() { //프레임이 종료되기 전 실행되는 생명주기 함수
if (inputVec.x != 0) {
spriter.flipX = inputVec.x < 0; //왼쪽 방향키는 -1, 오른쪽 방향키는 1이므로 왼쪽 방향키는 참(true), 우측 방향키는 거짓(false)가 됨.
}
}
}
- SpriteRenderer의 Flip X 속성을 사용할 것이므로 스크립트에 SpriteRenderer 변수를 하나 만들고 초기화해주었다.
- LateUpdate 함수를 사용해 X축 방향키 입력이 없지 않다면, 즉 이동 중이라면 방향에 따라 Flip X 속성을 체크하고 체크하지 않고 할 것이다.
- 주석에도 있지만 왼쪽 방향키 입력은 최대 -1, 오른쪽 방향키 입력은 최대 1이므로 이를 이용해 if문을 추가적으로 사용하지 않고, 부등호를 사용해서 값을 주는 것도 가능하다.
2. 셀 애니메이션
3. 애니메이터 설정
- 현재 Entry와 연결된 노란색 상태의 애니메이션은 게임 실행시 가장 먼저 기본적으로 실행된다는 것을 의미한다.
- 추후 설정에 적힌 것을 보면 Layer Default State라고 하는듯 하다.
- 참고로 Animator 화면은 마우스 휠을 클릭해서 화면 시점을 움직이고(휠을 굴리면 확대/축소한다. 클릭해야함.), 마우스 좌 클릭으로 각 상자들을 옮길 수 있다.
- AnyState는 어떤 상태든 상관없이 조건이 충족되면 실행한다. 쉽게 말해서 플레이어가 뭘 하고 있었든 죽었다면 Dead 애니메이션이 실행되는 것이다.
- Transition : 상태 이동을 어떻게 할 것인지 설정하는 통로.
- Transition은 Animator 창의 Parameter를 통해서 상태 변경이 가능하다.
- 이렇게 각 Transition의 Conditions 설정은 끝났다.
- Dead는 Trigger라서 따로 설정할 값이 없다.
- Transition의 Inspector 창에 있는 Duration은 애니메이션이 부드럽게 변환되도록 도와주는 속성이다.
- 이번 프로젝트 같은 셀 애니메이션에서는 사용하지 않으므로 최소화하도록 한다.
- 테스트 전에 Animator를 Project/Console 창에 옮겨두어 파라미터를 직접 조작해 각 상태 변경을 볼 수 있었다.
- 마지막 Dead 애니메이션은 반복하지 않고 한번만 작동해야하므로 이를 좀 수정해주자.
4. 코드 작성하기
//Plyaer Script
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour {
Vector2 inputVec; //키보드 입력 값 변수
public float speed; //속도 관리 변수
Rigidbody2D rigid;
SpriteRenderer spriter;
Animator anim;
void Awake() {
rigid = GetComponent<Rigidbody2D>();
spriter = GetComponent<SpriteRenderer>();
anim = GetComponent<Animator>();
}
void FixedUpdate() {
//위치 이동
Vector2 nextVec = inputVec * speed * Time.fixedDeltaTime;
rigid.MovePosition(rigid.position + nextVec);
}
void OnMove(InputValue value) {
inputVec = value.Get<Vector2>();
}
void LateUpdate() {
anim.SetFloat("Speed", inputVec.magnitude); //Magnitude : 벡터의 순수한 크기 값
if (inputVec.x != 0) {
spriter.flipX = inputVec.x < 0;
}
}
}
- Animator 변수를 추가하고 초기화했다. 그리고 LateUpdate에서 앞서 생성했던 Animator의 float형 parameter Speed의 값을 지정해준다.
- Dead는 아직 몬스터가 없어서 일단 그대로 두는 것 같다.
5. 애니메이터 재활용
- 이 스프라이트들을 다 하나하나씩 위와 같은 과정으로 만들기에는 너무 힘들다. 그래서 이를 위해 애니메이터를 재활용하는 방법이 있다. 이를 위해서 일단 Farmer 1을 만들어 보자.
- 새로 애니메이터를 만들 것이므로 여기서 생성된 애니메이션은 모두 다 지워준다.
- Animator Override Controller : 애니메이션만 덮어 씌우는 에셋.
- 위에서 설정했던 상태, Transition 등이 모두 유지된 상태에서 작동할 애니메이션만 바꿀 수 있다.
- 새로 생성하거나 Ctrl + D로 복사해서 직접 바꾸는 것보다 훨씬 간편해 보인다.
'유니티 프로젝트 > 뱀서라이크' 카테고리의 다른 글
[Unity/유니티] 기초-뱀서라이크: 몬스터 만들기[05] (0) | 2023.05.22 |
---|---|
[Unity/유니티] 기초-뱀서라이크: 무한 맵 이동[04] (0) | 2023.04.08 |
[Unity/유니티] 기초-뱀서라이크: 새로운 인풋시스템 적용하기[02+] (0) | 2023.03.30 |
[Unity/유니티] 기초-뱀서라이크: 플레이어 이동 구현하기[02] (0) | 2023.03.24 |
[Unity/유니티] 기초-뱀서라이크: 2D 오브젝트 만들기[01] (0) | 2023.03.16 |