마지막 구현을 끝내는 날이므로 남은 구현을 오늘안에 끝낼 수 있도록 해야한다.
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를 지정해준다.
// 전(오류)
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로 받아서 자식 오브젝트를 비활성화 시킴
전(오류)
//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로 생성하고 오브젝트의 위치를 변경하여 오브젝트가 중복으로 생성되는 상황을 해결함
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시간이 지난 후 다시 랜덤 스폰을 진행함
if (playerCheck)
{
healthImg.fillAmount = CurrentHealth / statsHandler.currentStatus.maxHealth;
}
**설명: 플레이어의 체력 이미지(fillAmount)의 값을 적용하여 피해를 입으면 Amount값을 줄여 감소하게 함
**
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%는 금방 끝날 사항이라 문제는 없을 거 같다.
내일 발표 자료를 준비해야하는데 문제 없이 진행이 되었으면 좋겠다.