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