Unity) 랜덤 스폰을 이용한 2D 게임 만들기

_am10.24·2023년 11월 13일
0

Unity 유니티

목록 보기
2/3
post-thumbnail

💬 오늘은 탑뷰 시점으로 Unity 2D게임을 만들건데 게임 시작 할 때마다 Item 랜덤 스폰하기, Player가 Item을 먹으면 충돌처리를 일으켜서 Item을 먹은 것처럼 만들기, Enemy가 Player을 따라다니도록 한 후 이들이 충돌하면 Player가 죽도록 하는 기능을 구현해보도록 하겠습니다.

Unity에서 Create Project를 눌러 2D-core로 프로젝트를 하나 생성해준다.
우선 맵을 먼저 만들어야 하는데, 지난시간에 했던 방식대로 Tilemap을 이용하여 맵을 만들 것이다. Hierarchy창에서 오른쪽 클릭을 하여 2D Object-Tilemap-Rectangular을 선택하면 된다.
Tilemap을 만들었으면 Window-2D-Tile Palette에 들어가서 Asset을 추가하고, 맵을 하나씩 찍어준다.
(Tilemap을 이용해서 맵을 찍는 방법은 이전 포스트에 작성했으니 모르겠으면 참고하세요!)
참고자료

맵을 찍었다면 Player, Enemy, Item이라는 game object들을 추가해준다. Hierarchy창에서 우클릭을 한 뒤, Create Empty를 누른 다음
각각 이름을 아래 이미지처럼 바꿔주면 된다.
이후 Player, Enemy, Item1, Item2, Item3의 Inspector 창에 Sprite Renderer을 넣어준다.(본인이 원하는 이미지를 가져다가 Sprite에 넣으면 된다)
그리고, game object들의 크기는 Inspector창에서 본인이 원하는대로 사이즈 설정을 하면 된다.
그리고 중요한 점! Player와 Enemy game object에 Tag를 지정해준다. 만약에 태그가 없다면 Add Tag를 눌러 추가해주면 된다.
여기서 game obejct가 보이지 않는다면 Sprite Renderer의 Additional Settings 부분의 Sorting Layer부분을 Layer1으로 지정해준다. 그러면 game object가 정상적으로 보일 것이다.
이제 Player, Enemy, Item1, Item2, Item3에 C# script를 넣어주자.
<Player.cs>

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public float moveSpeed;

    //클릭좌표
    private UnityEngine.Vector3 targetPosition;

    void Start()
    {
        targetPosition = transform.position;
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        Debug.Log("Collision with: " + collision.gameObject.tag);

        if (collision.CompareTag("Enemy"))
        {
            Dead();
        }
    }

    public void Dead()
    {
        Destroy(gameObject);
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(1))
        {
            targetPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            targetPosition.z = transform.position.z;
        }

        // 목표 위치로 이동
        transform.position = Vector3.MoveTowards(transform.position, targetPosition, moveSpeed * Time.deltaTime);
    }
}

<Enemy.cs>

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour
{
    public float moveSpeed;

    private Transform playerTransform;

    void Start()
    {
        // 플레이어의 Transform을 가져오기
        playerTransform = GameObject.FindGameObjectWithTag("Player").transform;
    }

    void Update()
    {
        if (playerTransform != null)
        {
            // 플레이어 쪽으로 이동
            transform.position = Vector3.MoveTowards(transform.position, playerTransform.position, moveSpeed * Time.deltaTime);
        }
    }
}

<Items.cs>

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Items : MonoBehaviour
{
    public GameObject itemPrefab; // Item의 프리팹
    public int numberOfItems = 3; // 생성할 Item의 개수
    private void Start()
    {
        transform.position = new Vector3(Random.Range(-5, 4) + 0.5f, Random.Range(-5, 4) + 0.5f, 0);
    }
    void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("Player"))
        {
            // Player와 충돌했을 때의 처리
            CollectItem();
        }
    }

    void CollectItem()
    {
        // Item을 수집할 때의 동작
        Destroy(gameObject); // 현재 GameObject를 파괴하여 사라지게 함

        // 다른 수행할 작업 추가 가능
    }
}

이제 C# script들을 Player, Enemy, Item1, Item2, Item3의 Inspector창에 드래그 하여 각각 알맞게 넣어준다. 그러고 나서 Player와 Enemy의 C# script창에서 Move Speed는 적절하게 설정해준다.(저는 Player은 5, Enemy는 3으로 설정해줬어요)
그리고, Player와 Enemy의 Inspector창에서 create components를 눌러 Rigidbody 2D를 추가해준다.

여기서 Freeze Rotation Z 부분에 체크를 해준다. 이를 체크해주는 이유는 Item과 충돌을 했을 때 캐릭터가 회전을 하지 않도록 하기 위함이다.
그리고 Player와 Enemy의 Gravity Scale은 0으로 설정해준다. 그 이유는 이 게임은 탑뷰 시점으로 만드는 것이기 때문에 캐릭터가 떨어지는 것을 방지하기 위함이다.

마지막으로 Player, Enemy, Item1, Item2, Item3의 Inspector창에 Box Collider 2D라는 component를 추가해준다. Box Collider 2D를 추가해주는 이유는 game object들이 서로 충돌을 할 수 있게 하기 위함이다.
Player의 Box Collider 2D창에서 Is Trigger을 체크해주자. Is Trigger을 하는 이유는 Collider가 다른 Collider와 충돌했을 때 이벤트를 감지하게 하도록 하기 위함이다. Is Trigger 자체는 Collider 중 하나에만 설정을 하면 된다.
게임을 실행해보면
1. 우클릭을 하면 Player가 이동
2. Enemy가 Player을 따라다님
3. 게임 시작 할 때마다 Item 랜덤 스폰
4. Player가 Item과 충돌하면(Item을 먹으면)Item이 사라지도록 구현
5. Player와 Enemy가 만나면 충돌처리(게임 종료)
크게 5가지 기능들이 구현됨을 볼 수 있을 것이다.

profile
공부 기록

2개의 댓글

comment-user-thumbnail
2023년 11월 13일

개발자로서 배울 점이 많은 글이었습니다. 감사합니다.

1개의 답글