[C#/Unity]벽돌깨기 기능개발 하기전 고민

2024. 10. 17. 21:27카테고리 없음

벽돌깨기 게임을 구현할때 

 

-패들이 구슬을 받는다

-구슬이 벽돌과 충돌한다

-충돌당한 벽돌이 사라진다

-사라진 자리에서 아이템이 나올수도 있다.

 

 

오늘은 아이템이 나오는 로직을 구현하며 고민했던 생각을 포스팅 해봅니다.

 

 

"벽돌이 깨짐(이벤트 발생!!)"


이후에...

  • 1.벽돌이 아이템을 가지고 태어난다.
  • 2.게임매니저(싱글톤)가 아이템을 호출한다.

 

1번의 경우 

- 장점 : 블럭 개별적으로 아이템이 있는지 없는지 판단이 완료된 상태이므로 플레이중 추가적인 연산이 필요없음.

- 단점 : 첫 게임씬을 불러올때 오래걸림,모든 블럭을 깨지 않는다면 불필요한 정보까지 가지고 있어야함.

 

2번의 경우

- 장점 : 첫 게임씬을 불러올때 빠름/유지보수와 확장성이 용이함.

- 단점 : 벽돌이 깨질때마다 호출발생함.

 

이외 1번의 특성과 2번의 특성을 가진 

- 블럭이 생성될때 생성될 아이템 타입을 정해두고 게임매니저에 호출한다.

 

기능을 구현할때 완성만 바라보는게 아닌 추후 확장성과 관리할때를 더욱 생각하는게 참 어려운거 같다...

만약 블럭이 100개,1000개....1만개 늘어난다던가 블럭이 깨질때 가 아닌 시간이 경과했을때 생성됐을때 라던가 조건을 생각해서 2번방식으로 구현을 진행했다.

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;
	////.......
    
    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
        }

    }
    
    public void BrickDestroyed(Vector3 position) //아이템 스폰요청
    {
        ItemManager.Instance.SpawnItem(position);
    }
}
using UnityEngine;


// 아이템 타입 정의
public enum ItemType
{
    PowerUp,   // 구슬 파워 업
    AddBall,   // 구슬 추가
    Increase   // 패들 확장
}

public class ItemManager : MonoBehaviour
{
    public static ItemManager Instance;  // 싱글톤 패턴

    public GameObject powerUpPrefab;     // 파워업 아이템 프리팹
    public GameObject addBallPrefab;     // 구슬 추가 아이템 프리팹
    public GameObject increasePaddlePrefab; // 패들 확장 아이템 프리팹

    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
        }
        else
        {
            Destroy(gameObject);
        }
    }

    // 아이템 생성 함수
    public void SpawnItem(Vector3 position)
    {
        float randomValue = Random.Range(0f, 100f);

        if (randomValue <= 30f)
        {
            // 아이템 생성 안 함 (70% 확률)
            return;
        }

        ItemType itemType = GetRandomItemType();
        GameObject itemPrefab = null;

        // 아이템 타입에 따른 프리팹 선택
        switch (itemType)
        {
            case ItemType.PowerUp:
                itemPrefab = powerUpPrefab;
                break;
            case ItemType.AddBall:
                itemPrefab = addBallPrefab;
                break;
            case ItemType.Increase:
                itemPrefab = increasePaddlePrefab;
                break;
        }

        // 아이템 생성
        if (itemPrefab != null)
        {
            Instantiate(itemPrefab, position, Quaternion.identity);
        }
    }

    // 랜덤으로 아이템 타입을 결정하는 함수
    private ItemType GetRandomItemType()
    {
        float randomValue = Random.Range(0f, 31f);
        if (randomValue < 10f)
        {
            return ItemType.PowerUp;
        }
        else if (randomValue < 20f)
        {
            return ItemType.AddBall;
        }
        else
        {
            return ItemType.Increase;
        }
    }
}