1. 개발 현황
https://www.youtube.com/watch?v=YOQZQ1hVp-w
1. 스프라이트 추가
- 스프라이트 및 스프라이트 아틀라스 활용
2. 골드 시스템 추가
- Random.value 활용하여 랜덤한 확률을 갖고 골드가 드롭되도록 구현
3. 적 생성 로직 수정
- 예정된 스폰 포인트가 아닌 임의의 반경을 갖고 몬스터가 스폰되도록 구현
4. 필드 오브젝트 생성 로직 추가
- 플레이어 주변에 파괴가 가능한 필드 오브젝트가 스폰되도록 구현
- 오브젝트 파괴 시 확률적으로 아이템이 생성 (e.g. 자석, 힐팩, 골드 등)
2. 상세 개발 내용
1. 스프라이트 추가
- 스프라이트 설정 방법 (32x32 크기의 스프라이트인 경우)
1) 오브젝트 선택
2) Pixel Per Units: 32 설정
3) Filter: Point (no Filter) 적용
- 스프라이트 아틀라스 적용 방법
1) 활용할 오브젝트 추가 (packables 내 스프라이트 혹은 폴더 추가)
2) Pack Preview 클릭 후 결과 확인
2. 골드 시스템 추가
- Random.value 활용하여 랜덤한 골드 드랍 구현
if (Random.value <= mDropGoldChance)
{
item = GameManager.instance.mDropPool.Get();
item.transform.position = transform.position;
item.transform.position += new Vector3(Random.value * 2 - 1, Random.value * 2 - 1);
item.transform.rotation = Quaternion.identity;
item.GetComponent<DropItem>().mData = mDropGold;
switch (mDropGold)
{
case > 50:
item.GetComponent<DropItem>().mType = Enum.DropItemSprite.Gold2;
item.GetComponent<SpriteRenderer>().sprite = GameManager.instance.mDropItemSprite[(int)Enum.DropItemSprite.Gold2];
break;
case > 10:
item.GetComponent<DropItem>().mType = Enum.DropItemSprite.Gold1;
item.GetComponent<SpriteRenderer>().sprite = GameManager.instance.mDropItemSprite[(int)Enum.DropItemSprite.Gold1];
break;
default:
item.GetComponent<DropItem>().mType = Enum.DropItemSprite.Gold0;
item.GetComponent<SpriteRenderer>().sprite = GameManager.instance.mDropItemSprite[(int)Enum.DropItemSprite.Gold0];
break;
}
item.GetComponent<SpriteRenderer>().color = new Color(1, 1, 1, 0.5f);
}
3. 적 생성 로직 수정
- 예정된 스폰 포인트가 아닌 임의의 반경을 갖고 몬스터가 스폰되도록 구현
- 과거
void Spawn()
{
GameObject enemy = GameManager.instance.mEnemyPool.Get();
enemy.transform.position = mSpawnPoint[Random.Range(1, mSpawnPoint.Length)].position; // 기존 방식
enemy.GetComponent<Enemy>().Init(mLevel);
}
- 현재
void SpawnEnemy()
{
GameObject enemy = GameManager.instance.mEnemyPool.Get();
enemy.transform.position = GameManager.instance.mPlayer.transform.position;
Vector3 pos = Random.insideUnitCircle;
if (pos.magnitude == 0)
pos.x = 1;
pos = pos.normalized;
enemy.transform.position += pos * 20;
enemy.GetComponent<Enemy>().Init(mEnemyLevel);
}
4. 필드 오브젝트 생성 로직 추가
- 생성 방법
void SpawnFieldObject()
{
GameObject item = GameManager.instance.mFieldObjectPool.Get();
item.transform.position = GameManager.instance.mPlayer.transform.position;
Vector3 pos = Random.insideUnitCircle;
if (pos.magnitude == 0)
pos.x = 1;
pos = pos.normalized;
item.transform.position += pos * 20;
int value = Random.Range(0, GameManager.instance.mFieldObjectSprite.Length);
item.GetComponent<FieldObject>().Init(value);
}
- 오브젝트 동작
1) Enum이 박스인 경우, 플레이어와 충돌 시 삭제
2) Enum이 박스가 아닌 경우, 무기와 충돌 시 삭제 후 아이템 드롭
public enum FieldObjectSprite
{
Box,
Candle,
Bush
}
public class FieldObject : MonoBehaviour
{
public Enum.FieldObjectSprite mType;
public void Init(int value)
{
mType = (Enum.FieldObjectSprite) value;
gameObject.GetComponent<SpriteRenderer>().sprite = GameManager.instance.mFieldObjectSprite[value];
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (mType == Enum.FieldObjectSprite.Box)
if (collision.CompareTag("Player"))
{
gameObject.SetActive(false);
return;
}
if (collision.CompareTag("Melee") || collision.CompareTag("Range"))
{
GameObject item = GameManager.instance.mDropPool.Get();
item.transform.position = transform.position;
item.transform.rotation = Quaternion.identity;
float val = Random.value;
switch (val)
{
case < 0.1f:
item.GetComponent<DropItem>().mType = Enum.DropItemSprite.Mag;
item.GetComponent<SpriteRenderer>().sprite = GameManager.instance.mDropItemSprite[(int)Enum.DropItemSprite.Mag];
break;
case < 0.3f:
item.GetComponent<DropItem>().mType = Enum.DropItemSprite.Health;
item.GetComponent<SpriteRenderer>().sprite = GameManager.instance.mDropItemSprite[(int)Enum.DropItemSprite.Health];
break;
}
gameObject.SetActive(false);
return;
}
}
}
3. TODO
1. 무기 디버프 개별 구현 (e.g. 거미줄, 마늘 틱데미지)
2. 강화 시스템 추가 (골드 활용)
3. 상자 개봉 로직 추가
4. 무기 & 퍽 조합 시 무기 업그레이드 로직 추가
5. 게임 이어하기 로직 추가
6. 게임 세이브 슬롯 추가 (3개)
4. 참고 자료
https://opengameart.org/content/dungeon-crawl-32x32-tiles-supplemental
https://docs.unity3d.com/Packages/com.unity.2d.pixel-perfect@1.0/manual/index.html
https://docs.unity3d.com/kr/2020.3/Manual/class-Random.html