본문 바로가기

전체 글

언리얼: LNK2001, LNK2019 등 unresolved external symbol 해결 언리얼 엔진은 C++를 언어를 사용하고, 여러 모듈을 참조해가며 작업해야 할 일이 잦습니다. 주기적으로 컴파일을 시도한다면 함수의 구현부를 작성하는 점을 잊는 등의 사소한 실수도 쉽게 파악해 큰 덩어리의 문제로 커질 일이 거의 없습니다. 때로는 어느 정도 규모의 작업을 한 번에 수행한 뒤 컴파일 및 런타임 테스트를 진행해야 하는 상황이 생깁니다. 일반적으로는 이미 만들어진 프레임워크의 리팩터링을 진행할 때 접할 수 있습니다. 여러가지 상황의 테스트 환경에서 다양한 개발을 시도하는 과정에서 많은 수의 링커 예외가 발생하면 당황스러울 수 있는데요, 다음 번 이와 같은 상황을 맞닥뜨렸을 때를 위해 순차적으로 확인해보았던 요소들을 기록해둡니다. 1. 함수의 구현부의 부재 헤더에 클래스를 정의하고 함수를 선언하였.. 더보기
[백준] 11050 이항계수 1 - GoLang https://www.acmicpc.net/problem/11050 11050번: 이항 계수 1 첫째 줄에 \(N\)과 \(K\)가 주어진다. (1 ≤ \(N\) ≤ 10, 0 ≤ \(K\) ≤ \(N\)) www.acmicpc.net package main import ( "bufio" "fmt" "os" ) func factorial(t int) int { ans := 1 for i := t; i > 0; i-- { ans *= i } return ans } func main() { reader := bufio.NewReader(os.Stdin) writer := bufio.NewWriter(os.Stdout) defer writer.Flush() var n, k int fmt.Fscanln(read.. 더보기
Go: 테스트용 간단 REST API 앱 유니티 엔진에서의 리서치 도중 REST API를 통한 로그인 기능 구현을 할 일이 생겼습니다. 작년이었더라면 웬만한 작업들은 C#으로 해결하려고 ASP.NET Core로 눈을 돌렸을텐데요. 복잡한 기능 명세가 필요하지 않았고 이를 위해 적합한 새로운 언어가 있을거라는 생각에 GoLang을 이용해보기로 했습니다. 유니티 클라이언트에서는 HTTP로 적절한 헤더를 포함시킨 요청을 작성하여 보내고 응답을 받아 처리하는 로직을, GoLang에서는 라우팅에 따라 적절한 요청을 처리하고 결과를 응답하는 로직을 작성합니다. 라우터로는 메인테이닝이 이루어지지 않은지 꽤 된 것 같지만 13K의 Star를 보유하고 있는 julienschmidt/httprouter를 사용했습니다. https://github.com/julie.. 더보기
언리얼: C++ 클래스 추가시 자동 컴파일 해제 언리얼 엔진 에디터에서 C++ 클래스를 추가하면 자동으로 컴파일을 시도합니다. 여러 클래스를 추가하려는 경우 빌드에서 소모되는 CPU 자원과 인터벌에 불만이 생길 때가 생깁니다. 상단 메뉴의 편집 - 에디터 개인설정 - 기타 메뉴에서 C++ 자동 컴파일 옵션을 끌 수 있습니다. 더보기
Unity: 플러그인에 사용하기엔 계륵같은 존재, UI Toolkit 작년 3,4분기에 열심히 개발하던 AssetLens라는 이름의 종속성 탐지 기능이 중점인 플러그인이 있습니다. 지금도 작게나마 관리중이지만, 플러그인의 특성상 다양한 버전의 유니티 에디터를 지원해야하는 어려움에 부딪혀 점차 개발속도가 느려지다 끝내 소소한 버그픽스만 진행하고 있습니다. 가장 큰 문제는 한 번만 작업하고도 여러 버전의 에디터를 동시에 지원하고 싶은 욕심이 불러온 복잡한 개발 파이프라인입니다. GitHub - seonghwan-dev/AssetLens: Asset Lens : Unity asset reference management utility working in background. 에디터 백그 Asset Lens : Unity asset reference management utili.. 더보기
문제해결: 5. 코딩 테스트 안내 메일 콘텐츠가 안 보일 때 저는 Protonmail을 사용하고 있는데요, 일부 수신확인 스크립트나 콘텐츠 로딩을 자동으로 블록합니다. 사생활 보호를 위한 기능이고 수동으로 콘텐츠 로딩 시도가 가능하지만, 이번 케이스에서는 제대로 보이지 않네요. 아래 로드되지 못한 부분에 무언가 내용이 있을 듯 해 보입니다. PC에서는 이런저런 시도를 해 보아도 확인할 수 없어 어떤 내용일까 고민하다가 휴대전화의 Proton Mail 앱으로 확인해보니 제대로 로드가 됩니다. 모바일 앱으로 확인하면 내용을 확인할 수 있습니다. 제때 확인하지 못하고 대수롭지 않게 넘겼더라면, 채용담당자분께 또 전화를 하도록 만들 뻔 했습니다. 이번 사건을 계기로 ProtonMail 사용하는 것을 다시 한 번 재고해보아야 겠다는 생각을 했습니다. 더보기
언리얼: Build.cs에서 디렉터리 존재유무 확인하기 언리얼 엔진 플러그인 개발시 다른 플러그인에 종속성을 갖는 것은 자주 생기는 일입니다. 모듈의 Build.cs에서 다른 모듈을 디펜던시에 추가함으로써 라이브러리를 가져다 사용할 수 있게 되는데요, 만약 종속성이 생겨야 하는 모듈이 존재하지 않을 수도 있다면 어떻게 처리해야할까요? 엔진 단에서 직접적인 기능을 제공하지는 않지만, 간접적으로나마 몇 가지 사항을 체크하여 동적으로 종속성의 판단을 수행할 수 있습니다. 다만 동적이라고 표현되었지만 빌드 스크립트에서 지정해 컴파일 타임에 진행된다는 점을 유의해야 합니다. 플러그인이 설치되었는지 몇 가지 단서가 존재할 수 있는데요. 1. 설치된 엔진에 플러그인이 존재하는지 or 프로젝트에 플러그인이 존재하는지 2. 현재 프로젝트에 플러그인이 활성화 되었는지 3. 적.. 더보기
언리얼: Module Chronicle 1 - 모듈의 이해 이 아티클은 언리얼 엔진을 파악해 가는 단계에 계신 독자를 위해 풀어 쓰여진 글입니다. 직관적이고 쉬운 전달을 위해 풀어 쓰는 과정을 거치다보니, 일부 전달이 매끄럽지 못한 부분이 있을 수 있습니다. 이해가 어렵거나 잘못된 내용을 발견하시면 다음 독자를 위해 한 말씀 부탁드립니다. 감사합니다. 서론 언리얼 엔진은 수 백개가 넘는 수의 모듈로 구성되어 있습니다. 언리얼 엔진은 왜 이렇게 많은 수의 모듈로 분리하여 엔진을 관리하고 있을까요? 모듈 형태로 코드를 관리하는 전략은 수 많은 장단점을 갖고 있겠지만, 언리얼 엔진이 주목했을 것으로 보이는 장점은 다음과 같습니다. 컴파일과 링킹에 소요되는 시간 절약 사용할 모듈만 배포하여 필요한 사이즈의 바이너리 생성 런타임에서 필요할 때 동적으로 적재 가능 간편한 .. 더보기