이번 시간은 Unity 2D를 이용해서 간단한 게임을 만들어볼까 합니다.
Unity 2D가 무엇인지 알고 싶다면 아래 링크에 들어가 주시길 바랍니다.
게임 개요 및 생성(에셋 적용)
게임 개요
게임 개발 순서 |
1차 - 타일맵 생성과 플레이어 생성 및 이동 |
2차 - 적 생성 및 파괴와 랜덤 위치 생성 |
3차 - 충돌 후 애니메이션 전환 및 싱글톤 |
4차 - UGUI & 스코어 및 Player Dead |
생성(에셋 적용)
Unity Hub에서 새 프로젝트 생성합니다.
Asset Store에서 자신의 원하는 에셋을 가져와 Package Manager을 통해 새 프로젝트에 적용합니다.
타일맵 제작 및 플레이어 생성 및 이동
타일맵 제작
2D Object – Tilemap – Rectangular눌러 Tile을 생성하여 맵 생성 준비합니다.
모든 객체 생성 시 위치 초기화 이후 이동합니다.
또한 나중에 화면에 겹쳐서 화면에 안 보일 수 있는 경우를 대비합니다.
타일맵을 설정하기 위해 카메라 위치를 중앙에 고정합니다.
Tile Palette창을 열어 Create New Palette로 새로운 타일맵 생성(TilePalette 창이 없으면,
메뉴 – Window – 2D – Tile Palette로 창 생성을 생성합니다.
바닥으로 사용할 이미지를 Assets 폴더에 불러오고 Tile Palette 창으로 드래그하고 지정할 위치를 선택합니다.
위 영상처럼 브러쉬를 클릭 후 그려낼 타일을 선택하면 Scene 화면에서 드래그합니다.
씬 화면에서 타일사이즈와 그리드사이즈가 다를 경우
Inspector창 – Pixels Per Unit의 크기를 원본사이즈로 설정합니다.
예시) 128 * 128 – Pixels Per unit = 128, 64 * 64 - Pixels Per unit = 64
브러시로 바닥을 그려준 땅 부분을
Add Component – Tilemap Collider 2D와 Tilemap Collider 2D Rigidbody 2D 추가합니다.
(Ccomposite Collider 2D가 타일마다 적용된 Collider를 합쳐주기 때문에 추가)
Rigidbody 2D에 있는 Body Type을 Static으로 적용합니다.
(오브젝트와 충돌할 경우 움직일 수 없는 오브젝트처럼 작동시키기 위해서)
Tilemap Collider 2D에 있는 Used By Composite 체크해 줍니다.
플레이어 생성 및 이동
애니메이션이 포함된 에셋을 Scene창이나 Hierarchy창에 드래그하여 플레이어 캐릭터를 생성하면
자동으로 애니메이션 클립과 애니메이터 컴포넌트가 자동으로 적용하게 해 줍니다.
이제 캐릭터를 생성하여 Instance(인스턴스) 안에 충돌 처리를 위해서 Collider와 Rigidbody 컴포넌트 추가합니다.
플레이를 하면 Collider와 Rigidbody에 의해서 플레이어가 바닥으로 떨어지면서 타일 위에 안착합니다.
project창에서 생성하거나 Add Component로 스크립트 이름을 타이핑한 후 생성합니다.
Project창에서 Input시스템 생성하여 키보드 입력 후,
이동은 Input.GetAxis로 키보드의 입력을 받고 캐릭터의 Rigidbody를 이용하여 움직이게 만듭니다.
이제 코드를 생성하여 플레이어를 움직일 코드를 제작합니다.
- 플레이어의 상태와 이벤트 등을 살펴보는 코드
- 플레이어 객체가 움직일 때 키 입력값을 받아 움직임
- Input 시스템을 이용 및 코드 작성
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour { // 플레이어 오브젝트에 코드 생성
void Start () {
}
// Update is called once per frame
void Update () { // Update 함수는 매프레임마다 호출하는 함수
horizontal = Input.GetAxis("Horizontal");
Debug.Log("horizontal" + horizontal); // 키의 입력값을 확인하기 위해 Debug 코드 사용
방향키를 눌러보면 값이 변동되는 것을 확인합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Player : MonoBehaviour {
private Rigidbody2D rigidbody;
private float speed = 8; // Rigidbody 변수 등을 클래스 안에 삽입
void Start () { // 함수는 첫 번째 프레임 업데이트 전에 호출
rigidbody = GetComponent<Rigidbody2D>();
// Get Component는 게임 오브젝트의 컴포넌트를 불러옴
}
// Update is called once per frame
void Start () {
horizontal = Input.GetAxis("Horizontal");
PlayerMove();
}
private void PlayerMove() // Debug 내용을 삭제하고 PlayerMove()라는 함수를 하난 만듬
{
rigidbody.velocity = new Vector2(horizontal * speed, rigidbody.velocity.y); // Velocity - Rigidbody 컴포넌트의 속도값
}
}
게임을 실행하면 좌우로 움직이는 것을 확인하실 수 있습니다.
플레이어 달리기를 만들기 위해 플레이어를 생성했던 것과 같은 방식으로 적용 후
Controller 파일과 게임 오브젝트는 삭제합니다.
애니메이터 창으로 들어와 플레이어 달리기 클립을 드래그하여 적용, Make Transition 양쪽을 연결합니다.
흰색 선을 클릭 – Inspector 창에서 Has Exit Time 체크해제, Fixed Duration 체크해제,
Transition Duration = 0으로 변경합니다.
좌측상단의 Parameters창 - ‘+’ - float로 파라미터 생성하며
흰색선 – Conditions - ‘+’ - Greater – 0.01,
반대쪽 흰색선 – Conditions - ‘+’ - Less – 0.01 설정합니다.
public class Player : MonoBehaviour {
private Rigidbody2D rigidbody;
private Animator animator; // 변수 선언
private float speed = 3;
private float horizontal;
void Start () { // Start()함수에 Animator = GetComponent<Animaitor>(); 입력
rigidbody = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
}
// Update is called once per frame
void Update () {
horizontal = Input.GetAxis("Horizontal");
PlayerMove();
}
private void PlayerMove()
{ // animator.setfloat(“Speed”, Mathf.Abs(horizontal)); 입력
animator.SetFloat("speed",Mathf.Abs(horizontal));
// SetFloat : float 파라미터 값을 할당, Mathf.Abs(val) : val의 절대값을 반환
rigidbody.velocity = new Vector2(horizontal * speed, rigidbody.velocity.y);
}
}
게임을 실행하면 움직이면 애니메이션이 바뀌는 것을 알 수가 있습니다.
Sprite Penderer의 File - ‘X’를 체크하면 이미지가 좌우 반전으로 바꾸어 키의 입력 값에 따른 반전을 줍니다.
public class Player : MonoBehaviour { private Rigidbody2D rigidbody; private Animator animator; private SpriteRenderer renderer; // SpriteRenderer renderer; 변수입력 private float speed = 8; private float horizontal; void Start () { // Start() GetComponent로 컴포넌트 오브젝트를 지정
rigidbody = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
renderer = GetComponent<SpriteRenderer>();
}
// Update is called once per frame
void Update () {
// Input.GetAxis(“Horizontal”)은 좌측키는 음수 우측키는 양수를 반환
horizontal = Input.GetAxis("Horizontal");
PlayerMove();
}
private void PlayerMove()
{
//PlayerMove()함수에 if(horizontal < 0){render.fileX = true;} else{render.fileX = flase}입력
animator.SetFloat("speed",Mathf.Abs(horizontal));
if(horizontal < 0)
{
renderer.flipX = true;
}
else
{
renderer.flipX = false;
}
rigidbody.velocity = new Vector2(horizontal * speed, rigidbody.velocity.y);
}
이제 게임을 실행하면 적용된 것을 확인할 수 있을 겁니다.
읽어주셔서 감사합니다.^^
'Unity > Unity 2D' 카테고리의 다른 글
[Unity 2D]장애물 피하기 게임 (2) (1) | 2024.10.10 |
---|---|
Unity 2D 텍스트와 씬에 대해 알아보자(2) (0) | 2024.09.12 |
Unity 2D 텍스트와 씬에 대해 알아보자(1) (0) | 2024.09.11 |
Unity 2D 물리 레퍼런스에 대해 알아보자 (1) | 2024.09.10 |
Unity 2D Asset(에셋) 및 애니메이션에 대해 알아보자 (2) | 2024.09.09 |