오늘은 프로젝트 제출 전날이다. 오늘 있었던 일들을 갈무리 해보려한다.
오늘은 플레이어가 아이템을 관리하는 Dictionary를 다음 스테이지 씬으로 정보를 유지하고 넘겨주기 위해서 DataManager에서 참조할 수 있게 하려했는데, Dictionary<string, Item>은 public으로 선언하면 일관성 없는 액세스 가능성이라면서 오류가 났었다.
지금은 Item 클래스가 public이 아니어서 그렇다는 걸 알고 공허함을 느끼는 중이지만, 당시에는 해결해보려고 IDictionary를 이용해서 데이터를 넘겨주고, 타입캐스팅을 이용했다 .........
Dictionary<string, Item> _items;
public IDictionary ItemDict
{
get => _items;
set
{
_items = (Dictionary<string, Item>)value;
}
}
당연한 이야기겠지만, 이렇게 받아와도 참조가 유지되더라.
UIManager에서도 이런 식으로 플레이어의 아이템 Dictionary를 받아왔는데, 아이템 선택 창에서 아이템을 고르면 자동으로 UI에 획득한 아이템이 나타났다. (기존에는 따로 리스트에 넣어줬어야했다.)
현재 우리 프로젝트는 플레이어가 죽거나, 모든 스테이지를 클리어하면 TimeScale이 0인 상태로 타이틀 씬으로 돌아온다. (스테이지 씬이 로드되면 TimeScale이 1이 되는 구조.) 타이틀 씬에선 시간과 관련된 로직이 없어서 문제가 없었지만, 스토리 씬을 추가하면서 문제가 생겼다.
게임을 실행하고 처음 타이틀 씬에서는 TimeScale이 1이라서 스토리 씬의 코루틴 연출이 정상적으로 진행됐지만, 죽고 나서 리트라이 하는 경우에는 TimeScale이 0이라서 스토리 씬에서 게임이 멈췄다.
이 부분은 WaitForSecondRealtime과 Time.unscaledDeltaTime을 이용해서 해결했다.
현재 몬스터들은 PoolManager를 이용해서 오브젝트풀링을 하고있다. 죽은 몬스터는 삭제되지 않고 보이지 않는 유휴상태로 들어가 있다가, 재생성될 때 다시 Active된다.
문제는 2스테이지의 몬스터들은 죽는 애니메이션에서 Scale x가 찌부러지거나, rotation z를 돌려서 눕는 연출이 있었는데, scale 값과 rotation 값이 초기화 되지 않는 문제가 있었다. 심지어는 피격 판정 연출로 색깔이 바뀐 상태로 생성되는 녀석도 있었다.
이 문제는 사망 애니메이션이 끝나면 호출되는 이벤트 메서드인 Dead() 메서드에서 기본 값으로 되돌려줬다.
void Dead()
{
gameObject.SetActive(false);
var expObj = Instantiate(expPrefab, transform.position, Quaternion.identity).GetComponent<Droppable_EXP>();
var moneyObj = Instantiate(moneyPrefab, transform.position, Quaternion.identity).GetComponent<Droppable_Money>();
expObj.value = exp;
moneyObj.value = money;
if (IsBoss) GameManager.Instance.GameOver(true);
transform.localScale = new Vector3(1, 1, 1);
transform.localRotation = Quaternion.identity;
spriter.color = Color.white;
}