Unity/Unity 2D

[Unity 2D]장애물 피하기 게임 (1)

tangent0426 2024. 10. 9. 18:00
728x90
반응형

 


이번 시간은 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 창으로 드래그하고 지정할 위치를 선택합니다.

 

0

위 영상처럼 브러쉬를 클릭 후 그려낼 타일을 선택하면 Scene 화면에서 드래그합니다.

 

0

씬 화면에서 타일사이즈와 그리드사이즈가 다를 경우

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 체크해 줍니다.

플레이어 생성 및 이동

0

애니메이션이 포함된 에셋을 Scene창이나 Hierarchy창에 드래그하여 플레이어 캐릭터를 생성하면

자동으로 애니메이션 클립과 애니메이터 컴포넌트가 자동으로 적용하게 해 줍니다.

 

 

이제 캐릭터를 생성하여 Instance(인스턴스) 안에 충돌 처리를 위해서 ColliderRigidbody 컴포넌트 추가합니다.

 

0

플레이를 하면 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 컴포넌트의 속도값    
    }
}

 

0

게임을 실행하면 좌우로 움직이는 것을 확인하실 수 있습니다.

 

 

플레이어 달리기를 만들기 위해 플레이어를 생성했던 것과 같은 방식으로 적용 후

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);        
    }
}

 

0

게임을 실행하면  움직이면 애니메이션이 바뀌는 것을 알 수가 있습니다.

 

 

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);        
    }

 

0

이제 게임을 실행하면  적용된 것을 확인할  수 있을 겁니다.

 

읽어주셔서 감사합니다.^^

반응형