컴포지션 패턴이란? 단일객체와 복합객체를 동일하게 다룰 수 있게해주는 디자인 패턴 컴포지션 패턴의 구조는 Component - 컴포넌트 Leaf - 단일객체 (Component 상속) Composite - 복합객체 (Component 상속) 이런 구조로 이루어져 있다. 이 개념을 처음 봤을 때는 복합객체? 단일객체? 이게 무슨 소린지 한번에 감이 안잡힐 수 있다. 본인도 확실하게 개념을 잡고 싶어서 글을 찾아 보던 중 좋은 예시를 찾게됐는데 이를 토대로 설명하고자 한다. 우리는 전국의 모든 메뉴들이 사용할 수 있는 메뉴 컴포넌트를 제작한다고 가정하자. 그럼 메뉴판과 메뉴가 하는 기능이 각각 다를 것이다. 그럼 우선 메뉴와 메뉴판이 하는 기능을 메뉴 컴포넌트에 공통 기능으로 제작 후 메뉴와 메뉴판이 각각 ..
TIL
좋은 프로그래머가 되기 위해서는 코드를 잘 구성하고 구현하는 것도 중요하지만 문제가 발생했을 때 그것을 빠르게 찾아내고 정확한 방법으로 해결하는 능력이 더 중요하다고 생각한다. 그렇기 때문에 디버그를 해야하는 이유와 방법을 소개하며 개념을 숙지하고자 한다. 디버그란? 코드에서 발생하는 오류에 대한 이유를 검출하고 수정하기 위한 작업 과정이다. 디버깅을 해야하는 이유 개인 프로젝트나 알고리즘 문제를 풀 때는 규모도 작고 시간도 자유로워서 디버그를 굳이 하지 않고 계속 코드를 바꿔가면서 실행하는 경우가 많다. 하지만 한 번 실행하는데 1 ~ 2분 이상이 걸리고 주어진 시간안에 치명적인 버그를 고치지 못하는 상황이라면 계속 코드를 바꿔가며 실행하는 것은 굉장히 비효율적일 것이고 프로젝트에 큰 영향을 끼칠 것이..
유니티에서는 정말로 편리한 기능들을 제공하곤 하는데 그 중에서 내 기준으로 가장 편리했던 기능은 Find 기능이었다. 그래서 유니티를 전문적으로 배우지않고 취미 생활이나 간단한 포트폴리오 제작을 하는 과정에 있다면 Find를 엄청나게 난사하여 사용하는 경우가 있을 것이다. 그래서 오늘은 이러한 기능을 무분별하게 사용할 시 어떤 문제가 발생하는지 알아보고자 한다. Find Find는 내가 원하는 오브젝트를 string으로 검색하여 값을 반환해주는 기능이다. Find의 단점 오브젝트가 어디에 있든 찾아오는 정말 편리한 기능이라고 생각한다. 하지만 Find가 편리하고 성능도 좋다고 생각해보면 싱글톤이란 디자인패턴의 존재 이유, 연관된 기능들로 구성되있는 구조적 설계 등 이러한 것들의 의미가 거의 사라지게 된다..
프로젝트를 하다보면 본인이 설정해 놓은 데이터를 효율적으로 저장하고 받아오고 싶은 경우가 생기곤한다. 하지만 개인 프로젝트를 진행할 때 Json 파일을 연동해서 받아오는 것도 좋지만 Json을 처음부터 쓰지 않는 게임일 수 도 있고 Json을 사용하기엔 애매한 데이터가 있을 수 도 있다. 오늘은 이러한 문제를 해결하기 위해서 사용되는 Scriptable Object라는 기술에 대해 설명하고자 한다. Scriptable Object란? 클래스 인스턴스와는 별도로 대량의 데이터를 저장할 수 있는 데이터 컨테이너다. 다시 말해 본인이 만드는 게임의 기초가 되는 데이터들을 미리 저장하여 원할 때 불러와서 사용할 수 있다. 사용하는 이유 스크립터블 오브젝트의 개념을 보면 이런 생각이 문득 들 수 도 있다. 그냥 ..
유니티 프로젝트를 진행하다보면 오브젝트를 움직이기 위해 스크립트 상에서 코드를 작성해본 경험이 한 번씩 있을 것이다. 근데 Transform에 포지션과 관련된 기능을 본다 가정하면 Transform.position과 Transform.localposition이 존재하는 것을 확인할 수 있다. 로컬과 월드의 개념을 모르고 사용했다면 그냥 내가 원하는 위치에 갈 때 까지 좌표를 계속 바꿔가면서 사용해야 할 것이다. 그렇기 때문에 오늘은 로컬 좌표와 월드 좌표에 대한 개념을 알아보고자 한다. 로컬 좌표 오브젝트를 기준으로 하는 좌표다. 그럼 오브젝트를 기준으로 하는 좌표가 무엇인지 살펴보면 우선 처음에 Square라는 스프라이트를 하나 생성 해주고 그 위치를 (2, 0, 0)으로 설정 해줬다. 그 다음 자식 ..
유니티 프로젝트를 생성할 때 종류들을 보면 URP, HDRP 이런 단어들이 옆에 붙어있는 것을 볼 수 있다. 처음엔 개념을 모르니 혹시나 하는 마음에 렌더링 파이프라인이 적히지 않은 기본 프로젝트 세팅으로 생성하곤 했다. 그래서 오늘은 유니티의 렌더링 파이프라인에 대한 개념과 종류에대해 알아보고자 한다. 렌더링 파이프라인이란? 씬에있는 컨텐츠들을 애플리케이션 -> 지오메트리 -> 래스터라이저와 같은 렌더 파이프라인 과정을 거쳐 화면에 표시해주는 것이 렌더링 파이프라인이다. 유니티의 렌더링 파이프라인 종류 built-in 유니티에 디폴트로 설정되어 있는 렌더 파이프라인이다. 아무래도 기본적으로 내장되어 있기 때문에 기존 컨텐트와 호환성이 좋다는 장점이 있지만 SRP(Scriptable Render Pipe..
자신이 코딩테스트를 통해 코딩공부를 하고 있었다면 사실 생명주기에 관하여 크게 관심이 없을 것이다. 하지만 유니티를 통한 프로젝트에선 생명주기가 어떻게 구성되는지 정말 중요하다. 이를 신경쓰지 않고 구현한다면 무수한 Null오류가 당신을 반겨줄 것이다. 그렇기 때문에 오늘은 유니티의 생명주기에 관하여 정리하고자 한다. 유니티의 생명주기란? 유니티에서 처음 스크립트를 생성하면 모두 Monovehaviour 클래스를 상속받고 있다. 이 클래스는 시작과, 업데이트 같은 유용한 이벤트에 대한 연결을 제공하며 일정한 흐름에 따라 자동으로 호출된다. 이러한 과정을 유니티의 생명주기라고 부른다. 생명 주기 흐름 생명 주기 기능 설명 Awake 스크립트가 실행될 때 한번만 호출, Start함수 전에 호출되기 때문에 주..
프로젝트를 하다보면 함수를 재정의하여 사용해야 하는 경우가 생기곤 한다. 그럴 때 마다 인터페이스를 사용할지 상속을 사용할지 고민이 된다. 왜냐하면 인터페이스와 상속에 대한 확실한 개념을 모르면 그냥 둘이 비슷한 기능을 한다고 생각하기 때문에 확실히 어떠한 점을 기준으로 나누기 힘들기 때문이다. 그리하여 오늘 인터페이스와 추상클래스에 대하여 개념을 숙지하고자 한다. 인터페이스란? 예를 들어 A회사 핸드폰, B회사 핸드폰.. 등 여러 회사의 핸드폰이있다고 가정할 때 모두 핸드폰의 특색은 다르지만 충전포트는 C타입으로 통일해야한다. 여기서 C타입 충전포트를 인터페이스, ~회사 핸드폰을 인터페이스를 상속받는 클래스라고 생각하면 된다. 인터페이스를 상속받는 클래스들은 무조건 인터페이스에 선언된 메소드, 이벤트,..