2024/12 21

[내배캠][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기] 모의 면접 준비 (3)

- 궁금한 점 질문할 때 회사의 개발방식에 대해 물어봐도 OK- 신입으로서 어떤 직무를 맡게 될지 질문하는 것도 좋음Q. 얕은 복사와 깊은 복사에 대해 서술하세요.A.얕은 복사: 객체의 참조 값만 복사. 원본 객체와 복사본 객체는 같은 메모리 주소를 참조, 원본의 수정이 복사본에 영향 有깊은 복사: 객체가 참조하는 모든 데이터까지 복사. 복사본은 원본으로부터 완전히 독립된 객체, 원본의 수정이 복사본에 영향 無 Q. 코루틴의 동작원리와 사용해 본 예시를 함께 설명하세요.A.코루틴: 비동기 작업을 실행할 수 있게 하는 특수한 함수. Unity의 메인 스레드에서 실행되므로 완전한 비동기는 아니지만 비동기 작업과 유사한 효과(비동기적 동기). 게임 내에서 일정 시간이나 조건 이후에 진행해야 하는 로직을 구현할..

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

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

[내배캠][Unity6기][TIL] 이중 콜라이더 트러블슈팅

특정 위치에서만 인간이 몬스터를 계속 공격하거나, 한번만 공격하거나 공격하지 않고 지나가는 문제가 있어서 튜터님께 도움을 요청드렸다. 그전에 디버그도 찍어보고 인스펙터로 런타임에서 확인했을 때는 인간이 전투 상태에 들어갔다가 다시 걷기 상태로 전환되는 이상 현상을 도무지 알 수 없었다... 그것도 다른 위치에서는 다 정상 작동하는데 특정 위치에서만 현상이 나타나는 것도 이해할 수 없었다. [ 문제 현상 ]특정 위치에서 인간이 몬스터를 한번만 공격하고 지나감(다른 위치에서 한번에 몰려올때나 밀려서 지나갈 때는 그냥 지나가거나 정상적으로 전투를 하기도 함) [ 문제 원인 파악(디버깅) ]1. 특정 위치에서 인간이 BattleState에 있다가 바로 WalkState로 전이되는 것을 디버그 로그로 확인2. 인..

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

- 자기 소개에서 면접관의 질문을 유도할만한 경험을 제시 (포폴과 이력서에서도 마찬가지)- CS는 꾸준히 챙겨서 공부하기, 하루에 2개 정도의 개념 공부하는 것을 추천!- 마지막 멘트에서 회사에 입사하고 싶다는 것을 적극적으로 어필하기-- 회사에 대해 궁금한 점들을 질문해 관심이 있다는 사실을 표현 (ex. 입사하면 구체적으로 어떤 직무를 맡을지 등)Q. 유니티 생명주기 함수에 대해 서술하세요.A.게임 오브젝트와 스크립트가 실행되는 일련의 순서를 관리하는 사이클Awake, OnEnable, Start, Update, FixedUpdate, LateUpdate, OnDisable, OnDestory초기화 단계:Awake: 게임 오브젝트가 활성화될 때 가장 먼저 호출되며 의존성 설정 등 초기화 작업에 사용O..

[내배캠][Unity6기][TIL] 애니메이션 단순화

애니메이션 상태가 불필요하게 많다고 생각해서 원활한 유지보수를 위해 간소화하였다.수정 전 : Idle, Walk(Up, Down, Left, Right), SetFormation, Wait, Surprise, Attack, Run(Up, Down, Left, Right)수정 후: Walk(Up, Down, Left, Right), SetFormation(Up, Down, Left, Right), Surprise, Attack그리고 기본 애니메이터인 NormalHumanAnim만 만들고 나머지 인간 애니메이션은 Animator Override Controller를 활용해 애니메이션만 바꾸어주었다. [ 단순화 전략 ]1. Run Animation을 Walk  Animation으로 대체: Run 상태일 때 W..

[내배캠][Unity6기][TIL] CSV 데이터 파싱 방법(Feat. UGS)

현재 Wave 데이터를 UGS를 이용해 CSV 데이터를 불러와 파싱하여 사용중이다.그런데 스테이지 별로 클래스가 나오니 하드코딩하게 되어서 스테이지가 아주 많아질 경우를 대비해 리팩토링을 시도했다.현재는 스테이지가 많지 않아 리플렉션으로 인한 성능 부하를 상쇄할 만한 정도는 아닌 것 같아서 첫 번째 방법을 사용하고 있다.스테이지 클래스 별로 매번 코드 추가하여 파싱장점: 직관적이고 가독성 좋음단점: 스테이지 추가할 때마다 코드 추가 필요, 낮은 확장성using System.Collections.Generic;using UnityEngine;public class WaveData{ public int WaveIdx; // 웨이브 인덱스 public List HumanID; //..