Unity 2D 게임 만들기(충돌처리 및 캐릭터 따라가기)

_am10.24·2023년 11월 13일
0

Unity 유니티

목록 보기
1/3
post-thumbnail

💬 오늘은 Unity 2D 게임을 만들 예정입니다. Tilemap으로 맵을 구성하고, 방향키와 스페이스키를 이용한 캐릭터 이동 + 충돌처리 + 캐릭터 따라가기 기능을 구현해보도록 하겠습니다.

Unity에서 New project를 선택한 후, 2D-Core를 선택한다. (프로젝트명은 아무거나 하시면 됩니다)

그럼 화면이 이렇게 뜰텐데, 우선 게임의 가장 기초가 되는 맵을 구성해야 한다. Tilemap을 이용하여 맵을 구성하면 된다. 우선, Tilemap을 만들기 전에 Assets부터 추가해주도록 하겠다. 에셋이 없다면 Unity의 Asset store, 게임마당, itch.io 등 유니티 에셋들이 제공되는 사이트들에서 원하는 에셋을 다운받는다.(저는 무료 에셋으로 다운받았어요)
에셋을 다운 받았으면, Unity 프로젝트에 에셋을 추가해준다. 그냥 다운받은 에셋을 화면에 보이는 것처럼 Project-Assets란에 끌어서 놔주면 에셋을 추가할 수 있다.

이제 Tilemap을 만들어보도록 하겠다. 아래 사진처럼 Hierarchy창에서 2D Object-Tilemap-Rectangular를 선택한다.

Tilemap을 추가해주었다면 Window-2D-Tile Palette를 클릭해준다.

그러면 이런 화면이 뜰텐데, Create New Palette를 눌러주고 Name은 아무거나 설정한 후(저는 Platform Palette로 했어요)Create를 눌러준다.

그러고나서 다운 받은 에셋을 추가해준다.

여기서 중요한 점! Player와 Enemy라는 game object들이 계단을 오르내리도록 설정할건데, 계단 부분(즉, 점프가 필요한 구간)은 tilemap을 "Stairs"라고 설정해줄 것이다.

똑같이 2D Object-Tilemap-Rectangular을 눌러 Tilemap을 생성하고 이름을 Stairs라고 바꿔주면 된다. 아래 사진에서 빨간색으로 표시된 부분이 Tilemap-Stairs이다.

Stairs라는 Tilemap을 따로 설정해주는 이유는, Enemy라는 game object가 계단을 만났을 때 점프하도록 만들기 위함이다. 근데 저렇게 만들면 외관상 예쁘지가 않기 때문에,, 다시 Tilemap으로 덮어줄 것이다.

이때, Tilemap과 Stairs에 Layer과 Tag를 설정해주어야 한다.(처음에 깜빡하고 Tilemap이랑 Stairs에 Tag 및 Layer 설정을 안해줘서 급하게 넣었어요..)

여기서, Tilemap과 Stairs에 Tilemap Collider2D라는 컴포넌트를 추가한다.(Inspector 창에서 Add Component를 누른 후, Tilemap Collider 2D 검색)

여기서 Tilemap Collier 2D를 추가해주는 이유는 game object와의 충돌을 할 수 있도록 하기 위함이다. 만약에 이를 추가해주지 않는다면, game object가 tilemap을 하나의 그림으로만 인식하여 충돌이 되지 않는다.

그다음 Player와 Enemy라는 game object를 하나 만들어보자.
Inspector 창에서 Add Component를 누르고 Player와 Enemy에 각각 Box Collider 2D, Sprite Renderer, Rigidbody 2D라는 컴포넌트들을 추가해준다.
그 전에, 여기서도 Tag와 Layer을 추가해주어야 한다.

Layer를 누르고 Add Layer를 누르면 뒤, Player이라는 Layer를 추가해준다.

이때, Tag도 똑같이 Player라고 지정해준다.

Enemy도 똑같이 Layer와 Tag를 Enemy로 맞춰준다.
이때, Enemy라는 Tag가 따로 없기 때문에 Add Tag를 누르고

Enemy라는 새로운 Tag를 추가해주었다.

Enemy도 Tag, Layer 설정이 끝났다.

이 다음에 우리가 해야할 것은, 캐릭터에 사진을 추가해주는 것이다.(그래야 알아보기 쉬우니까..) Sprite Renderer창에서 Sprite에 본인이 원하는 사진을 집어넣는다.(저는 Player을 흰색, Enemy를 검정색으로 했어요)

이제, Player와 Enemy에게 코드를 집어넣어줄 것이다.
Project 창에서 오른쪽 클릭을 한 후, Create-C# Script를 선택하면 된다.

Player와 Enemy라는 C# script를 하나 생성하도록 하겠다. C# script를 생상했다면, Player.cs와 Enemy.cs에 아래 코드를 추가해준다.
<Player.cs>

using UnityEngine;
using UnityEngine.SceneManagement;

public class Player : MonoBehaviour
{
    public float moveSpeed;
    public float jumpForce;
    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        // 좌우 이동
        float moveHorizontal = Input.GetAxis("Horizontal");
        Vector2 movement = new Vector2(moveHorizontal, 0);
        rb.velocity = new Vector2(movement.x * moveSpeed, rb.velocity.y);
        // 점프
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
        }
    }

    // 충돌이 발생했을 때 호출되는 함수
    void OnCollisionEnter2D(Collision2D collision)
    {
        // 충돌한 객체의 태그가 "Enemy"인 경우
        if (collision.gameObject.CompareTag("Enemy"))
        {
            // 게임 종료
            EndGame();
        }
    }

    void Jump()
    {
        rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
    }

    void EndGame()
    {
        Debug.Log("Game Over");
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }
}

<Enemy.cs>

using UnityEngine;

public class Enemy : MonoBehaviour
{
    public Transform playerTransform; // 플레이어의 Transform을 저장하기 위한 변수
    public float moveSpeed; // 적의 이동 속도
    public float jumpForce;
    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    private void Update()
    {
        if (playerTransform != null)
        {
            // 플레이어 방향으로 이동
            transform.position = Vector2.MoveTowards(transform.position, playerTransform.position, moveSpeed * Time.deltaTime);
        }
    }
    private void Jump()
    {
        // 점프 힘을 가해줌
        rb.velocity = new Vector2(rb.velocity.x, 0f);
        rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
    }
    // 충돌이 발생했을 때 호출되는 함수
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("Stairs"))
        {
            // 게임 종료
            Jump();
        }
    }
}

그다음 이 C# script들을 Player와 Enemy에 적용해줄 것이다. C# script를 드래그해서 Inspector 창에 넣어주면 된다.

코드를 작성했다면 게임을 실행하기 전에 Player와 Enemy의 Rigidbody2D, Sprite Renderer, C# script, Box Collider 2D의 설정들을 확인해주자.
우선 Rigidbody 2D의 Freeze Rotation Z를 체크해주면 player, enemy라는 game object들이 계단에서 굴러떨어지지 않고 정상적으로 계단을 오르내릴 수 있음을 확인할 수 있을 것이다.

Player와 Enemy 둘 다 설정해준다.
Sprite Renderer과 Box Collider 2D는 따로 설정해줄건 없다.
이제 C# script 쪽을 확인해보자. Player script, Enemy script에서 Move Speed와 Jump Force를 설정해줘야 한다. 여기서 Move Speed는 game object의 이동 속도, Jump Force는 game object의 점프하는 힘을 뜻한다. 본인이 하고싶은 Move Speed, Jump Force를 적절한 값으로 설정해준다.(저는 사진처럼 설정했어요. Enemy의 Move Speed를 높이니까 바로 잡히길래;;그리고 Jump Force를 높였더니 벼룩마냥 너무 높이 뛰어서;;)

아무튼 이렇게 하면 웬만한 설정들은 끝났다.

게임을 실행해보면
1. 방향키를 이동하여 캐릭터 이동, space바를 누르면 캐릭터가 점프함
2. Enemy가 Player을 따라다님
3. Player와 Enemy가 만나면 충돌처리(게임 종료)
크게 3가지 기능들이 구현됨을 볼 수 있을 것이다.

profile
공부 기록

0개의 댓글