2024-05-21

이재형·2024년 5월 21일
0
post-thumbnail
post-custom-banner

시작하기에 앞서

마지막 구현을 끝내는 날이므로 남은 구현을 오늘안에 끝낼 수 있도록 해야한다.

Unity(2D) 입문

배운 내용

1. 싱글톤을 제네릭으로 활용

public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T instance;

    public static T Instance
    {
        get
        {
            // get instance of singleton
            if (instance == null)
            {
                GameObject obj;
                // 오브젝트에 해당 제네릭 타입을 가진 오브젝트를 찾음
                obj = GameObject.Find(typeof(T).Name);
                if (obj == null)
                {
                    // 없으면 새로 만들어서 추가를 함
                    obj = new GameObject(typeof(T).Name);
                    instance = obj.AddComponent<T>();
                }
                else
                {
                    // 있다면 해당 오브젝트의 제네릭 컴포넌트를 추가함
                    instance = obj.GetComponent<T>();
                }
            }
            return instance;
        }
    }

    public void Awake()
    {
        // make it as dontdestroyobject
        // 오브젝트의 부모가 있다면
        if (gameObject.transform.parent != null)
        {
            // 해당 부모를 DontDestroyOnLoad를 함
            DontDestroyOnLoad(gameObject.transform.parent);
        }
        else
        {
            // 부모 오브젝트가 없으므로 자신을 DontDestroyOnLoad함
            DontDestroyOnLoad(gameObject);
        }
    }
}

해당 내용을 싱글톤에 적용시

public class AudioManager : Singleton<AudioManager>
{
	// 내용 시작
}

설명:
1.해당 Singleton를 이용하여 싱글톤을 만들때 상속하여 해당 클래스를 싱글톤 기능을하게 만드는 기능이다.
2. 해당 클래스에 추가로 상속하면 해당 스크립트를 제네릭으로 받아서 오브젝트 검색 후 instance를 지정해준다.


2. 자식 오브젝트 비활성화 (foreach)

// 전(오류)
foreach (GameObject monster in transform.GetChild(i))
{
    monster.SetActive(false);
}

// 후(해결)
GameObject parentObject = transform.GetChild(i).gameObject;
foreach (Transform child in parentObject.transform)
{
    GameObject monster = child.gameObject;
    monster.SetActive(false);
}

설명:
1. GetChild()는 단일 오브젝트만 되므로 해당 오브젝트의 오브젝트 위치 값으로 변경하였음
2. 그 후에 오브젝트의 자식들을 child로 받아서 자식 오브젝트를 비활성화 시킴


3. 오브젝트 생성

(오류)
//GameObject folder = Instantiate(new GameObject(pool.tag), transform);(해결)
GameObject folder = new GameObject(pool.tag);
folder.transform.SetParent(transform);

설명:
1. 전에서 해당 오브젝트를 new GameObject(pool.tag)로 오브젝트를 생성하고 Instantiate로 또 생성을 하며 2개의 오브젝트가 생성이 되는 상황이 발생함
2. 후에는 Instantiate를 사용하지않고 그냥 new GameObject로 생성하고 오브젝트의 위치를 변경하여 오브젝트가 중복으로 생성되는 상황을 해결함


팀 프로젝트 개발 4일차

진행 사항

1. 몬스터 다양하게 스폰되게 진행

사진:

IEnumerator MonsterSpawn()
{
    while (true)
    {
        // 스포너 위치 랜덤으로 정함
        int result = Random.Range(0, 3);
        int monsterRandom = Random.Range(1, 8);

        // 해당 몬스터 태그명
        GameObject obj = GameManager.Instance.objectPool.SpawnFromPool("Slime" + monsterRandom);

        // 몬스터 위치를 랜덤 3가지의 몬스터 스포너 위치로 이동
        obj.transform.position = spawnPos[result].transform.position;
        yield return new WaitForSeconds(spawneTime);
    }
}

설명:
1. 랜덤 변수로 값을 받아서 해당 슬라임의 태그명에 추가하여 오브젝트를 받아옴
2. 받아온 오브젝트를 랜덤 스포너위치로 이동 후 spawnTime시간이 지난 후 다시 랜덤 스폰을 진행함


2. 플레이어 체력 감소

사진1: 감소 전

사진2: 감소 후

if (playerCheck)
{
    healthImg.fillAmount = CurrentHealth / statsHandler.currentStatus.maxHealth;
}

**설명: 플레이어의 체력 이미지(fillAmount)의 값을 적용하여 피해를 입으면 Amount값을 줄여 감소하게 함

**


3. 플레이어 사망

사진:

if (CurrentHealth <= 0f)
{
    if (playerCheck)
    {
        GameManager.Instance.GameFail();
    }
    CallDeath();
    return true;
}

public void GameFail()
{
    // 게임 시간을 0으로 변경
    Time.timeScale = 0;
    gameFailObject.SetActive(true);
}

설명: 플레이어의 체력이 0이하로 감소하면 게임의 시간이 줄어들고 해당 UI가 출력되게 함

정리

배운 내용

1. foreach: 배열 같은 요소 타입을 검색하여 요소들을 활용할 때 사용한다.
2. Singleton : MonoBehaviour where T : MonoBehaviour : 제네릭을 이용한 상속을 이용한 싱글톤 생성
3. Instantiate(new GameObject(pool.tag), transform): 오브젝트의 생성 되는 과정(순서)를 알아야 한다.

해결 못한 문제

1. 없음

문제점

1. 플레이어의 강화를 아직 못함(힐, 체력 증가, 이속 증가)

끝 마치며...

구현사항은 95%이상은 끝난 상태이고 남은 5%는 금방 끝날 사항이라 문제는 없을 거 같다.
내일 발표 자료를 준비해야하는데 문제 없이 진행이 되었으면 좋겠다.

profile
한국사람
post-custom-banner

0개의 댓글