Unity 54

[내배캠][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; //..

[내배캠][Unity6기][TIL] Scene Reload 버그 트러블슈팅 (2)

플레이를 한번 진행한 후 해당 스테이지를 다시 시작하거나, 다른 스테이지를 진행할 때 종료 로직이 실행되지 않는 문제가 있어 수정했다. 게임 종료 로직을 DontDestroyOnLoad 객체인 GameManager가 관리하게 했는데, 처음에 이벤트를 연결했던 객체들이 Scene을 다시 로드하며 파괴되고 새로운 객체로 생성되며 종료 로직을 실행하지 않는 문제였다. [ 기존 코드 ]GameManager.cspublic class GameManager : SingletonBase{ protected override void Awake() { base.Awake(); DontDestroyOnLoad(this); } private void OnEnable() {..

[내배캠][Unity6기][TIL] Scene Reload 버그 트러블슈팅

작업한 내용들 병합하고 테스트 중인데 버그가 있어 수정했다.문제 상황실제 스테이지를 플레이하는 MainScene을 Reload하는 경우가 아래와 같이 3가지인데1. 일시정지 버튼 클릭 -> Retry 클릭2. 게임 패배 조건(스테이지의 하트 수 0) 만족하여 LosePopUp 활성화 -> Retry 클릭3. 게임 승리 조건(모든 인간 처치) 만족하여 WinPopUp 창 활성화 -> Retry 클릭1번은 제대로 Reload되는데 2, 3번에서 Reload하면 인게임 내 스폰된 몬스터와 인간 오브젝트가 그대로 남아있는 문제가 발생했다.문제 원인디버깅 결과 문제 원인은 이러했다.1. 둘다 ReturnToPool할 때 코루틴 프로세스로 시간차를 두고 풀에 반환2. 게임 종료 이벤트가 발생하며 Time.timeS..

[내배캠][Unity6기][TIL] Find 계열 함수 호출 빈도 줄이기

Unity에서 Find 계열 함수는 성능이 좋지않다.특히 Find는 Scene의 모든 오브젝트를 탐색하므로 Scene의 오브젝트가 많을수록 탐색 리소스 비용이 크다.대안으로 필드를 직렬화하여 Inspector에서 직접 참조를 연결해주거나,FindWithTag를 사용할 수 있다. FindWithTag는 tag가 붙은 오브젝트만 탐색하여 다른 Find 계열 함수들에 비해서는 성능 부담이 적지만 tag가 많아지고 호출 빈도가 높아지면 성능에 영향을 준다. 튜터님이 피드백 주신 부분은 HumanController 스크립트에서의 FindWithTag 사용이다.Awake에서 호출하기는 하지만 풀링되는 Human의 개수만큼 호출되므로 반드시 여기서 호출되야하는 것이 아니면 다른 부분으로 넘기고 참조 값만 사용하는 것..

[내배캠][Unity6기][TIL] NavMesh 트러블슈팅 (2)

2D Sprite 4방향 전환 애니메이션 적용하며 NavMeshAgent를 이용하려면 steeringTarget을 사용해야한다. 방향 전환을 시도해본 방법으로는1. nextPosition2. FindClosestEdge3. steeringTarget이 있는데 이중 steeringTarget만 정상 작동한다. nextPosition은 바로 다음 위치를 가져오므로 디버깅했을 때 현재 위치와 거의 차이나지 않아 방향 전환에 부적합했다.FindClosestEdge가 움직임이 자연스럽다고 하여 활용해보려했으나 2D에는 잘 적용되지 않는 것 같았다.steeringTarget은 경로상의 다음 목적지를 가져오며 자연스러운 방향전환을 보여주었다.  private void Update() { Sta..

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

- 자기 소개에서 진행한 프로젝트 내용 간략하게 제시- 시선 고정, 에너지 넘치고 자신감 있는 태도로 임하기 Q. 값타입과 참조 타입에 대해 서술하세요.A.값타입: 실제 데이터를 스택 메모리에 저장하며 속도 빠름.ex) int, float, bool, struct, enum참조 타입: 데이터의 메모리 참조값, 즉 주소는 스택에 실제 데이터는 힙 메모리에 저장.크기가 정해지지 않은 동적 크기 데이터 저장하기에 적합ex) class, string, array 등 Q. 오버라이딩과 오버로딩에 대해 서술하세요.A.Override: 상속 관계에서 부모 클래스 또는 인터페이스의 메서드를 이를 상속받는 클래스가 재정의.Overload: 같은 클래스 내에서 동일한 이름의 메서드를 매개변수 타입이나 개수를 다르게 하여 ..

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

드디어 인간의 부자연스러운 움직임 버그가 해결되었다!원인은 NavMesh 컴포넌트로 인해 풀에서 다시 활성화한 객체의 위치가 초기화가 되지 않아서였다.NavMesh agent 컴포넌트가 활성화된 상태에서는 해당 컴포넌트를 가지고 있는 게임오브젝트의 transform을 설정해도 그 위치로 움직이지 않는다.그래서 컴포넌트를 비활성화하고 위치를 초기화했다가 다시 활성화해주어야 한다.죄없는 트리구조만 삭제되고... FSM으로 수정했지만 막상 수정해보니 이쪽이 현재 상태에 적합한 것 같아 이대로 진행하려고 한다. private void OnEnable() { // 초기화 설정 Agent.enabled = false; transform.position = SpawnP..