728x90

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

 

Dungeon Crawl 32x32 tiles supplemental

In addition to the 3000+ original tiles, here are 3000+ MORE tiles used in the game Dungeon Crawl Stone Soup http://crawl.develz.org/wordpress/ The great artists of the Dungeon Crawl Stone Soup team have recently enhanced and added to the already-amazing s

opengameart.org

 

https://docs.unity3d.com/Packages/com.unity.2d.pixel-perfect@1.0/manual/index.html

 

| Package Manager UI website

2D Pixel Perfect Overview The 2D Pixel Perfect package contains the Pixel Perfect Camera component which ensures your pixel art remains crisp and clear at different resolutions, and stable in motion.  It is a single component that makes all the calculati

docs.unity3d.com

 

https://docs.unity3d.com/kr/2020.3/Manual/class-Random.html

 

중요 클래스 - Random - Unity 매뉴얼

Random 클래스는 흔히 요구되는 다양한 타입의 랜덤 값을 쉽게 생성할 수 있는 방법을 제공합니다.

docs.unity3d.com

 

 

 

 

+ Recent posts