Unity 54

[내배캠][Unity6기][TIL] 풀 반환 오류 트러블슈팅

대환장파티의 풀 반환 오류를 드디어 해결했다!오류의 원인이 되는 부분이 많았어서 하나하나 찾기 쉽지 않았는데 튜터님의 도움으로 해결할 수 있었다. [ 문제 상황 ]1. 풀에 이미 반환된 오브젝트가 2번 반환을 시도2. 풀에서 가져온 타입과 다른 타입으로 풀에 반환3. 풀에 반환할 오브젝트의 인덱스 에러(추후 에러 로그 정보 추가 예정) [ 문제 원인 ] 1. 미니언 반환에서 이중 반환 및 타입이 맞지 않게 반환시키는 부분이 있었다.public class Minion : Monster{ public override void ReturnToVillage() { base.ReturnToVillage(); _summonerMonster.RemoveMinion(this); ..

[내배캠][Unity6기][TIL] 코루틴 중지 트러블슈팅

게임 종료 후에도 스폰 코루틴이 계속 실행되어 전환된 Scene에 인간이 생성되는 문제가 있어 수정했다.public class HumanSpawner : SingletonBase{ public void StopSpawningHumans() { StopAllCoroutines(); // 모든 스폰 코루틴 중지 }}public class GameManager : SingletonBase{ public void ReturnObjects() { HumanSpawner.Instance.StopSpawningHumans(); }}위와 같이 스테이지가 종료 및 재시작되는 모든 상황에서 스폰 코루틴이 멈추도록 수정했다.StopAllCoroutines는 해당..

[내배캠][Unity6기][TIL] 다중 스폰 포인트

기존에 1개의 스폰포인트에서 인간이 생성되도록 설계했는데, 스테이지에 스폰포인트가 추가되며 로직을 확장성 있게 수정하였다.public class StageManager : SingletonBase{ public List StartPointList { get; private set; } // 스테이지의 시작점과 종료지점 캐싱 private void SetPointInfo() { StartPointList = new List(); GameObject[] spawnPoints = GameObject.FindGameObjectsWithTag("HumanSpawnPoint"); if (spawnPoints == null || spawnPoints.Leng..

[내배캠][Unity6기][TIL] ObjectDisposedException 트러블슈팅

[ 문제 상황 ]GameManager에서 활성화된 오브젝트들의 리스트를 관리하고 있는데ObjectDisposedException과 type is not a supported pptr value 에러가 발생했다.public class GameManager : SingletonBase{ public List activeHumans = new List(); public List activeMonsters = new List();}public class Human : MonoBehaviour{ protected virtual void OnEnable() { GameManager.Instance.activeHumans.Add(this); } protected virtu..

[내배캠][Unity6기] 모의 면접 준비 (4)

- 마지막 멘트는 질문도 좋지만 더욱 자신을 어필할 수 있는 각오 메시지 준비하기- 지원 동기를 회사의 컬쳐핏과 인재상 잘 엮어서 준비하기- 본인이 한 프로젝트 관련하여 설명할 때 개발자 관점에서 서술(e.g., 기술적 의사결정) Q. 콜백 함수에 대해 서술하세요.A.특정 작업이 완료되면 호출되는 함수로 주로 델리게이트를 사용하여 구현.이벤트가 발생 시 호출될 함수들을 미리 이벤트에 구독해두면 이벤트 발생시 연결된 함수들이 자동으로 호출.사용예) 게임 종료 이벤트 발생시에 처리해야하는 작업들을 함수로 만들고 종료될 때 호출되도록 설계. Q. 박싱 언박싱에 대해 서술하세요.A.박싱: 값 -> 참조 변환. 스택에 저장된 값 형식의 데이터를 힙 메모리에 저장하고, 힙 메모리에 저장된 객체의 참조 주소를 다시 ..

[내배캠][Unity6기][TIL] 데이터 로드 리팩토링 (2)

인간 데이터를 받아올 때 Human과 HumanController, 2개의 클래스에서 모두 데이터를 들고 있는 것이 불필요해 보인다는 피드백을 받았다.변경해서 사용할 데이터도 아니고 한번 받아오고 변수로 저장해 사용하고 있다.그래서 Awake 순서만 잘 맞춰서 한쪽에서 로드한 데이터를 다른 쪽에서 초기화하는 방식으로 변경했다. [ 변경 과정 ]1. Human -> HumanController 로 Awake 순서 조정(컴포넌트 추가 순서 조정, or project setting에서 변경하기)2. Human의 Awake에서 Data 받아오고 HumanController 연결3. HumanController의 데이터 세팅4. HumanController에서 데이터 불러오는 부분 삭제 [ 수정 전 ]public..

[내배캠][Unity6기][TIL] 데이터 로드 리팩토링

중간 발표 피드백을 토대로 데이터 로드 방법을 변경했다. 1. 각각의 스크립트에서 관리하지 않고 하나의 DataManager에서 로드하여 관리2. SO 사용하지 않고 불러온 json 데이터 바로 사용3. 여러 파일(namespace) 분리하지 않고 하나의 파일에서 sheet(class)를 분리하여 테이블 관리 WaveData는 하나의 테이블로 병합했으면 좋겠다고 하셔서 idx를 1000번대로 만들어 식별하도록 만들었다.처음에 StageId와 WaveIdx 2개를 기반으로 찾으려고 하니 StageId가 중복되어 Dictionary key 값을 새로 만들어줘야 하는 문제가 있었다. 그래서 그냥 WavdIdx를 1000번대로 만들어 데이터를 가져오고 HumanSpawner 측에서 계산하여 식별하도록했다. Aw..

[내배캠][Unity6기][TIL] 동적 생성 메서드 경로 설정 리팩토링

Resources.Load로 동적 생성을 할 때 Resource 폴더 내 경로를 통해 오브젝트를 가져온다.이때 메서드 내에 경로 설정을 해놓은 경우 오타 발생 시 문제점을 한 번에 파악하기 어렵고, 폴더 이동 시 해당 메서드 내 문자열을 찾아 변경해주어야 하므로 유지보수가 힘들다.const string으로 경로명을 변수처럼 사용하면 이러한 문제점을 해결할 수 있다. [ 수정 전 ]public class UIManager : SingletonBase{ public T Show(string path) where T : UIBase { string uiName = typeof(T).ToString(); UIBase go = Resources.Load(path + uiName..

[내배캠][Unity6기][TIL] 게임 로직 리팩토링

게임 종료 로직과 풀에 활성화된 오브젝트를 반환하는 로직을 이벤트로 관리했는데, 이벤트가 여기저기 흩어져 있어 한번에 파악이 어려워졌다. 이벤트가 아닌 GameManager에서 관련 로직을 관리하게 만들어 한번에 파악하기 쉽도록 변경했다.public class GameManager : SingletonBase{ public List activeObjects = new List(); protected override void Awake() { base.Awake(); // 매니저 중 DontDestroyOnLoad 인 인스턴스만 주석 활성화하여 사용 DontDestroyOnLoad(this); } private void ..

[내배캠][Unity6기][TIL] 중간 발표 피드백

피드백 내용- 코드 컨벤션 통일- Json을 SO로 변경할 때 파싱하는 부분을 Utility 클래스로 분리하여 확장 메서드로 구현- 게임 로직 관리하는 이벤트 한곳에서 관리하도록 변경- 상태머신 생성자에서 이미 연결된 참조에 접근하여 초기화하도록 변경- UIManager에서 팝업 path를 const string으로 관리하도록 수정 회고- 내가 작성했던 부분에서 고쳐할 부분이 너무 많았다 ㅠㅠ 그래도 항상 이렇게 작성하는 게 맞는지 의심했는데 튜터님 피드백을 통해 더 나은 코드로 변경할 수 있는 좋은 기회를 얻게 되어 기쁘다!