전체 글 64

내일배움캠프 71일차 TIL 최종 프로젝트 - 중간발표

20241223 / Unity_6차  16주차 월요일  https://www.youtube.com/watch?v=LsNYRVpg6_4 오늘은 중간발표를 하는 날이라 발표준비하고 피드백 받아 버그픽스 하는것만 했다.  아직 고치지 못한 버그도 있지만 현재 가장 중요한 문제는 절대적인 콘텐츠의 양이 부족하다는 것이다. 공격용 유닛,  공성유닛, 새로운 적대개채, 개척지역, 지속적인 자금 수급 수단, 동적 맵 생성 등스테이지 하나에만 추가해야 할 것들이 이렇게나 많은데 현재 스테이지 외에는게임의 구성 요소가 거의 전무한 상태다. 아마 위의 몇몇 아이템은 포기하게 되겠지만,그럼에도 프로젝트 기간 끝까지 스테이지 요소 추가는 멈출 수 없을 듯싶다.  조심해야 될 것은 역시 스파게티 코딩이 되는 것이다. 스파게티 ..

카테고리 없음 2024.12.23

내일배움캠프 70일차 TIL 최종 프로젝트 - SortedDictionary

20241220 / Unity_6차  15주차 금요일  이번에는 방벽 생성/파괴 시 베이스 영역을 변경해 주기 위해 SortedDictionary를 사용하였다. 사용 이유는 가장 바깥쪽의 방벽이 생성/파괴 되었는지 확인하기 위해 정렬 기능이 필요했기 때문이다.   SortedDictionary특징키를 정렬된 순서로 유지하며, 빠른 검색, 삽입, 삭제를 제공하는 C#의 컬렉션 클래스내부적으로 이진 탐색 트리(Balanced Binary Search Tree)를 기반으로 동작 대표적인 메서드 메서드 설명 Add(TKey key, TValue value)지정된 키와 값을 추가.Remove(TKey key)지정된 키를 삭제.TryGetValue(TKey key, out value)키가 존재하면 값을 반환하고,..

카테고리 없음 2024.12.20

내일배움캠프 69일차 TIL 최종 프로젝트 - Context Menu

20241219 / Unity_6차  15주차 목요일  Context Menu는 스크립트 컴포넌트의 특정 메서드를Unity Editor에서 쉽게 실행할 수 있도록 해주는 기능이다. 사용법은 메서드에 [ContextMenu] 속성을 붙이면 Unity Editor에서 해당 메서드를마우스 오른쪽 버튼이나 더보기 버튼을 눌러 나오는 메뉴에서 실행할 수 있다. [ContextMenu("DebugFunc/Die")] private void DebugFunc1() { TakeDamage(1000, false); }  참고로 Context Menu 속성을 사용할 메서드는 반환값은 있어도 되는데매개변수가 있으면 메뉴에 나타나지 않는다. 그리고 private 한정자에서도 동작하니 은닉성은 걱정 없겠다.

카테고리 없음 2024.12.19

내일배움캠프 68일차 TIL 최종 프로젝트 - LinkedList

20241218 / Unity_6차  15주차 수요일  이전에 Build Event Controller를 만들었을 때 LinkedList를 사용했었다. LinkedList특징노드 기반으로 요소를 연결하는 제네릭 리스트.System.Collections.Generic 네임스페이스에 포함.장점빠른 삽입/삭제: 중간 삽입/삭제가 리스트 끝에서도 빠름 (O(1)).크기 제한 없음: 메모리가 허용하는 한 무제한으로 요소 추가 가능.단점느린 접근 속도: 특정 인덱스에 접근하려면 순차적으로 탐색해야 하므로 느림 (O(n)).추가 메모리 사용: 각 노드에 대한 포인터 저장 때문에 메모리 오버헤드가 있음. 급하게 짰던 코드라 문제가 좀 많아서 코드를 손보면서기존에 List로 선언한 freeWorkers도 LinkedLi..

카테고리 없음 2024.12.19

내일배움캠프 67일차 TIL 최종 프로젝트 - 읽기 전용 인터페이스

20241217 / Unity_6차  15주차 화요일  현재 프로젝트의 NPC AI는 영역 좌표를 기반으로 동작한다. 부랑자는 캠프 영역 내를 배회하고, 궁수는 최외곽 벽을 기준으로 일정 거리 내의 영역을 순찰하며,아군 NPC들의 이동 범위를 제한할 기지 영역은 벽이 지어지거나 파괴되면 크기가 바뀔 수 있다. 그렇기 때문에 맵의 모든 영역을 관리하는 컨트롤러가 따로 필요하다.  영역 컨트롤러 안에는 위에서 설명한 여러 영역에 대한 정보가 들어가야 하므로각 영역을 나타낼 클래스를 내부에 따로 정의해야 한다. 이런 영역에 대한 편집은 무조건 컨트롤러 안에서만 가능해야 하는데,영역 클래스 인스턴스의 필드를 읽는 것은 컨트롤러 바깥에서도 가능해야 한다. 쉽게 말해 컨트롤러 클래스는 다음과 같이 구현해야 한다.p..

카테고리 없음 2024.12.17

내일배움캠프 66일차 TIL 최종 프로젝트 - SOLID 원칙

20241216 / Unity_6차  15주차 월요일  SOLID 원칙은 객체지향 설계에서 코드의 유지보수성과 확장성을 높이기 위한 다섯 가지 설계 원칙이다.단일 책임 원칙(SRP): 클래스는 하나의 책임만 가져야 한다.개방-폐쇄 원칙(OCP): 클래스는 확장에 열려 있고, 수정에는 닫혀 있어야 한다.리스코프 치환 원칙(LSP): 자식 클래스는 부모 클래스를 대체할 수 있어야 한다.인터페이스 분리 원칙(ISP): 클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다.의존성 역전 원칙(DIP): 고수준 모듈이 저수준 모듈에 의존해서는 안 된다. 이제 와서 이런 기초적인 이론에 대해 왜 상기하는가 하면내가 설계한 코드가 위 원칙을 위배하여 실시간으로 문제를 겪었기 때문이다. public abstr..

카테고리 없음 2024.12.17

내일배움캠프 65일차 TIL 최종 프로젝트 - 게임 플레이 경험

20241213 / Unity_6차  14주차 금요일  Kingdom : New Lands를 계속 플레이 해 보니 AI에 추가해야 할 동작들이 더 많이 있는 것을 발견했다. 궁수는 중간중한 한 명씩 본진 내부를 횡단하는 것이 보였고(무작위 이동으로 인한 결과는 아닌 것 같음), 작업자도 일이 없을 때 그러했다. 물론 지금은 그대로 두고 먼저 플레이 사이클에 필요한 다른 것(인트로, 패배, 클리어 등)들을먼저 개발한 후에 다시 고민해 봐야 할 것 같다.

카테고리 없음 2024.12.16

내일배움캠프 64일차 TIL 최종 프로젝트 - Build Event Controller

20241212 / Unity_6차  14주차 목요일   에서는 플레이어가 건물을 지을 때 돈을 지불하여 건설 예약을 걸어 두면일을 하지 않는 작업자가 알아서 와서 건물을 짓는다. 하나의 건물에는 최대 2명의 작업자가 와서 건설할 수 있으며,한번에 2명을 부르는 것이 아니라 한명을 먼저 부르고 일정 시간이 지나면 한 명을 더 부른다. 당연하게도 1명이라도 작업자가 붙은 건물은1명도 붙지 않은 건물보다 작업자 호출의 우선순위가 밀린다. 이상을 종합해 봤을 때, 작업자의 건설 명령을 컨트롤하는 스케쥴러가 필요하다는 결론을 내렸다. 설계 핵심BuildingController의 건설 요청 관리:BuildingController에서 발생한 건설 요청 이벤트를 처리.요청된 Building을 리스트에 추가.건설 작업..

카테고리 없음 2024.12.12

내일배움캠프 63일차 TIL 최종 프로젝트 - Gizmo

20241211 / Unity_6차  14주차 수요일  유니티에서 Gizmo란,Scene View에서 오브젝트의 상태나 위치를 시각적으로 표현하기 위한 도구다. Gizmo는 게임플레이에는 영향을 미치지 않으며, 오직 Scene View에서만 표시된다. NPC AI를 디버깅하기 위해 MonoBehaviour에 정의된 OnDrawGizmos 함수를 사용했다.private void OnDrawGizmos(){ Handles.Label(NPC.transform.position + Vector3.up * 1, currentCommandText, NPCTest.guiStyle);} 참고로 guiStyle은 다음과 같이 따로 설정했다.public class NPCTest : MonoBehaviour{ pu..

카테고리 없음 2024.12.11

내일배움캠프 62일차 TIL 최종 프로젝트 - 사소한 리팩터링

20241210 / Unity_6차  14주차 화요일  지금까지는 ObjectPool을 사용하면서 같은 유형의 Object는 하나의 Pool을 공유하게 만들었었다. 몬스터를 예로 들자면 모든 몬스터의 공통 부분을 하나의 프리팹으로 만들어 Pooling하고모델링이나 애니메이션같이 서로 다른 부분은 공통 부분의 자식 오브젝트로 그때그때 할당하는 방식이다. 몬스터가 활성화/비활성화 될 때마다 오브젝트를 생성/소멸시키는 과정이 들어갔으니사실 ObjectPool의 장점을 반만 사용하고 있었다고 볼 수도 있다. 그럼에도 불구하고 이런 방식을 쓴 이유는 이전 프로젝트에서의 좋은 경험 때문이었다. 비슷한 프리팹들을 위해 ObjectPool을 따로따로 만든 다는 것이 비효율적으로 느껴졌었고그 때는 부모 오브젝트와 자식 ..

카테고리 없음 2024.12.10