반응형

개발 라이브러리 & 툴 46

비주얼스튜디오(Visual Studio) 솔루션(*.sln) 커맨드라인 빌드 응용

개발을 하다보면 디버그 빌드와 릴리즈 빌드를, 32비트 빌드와 64비트 빌드를, 라이브러리 빌드부터 실행 파일 빌드 등 여러 개의 빌드를 순차적으로 할 때가 있습니다. 이럴 때 마다 비주얼 스튜디오에서 빌드 세팅을 바꾸거나 프로젝트를 바꿔가면서 빌드를 하는 것은 빌드 변경시마다 시간이 걸리는 귀찮은 작업입니다. 이런 경우에 Jenkins와 같은 CI서비스에서 많이 이용되는 커맨드라인 빌드를 응용하여 빌드를 배치로 만들고 실행하면 상대적으로 빌드 시간도 줄이고 편하게 작업을 할 수 있습니다. 비주얼스튜디오 솔루션 커맨드라인 빌드 명령은 MSBuild와 Devenv가 있습니다. Devenv도 내부적으로 MSBuild를 사용한다고 하니 둘 명령은 비슷하다고 할 수 있습니다. 여기서는 MSBuild를 이용한 배..

Unity 개발시 편집 중인 텍스트나 csv파일 데이터를 게임에서 읽기

유니티에서 게임 개발시 텍스트나 csv 데이터 파일의 로딩이 실패하지 않으려면 편집 중인 데이터 파일을 닫고 로딩해야 합니다. 하지만 게임을 개발하다보면 게임 개발과 텍스트나 csv 파일의 데이터 편집을 동시에 하고 싶을 때가 있습니다. 이럴 때는 아래의 방법을 사용하면 텍스트나 csv 데이터 파일을 편집하면서 게임 로딩이 정상적으로 일어나게 할 수 있습니다. 우선 아래의 간단한 소스를 보겠습니다. using UnityEngine; using System.IO; public class Test { public static void Load(string file) { string filepath = Application.dataPath + "/Resources/Data/" + file; using (var..

Unity 2D 카메라 화면 크기 및 좌표 범위 얻기

Unity로 2D 게임을 만들다보면 카메라가 표시하는 화면 좌표에 대한 정보를 얻어야 할 때가 있습니다. 그럴 때 카메라가 표시하는 화면의 왼쪽(Left), 오른쪽(Right), 위(Top), 아래(Bottom), 전체 길이(Width), 전체 높이(Height) 등의 정보가 필요합니다. 아래 소스는 camera_ 변수에 화면을 표시하는 카메라를 설정하면 화면의 왼쪽(Left) x좌표, 오른쪽(Right) x좌표, 위(Top) y좌표, 아래(Bottom) y좌표 및 전체 길이(Width), 전체 높이(Height) 등을 얻는 간단한 소스 예제입니다. 예제 소스에서는 마우스 오른쪽 버튼을 누르면 해당 정보가 디버그로 표시하게 해놓았습니다. 참고로 해당 소스는 간단히 만든 관계로 camera_에 대한 nul..

Unity 씬 이동 간에 빈 이동 씬을 이용하여 최대 사용 메모리 줄이기

이건 전 AXE팀의 NDC 발표 내용 중 일부인데 유니티에서 씬간의 이동시 중간에 빈 씬을 삽입하여 순간적 최대 사용 메모리 양을 줄이는 기법입니다. 이론적으로 말하자면 A씬에서 B씬으로 이동한다고 하였을 때 B씬이 로딩되었을 때 A씬이 언로드되기 전까지 최대 메모리 사용량은 A씬의 메모리 사용량 + B씬의 메모리 사용량이 됩니다. 이때 중간에 메모리 사용량이 거의 없는 빈 이동 씬을 삽입하여 A씬에서 빈 이동 씬으로 이동한 후에 빈 이동 씬에서 B씬으로 이동하게 만듭니다. 이런 빈 이동 씬을 이용하면 순간적 최대 사용 메모리양은 A씬 + 빈 이동 씬과 빈 이동 씬 + B씬 중 최대 메모리 사용량이 됩니다. NDC 내용을 보면 순간 최대 사용 메모리양으로 인하여 튕긴 현상이 있어서 이것을 구현하였다고 합..

C++ boost json 구조체와 json 문자열간 변환 예제

boost json라이브러리를 사용하면 구조체와 json문자열 간의 상호 변환이 간단합니다. 여기서는 간단한 변환 예를 살펴보며 사용법을 알아보겠습니다. 우선 아래와 같은 간단한 예로 살펴보겠습니다. #include #include #include using namespace std; struct user { int id; string name; bool login; }; void tag_invoke(boost::json::value_from_tag, boost::json::value& jv, user const& u) { jv = { {"id", u.id}, {"name", u.name}, {"login", u.login} }; } user tag_invoke(boost::json::value_to_t..

[MongoDB] C/C++ BSON 한글 문자열 입출력

MongoDB는 BSON을 사용합니다. BSON에서 문자열은 UTF-8을 사용합니다. UTF-8과 ANSI의 관계상 영문만 사용한다면 별도의 변환은 필요 없습니다. 그러나 일반적으로 사용하는 한글과 같은 멀티 바이트 문자열이나 유니코드 문자열은 별도로 UTF-8로 인코딩하여야 합니다. 또한 MongoDB에 저장된 문자열을 사용하기 위하여 UTF-8문자열을 한글과 같은 멀티 바이트 문자열이나 유니코드로 디코딩해야 합니다. 참고로 MongoDB C/C++ Driver API에 한글과 같은 멀티 바이트 문자열을 인자로 넣으면 바이트 수가 틀리다는 류의 에러가 나면서 API가 실행되지 않습니다. C/C++에서 한글과 같은 멀티바이트 문자열을 UTF-8로 변환하는 방법은 아래와 같습니다. 우선, boost 라이브..

boost locale을 이용한 C++에서의 Multi Byte와 UTF8간의 문자열 변환

영문만 있는 경우는 문자열은 C/C++에서 UTF-8로 별도의 변환을 필요로 하지 않습니다. 하지만 한글과 같이 멀티 바이트를 사용하는 경우는 별도로 UTF-8로 인코딩 및 디코딩을 해주어야 합니다. 이런 경우 사용할 수 있는 라이브러리가 boost local입니다. 간단한 Multi Byte와 UTF8간의 문자열 변환 예제는 아래와 같습니다. #include #include #include using namespace std; int main(int argc, char* argv[]) { string str = "{\"name\": {\"first\":\"그레이스\", \"last\":\"Hopper\"}}"; cout

[MongoDB] Mongo C/C++ Driver 관련 자료

Mongo C/C++ Driver란? MongoDB를 C/C++에서 사용하기 위한 일종의 SDK입니다. MongoDB C/C++ Driver 인스톨 및 컴파일 방법 Mongo C Driver는 기본적으로 다운받아서 컴파일해서 사용해야 합니다. 그리고 현재는 64bit 버전만을 지원합니다. 32bit는 ODBC 드라이버를 사용해야 할 거 같은데 이것은 검색해보시면 됩니다. Mongo DB C인스톨 및 컴파일 관련 포스팅은 아래와 같습니다. 참고자료: [MongoDB] 윈도우용 MongoDB C/C++ Driver 컴파일 및 인스톨 하기 BSON(Binary JSON) BSON은 JSON의 binary형태로 속도가 빠릅니다. Mongo C/C++ Driver는 기본적으로 JSON이 아닌 BSON을 사용합니다..

Unity 스크립트 수정 후 스크립트 관련 대화상자 뜨는 시간 줄이기

Unity 스크립트를 비주얼 스튜디오에서 수정 및 저장 후 Unity로 돌아오면 Reload Script... 혹은 Hold... 와 같은 타이틀을 가진 스크립트 관련 대화상자가 뜨면서 기다리게 됩니다. 비주얼 스튜디오에서 수정 및 저장한 후에 솔루션 빌드를 하고 Unity로 돌아오면 해당 대화상자가 뜨지 않거나 상대적으로 짧은 시간 뜨는 것을 확인할 수 있습니다. 솔루션 빌드 시간은 Unity가 변경된 스크립트 관련 처리를 하는 시간에 비하여 상대적으로 적은 시간 만을 필요로 합니다. 작은 팁이지만 해당 방법은 실제적으로 개발 시간을 많이 줄여줄 수 있습니다.

Unity 정적(Static)객체를 전역 변수처럼 활용하기

개인적으로 사용하는 정적 클래스의 예는 아래와 같습니다. public static class Global { public static bool IsDev { get { #if DEV return true; #else return false; #endif } } public static NextStageMode ModeForNextStage { get; set; } public static int Stage { get; private set; } = 1; public static bool IsBossStage { get { return (Stage % 10 == 0); } } } 이 객체는 예로 유니티 어느 곳에서나 Global.IsDev와 같이 사용할 수 있습니다. 정적 객체는 씬과 함께 로드되고 삭제되..

Unity 싱글톤(Singleton)의 이해

Unity에서의 싱글톤은 일반적인 C#에서의 코드와는 다르며 일반적인 코드는 아래와 같습니다. public class Settings : MonoBehaviour { private static Settings inst_ = null; public static Settings Inst { get { return inst_; } } private void Awake() { if (inst_ == null) { inst_ = this; DontDestroyOnLoad(gameObject); } else { if (inst_ != this) { Destroy(gameObject); } } } } 위의 코드에서 보면 알 수 있듯이 처음 인스턴스를 만들 때는 gameObject에 대해서 DontDestroyOnLo..

C++ boost json용 라이브러리(boost.json)

boost 1.75 이전 버전은 json을 사용하기 위하여 property_tree를 사용하였습니다. 1.75 버전부터 json을 전문적으로 지원하는 boost.json라이브러리가 생겼습니다. boost.json을 사용하는 Hello World입니다. #include #include #include using namespace boost; using namespace std; int main(int argc, char* argv[]) { json::value jv = { { "Hello", "World" } }; std::string str = json::serialize(jv); cout

C++ boost property_tree를 이용한 간단한 xml 파싱 예제

C/C++에서 json을 사용하려고 boost property_tree를 사용하다가 이 클래스가 xml파싱에도 거의 동일한 인터페이스로 사용할 수 있다는 것을 알게 되었습니다. 아래 예는 간단한 boost property_tree를 이용한 xml 파싱 예입니다. 참고로 소스 중 read_xml에서 iss(istringstream) 대신에 문자열을 넣으면 파일에서 읽게 됩니다. #include #include #include #include #include using namespace std; using namespace boost::property_tree; int main(int argc, char* argv[]) { string data = "" "" "Hello" "" "1" "2" "3" "" "..

반응형