문제 설명N개의 스티커가 원형으로 연결되어 있습니다. 다음 그림은 N = 8인 경우의 예시입니다.원형으로 연결된 스티커에서 몇 장의 스티커를 뜯어내어 뜯어낸 스티커에 적힌 숫자의 합이 최대가 되도록 하고 싶습니다. 단 스티커 한 장을 뜯어내면 양쪽으로 인접해있는 스티커는 찢어져서 사용할 수 없게 됩니다. 예를 들어 위 그림에서 14가 적힌 스티커를 뜯으면 인접해있는 10, 6이 적힌 스티커는 사용할 수 없습니다. 스티커에 적힌 숫자가 배열 형태로 주어질 때, 스티커를 뜯어내어 얻을 수 있는 숫자의 합의 최댓값을 return 하는 solution 함수를 완성해 주세요. 원형의 스티커 모양을 위해 배열의 첫 번째 원소와 마지막 원소가 서로 연결되어 있다고 간주합니다. 제한 사항sticker는 원형으..
C#
앉기 및 슬라이딩이제 파쿠르 동작을 구현해 보자.첫 번째로 슬라이딩을 구현하려 하는데 이는 앉기 키와 동일하게 사용할 예정이라 앉기를 먼저 구현하고 달리면서 앉기 키를 눌렀을 때 슬라이딩이 되도록 구현할 것이다. 앉기Control키를 눌러 캐릭터가 앉을 수 있도록 만들어 보자.우선 입력부터 처리하자.누르고 있을 때만 상태를 변경해야 하기 때문에 PassThrough로 설정하였다.public void OnCrouch(InputValue value){ crouch = value.isPressed;} crouch가 참일 때 상태를 변경해 보자. if (blackBoard.parkourInputController.crouch && _currentParkourState != ParkourState.C..
캐릭터 이동 구현분석한 내용을 직접 구현해 보자. 구조구조는 유사하게 Input을 처리하는 스크립트와 이를 참조하여 캐릭터를 제어하는 구조로 설계하였다.이동 관련한 데이터는 따로 SO로 분리하여 관리하려 한다. 이동이동부터 구현해 보자.흐름을 정리하자면 다음과 같다.입력 방향의 각도를 구한다 = Atan2카메라 회전 각도를 구한다 = camera eulerAnge.y둘을 합해 최종 캐릭터 회전 방향을 구해 회전시킨다현재 이동 속도를 구한다현재 속도가 유효 범위밖이라면 속도를 조정한다 = Lerp최종 이동 = 수평, 수직 포함 입력 방향에 대한 각도를 구하는 것은 Atan2와 Reg2Deg를 통해 구해내면 된다.이후, 카메라의 회전은 mainCamera의 참조에서 transform을 받아와 ..
RoomGenerator랜덤한 그래프를 생성하는 로직을 구현해야 하는 상황이다.간단한 이론과 알고리즘이 있을 거라 생각했지만 그리 만만하지 않았다...여러 이론과 방법들을 분석하며 실제로 구현해 보자. 보로노이 + 들로네 삼각 분할보로노이는 평면을 분할하는 방법중 하나이다.평면의 두 점을 연결하고 그에 수직하는 선분으로 평면을 나누어 나간다.그러면 왼쪽 사진과 같이 평면이 자연스럽게 나눠진다.이는 CG에서 땅을 부수거나 벽이 부서지는 등의 효과를 만들 때 많이 사용된다.자연스러움이 있기 때문인 듯 하다.들로네 삼각 분할은 점들을 연결하는 삼각형을 만들 때, 최대한 정삼각형에 가깝게 만드는 방식으로 분할하는 것이다.그러기 위해서, 세 점으로 이루어진 삼각형의 외접원안에 다른 점이 없도록 해야 한다...
ThirdPerson Character Control새로운 프로젝트 스펙이 3인칭에 액션이 중요한 프로젝트라 3인칭 튜토리얼에서 이동, 카메라 제어 등을 분석해 보자.좋은 방법이 있으면 가져다 써야겠다.. ㅎ 입력 처리입력처리는 따로 컴포넌트로 분리하여 처리하는 듯하다.PlayerInput을 이용하여 입력을 처리한다.해당 프로젝트에서는 Send Message 형식으로 입력을 처리했다.#if ENABLE_INPUT_SYSTEM public void OnMove(InputValue value) { MoveInput(value.Get()); } public void OnLook(InputValue value) { if(cursorInputForLook..
종속성 분석 툴 제작이제 마지막으로 종속성을 분석하고 그래프를 그리는 작업을 해보자. 종속성 분석종속성을 분석하는 방법은 여러 가지이다.AssetDatabase.GetDependencies()스크립트 분석어셈블리 분석 GetDependencies의 경우에는 meta파일을 읽어 GUID를 통해 종속성을 분석한다.프리팹 안에 또 다른 프리팹이 포함되어 있거나 이를 참조하는 등 파일 간의 종속성을 파악하는 데는 효과적이다.하지만, 일반적인 C#클래스같은 Type형태의 클래스에 대해서는 참조를 계산하지 못할 수 있다.따라서, GetDependencies를 통해 간편하게 참조를 확인할 수 있는 에셋에 대해서는 GetDependencies를 진행하고 스크립트처럼 다르게 처리해야 하는 에셋들을 분류하여 종속성..
VContainerVContainer는 Unity를 위한 경량화된 DI(Dependency Injection) 컨테이너이다.DI는 객체 간의 의존성을 외부에서 주입하는 디자인 패턴으로, 코드의 결합도를 낮추고 유지보수성을 향상시키는데 도움을 준다.주요 특징가볍고 빠른 성능Unity의 컴포넌트 시스템과의 원활한 통합직관적인 API 제공코드의 모듈화와 테스트 용이성 향상https://vcontainer.hadashikick.jp/ About | VContainerVContainer - the fastest DI (Dependency Injection) for Unity Game Enginevcontainer.hadashikick.jp 기본 구성요소LifetimeScopeLifetimeScope는 VC..
Scirptable ObjectScriptableObject(SO)는 Unity에서 제공하는 데이터 컨테이너 클래스이다.MonoBehaviour와 달리 GameObject에 부착되지 않는 독립적인 데이터 에셋이다.즉, Prefab과 같이 에디터상에 유일하게 존재하는 것이다.또한, Scene과 독립적으로 존재하며 런타임에 변경된 내용을 정적으로 저장하여 가져갈 수 있다.Scene 전환 시에도 데이터가 유지되며 한 번 로드된 SO는 메모리에 캐싱되어 재사용할 수 있다.빌드 시 에셋으로 포함되어 배포되게 된다. Unity 에디터에서 직접 데이터를 수정하고 저장할 수 있기 때문에 밸런싱같은 작업에서 사용하기 매우 좋다. Data Container SOSO는 기본적으로 데이터 컨테이너이다.즉, 순수하게..
Composite Pattern컴포지트 패턴은 부분-전체 계층 구조를 표현한다.인터페이스를 통일하여 개별 객체와 복합 객체를 동일한 방식으로 다룰 수 있게 한다.보통 트리 구조로 구성되며 재귀적은 구조를 가진다.스킬을 예로 들어보면 다음과 같다. Component (ISkill)모든 객체의 공통 인터페이스 정의단일 객체와 복합 객체가 구현해야 할 메서드 선언Leaf (SingleSkill)가장 기본이 되는 객체다른 객체를 포함할 수 없는 말단 객체Composite (ComboSkill)자식 컴포넌트를 가질 수 있는 복합 객체하위 컴포넌트들을 관리하는 메서드 포함실제 작업은 자식 컴포넌트에 위임ComboSkill (Root)├── SingleSkill (Fireball)├── SingleSkill (I..
Strategy Pattern전략 패턴은 동일한 실행 구조를 가지지만, 실행하는 내용이 런타임에 달라질 수 있도록 만드는 패턴이다. 예를 들어, AI가 행동을 할 때, 행동을 한다는 것은 동일하지만 실제로 어떤 행동을 하는지는 상태에 따라 다를 수 있다.간단하게 공격과 방어를 한다고 가정해 보자.공격을 할 때는 플레이어를 찾아 추격할 것이다. 반대로 방어를 할 때는 플레이어와 일정 거리를 유지하도록 할 것이다.두 상태 모두 동작을 한다는 것은 동일하나 실제로 실행하는 동작은 다르다.// 전략 인터페이스public interface IEnemyBehavior{ void Act(Transform enemyTransform, Transform playerTransform);}// 구체적인 전략 클래스들p..