전체 글 77

Unity - AI Poet Haru

작업기간 : 2021.06 ~ 2021.12 작업인원 : 7명 (유니티 및 서버 개발자로 참여) 프레임워크 : unity, node.js(express) 1. 개요 21년 6월 경 유니티 개발자 포지션 제안을 받아 참여하게되었다. 아트앤테크 활성화 창작지원 사업의 지원을 받아 진행되었으며 ai와 시를 이용해 사람이 창작하는 과정을 모사하는 프로젝트다. 2. AI 연구 진행 초기에는 기획이 완성되지 않아서 AI연구에 참여하였다. 처음에는 Jetson nano를 이용해 자연어 학습을 진행하려고 했지만 jetson nano의 초기 세팅을 하면서 난관에 봉착했는데. torch따위를 설치할 때 cuda등의 버젼이 계속 말썽을 일으켰던 것으로, 결국 적절한 os버젼을 찾지 못해서 gpt-3 api를 사용하기로 했다..

Unity_FacePlay (AR 페이스페인팅 어플리케이션)

작업기간 : 2019.12 ~ 2020.3 작업인원 : 8명 (유니티 개발자 및 기획으로 참여) 프레임워크 : unity 1. 개요 2017년부터 2019년까지 랩실에서 연구된 내용을 바탕으로 제작된 AR 페이스페인팅 어플리케이션. 리드개발자님이 건강상의 문제로 하차하면서, 처음으로 팀 단위에서 주도적으로 개발을 진행했던 프로젝트이다. 2. 디자인 컨셉 AR + drawing이기 때문에, 시시각각으로 변하는 카메라 화면 속에서도 명료하게 눈에 띌 수 있도록 최대한 플랫하게 디자인했다. 먼저 UI를 간단하게 배치하고 추후에 제대로 된 UI셋을 만들어서 업데이트를 하기로 했는데, VR-LAB 연장에 실패하고 팀이 해체되는바람에 핵심 엔진에 대한 소유권이 없어지게 되면서 업데이트가 불가능해졌다. 3. 개발 얼..

Unity - Playfab Event Log 붙이기 회고

Unity - Playfab Event Log 붙이기 회고 슬슬 클라이언트쪽 일도 끝났고, 8월 16일부터 23일까지 일주일간 사용자 로그를 붙였다. 담당자가 있었는데도, 왜 내가 하게 되었는가.. 하면 요청 자체는 6월부터 계속 있었지만, 담당자가 "유료 재화의 증/감을 제외한 로그는 불필요하다. 붙일 수 없다"라고 석달넘게 드러눕는 바람에.. 그냥 플레이팹 연구하고싶으니까 계정 등록 부탁드린다고 요청한다음 계정권한을 얻어 로그를 작성해 붙여버렸다. 구현 방식은 다음과 같은데. 각 로그 클래스별로 버퍼를 가지고 있고 로그 요청이 들어오면 들어온 정보를 일단 버퍼에 저장한다. 저장할 때 playerPrefs에도 클래스 이름을 키로 사본을 갱신해둔다. LogManager에서 일정 주기(10분)을 가지고, ..

DevLog 2022.08.27

Unity Refactoring - Reflection을 이용한 유닛 테스트

달팽이 키우기 리팩토링 목차 리팩토링 준비 구조 재설계 UI Manager 설계 클래스간 관계 Action 분리하기 핵심루프 설계 유닛 테스트 달팽이 키우기 유닛 테스트 요약 Reflection을 이용하면, 클래스의 private로 선언된 값과 함수들도 가져올 수 있다. 이것을 이용해, 클래스 내부에 테스트용 함수를 따로 만들지 않아도 테스트를 진행할 수 있다. 설계와 함께 테스트를 작성해볼까? 생각해봤었지만. 달팽이키우기 리팩토링은 1주 이내, 실 작업시간 24시간 이내로 잡고 진행한 프로젝트였기 때문에. 학습비용까지 계산했을 때 견적이 나오질 않을 것 같아서 일단 설계를 끝내고, 이후에 테스터를 붙이는 쪽으로 가닥을 잡았다. 테스터를 붙일 때 한가지 난관에 봉착했는데, 캡슐화때문에 아래와 같이 변수들..

개발 조각글 2022.08.18

일하고싶은 곳이라고 생각하는 기준 여섯가지

들어가며 현재 회사에서 하는 프로젝트도 재밌게 하고 있지만.. 만약에 내가 다음 회사를 구해야 한다면 어떤 것들을 기준으로 그 회사를 체크하고 싶을까? 하는 생각이 들었다. 그래서 6개월 남짓한 시간동안 클라이언트 개발자로 일하면서 느꼈던, "일하고싶은 곳이라고 생각하는 여섯가지 기준"을 정리해두고자 하는데 그 목록은 다음과 같다. 1. 온보딩 프로세스가 있는가? 2. 코드리뷰를 하는가? (최소한 그런 문화가 있는가?) 3. 문제상황이 발생했을 때 공유하는 메뉴얼이 있는가? 4. 토이프로젝트나 스터디를 함께할 수 있는 팀이 있는가?( 최소한 장려하는 분위기가 있는가?) 5. 만약에 특수대학원 진학을 희망한다면, 지원받을 수 있는 제도가 있는가? (최소한 다닐 수 있는가?) 6. 헬스비를 지원받을 수 있는..

DevLog 2022.08.13

Unity Refactoring - 게임의 핵심루프 설계

달팽이 키우기 리팩토링 목차 리팩토링 준비 구조 재설계 UI Manager 설계 클래스간 관계 Action 분리하기 핵심루프 설계 유닛 테스트 Unity Refactoring - 게임의 핵심루프 설계 요약 각 스크립트의 Awake나 Start에 의존하지 않고, 게임 루프가 시작하기 전 확실하게 초기화 할 수 있도록 했고. ActionManager의 update함수에서 루프를 관리하되, 각 기능이 호출되는 프레임을 다르게 설정해서, 항상 의도한 순서대로 함수가 실행될 수 있도록 (민감한 함수들의 실행 순서가 뒤바뀌지 않도록) 조정했다. 달팽이키우기는 관리 대상이 달팽이 딱 하나이기 때문에, 업데이트문을 한 클래스에서 집중적으로 관리하는게 좋을 것 같다고 생각했다. 그래서 ActionManager를 선언한 ..

개발 조각글 2022.08.13

Unity Refactoring - 달팽이키우기 Action 분리하기

달팽이 키우기 리팩토링 목차 리팩토링 준비 구조 재설계 UI Manager 설계 클래스간 관계 Action 분리하기 핵심루프 설계 유닛 테스트 달팽이키우기 Action 분리하기 요약 : Action Manager클래스를 통해, 버튼에 할당할 기능(Action)) 목록과 할당된 기능의 실제 구현을 분리해서 관리하기로 했다. 이로써 버튼은 ActionManager내의 action을 적절히 골라, 조합하여 사용할 수 있고, 구현부에서는 미리 정의된 인자와 출력헝태를 준수한다면. 내부 실 구현을 언제든지 자유롭게 바꿀 수 있게 된다. (구) 달팽이키우기의 버튼&액션 달팽이키우기를 만들었던 당시에는 프로그래밍 패턴이라는게 있다는 걸 알기 이전이었기 때문에, 상당수의 분기들이 스크립트 내에 하드코딩 되어 있었고 조..

개발 조각글 2022.08.13

NOX - ./adb.exe logcat

NOX - ./adb.exe logcat 요약 ./adb.exe devices > portNumber ./adb.exe connect 127.0.0.1:[###portNumber###] ./adb.exe shell ps | grep com.패키지이름,패키지이름 > pidNumber ./adb.exe logcat --pid=[###pidnumber###] 순서대로 실행하는 것으로 Nox에서 실행되는 패키지의 log를 볼 수 있다. adb란? 에디터상에서는 Debug.log(" ");로 손쉽게 로그를 확인할 수 있지만. 빌드로 넘어가게 되면 안드로이드에서는 확인하기 어렵다. 이럴때를 위해 필요한 것이 adb (Android Debug Bridge)이다. https://developer.android.com/..

개발 조각글 2022.08.11

잘하는 개발자?

잘하는 개발자? 요약 운좋게도 내 기량을 발휘해 해결할 수 있는 일들이 많이 있었다. 그리고 투명하게 내가 어떤일을 어떻게 하고있으며 얼마나 걸릴 것 같은지 다양한 채널로 공유한게 도움이 되었던 것 같다. 들어가며 회식이 있었을 때, 감사하게도 팀 동료분들로부터 [참 잘한다] [신입답지 않다] 등의 칭찬을 들었다. 순간 우쭐한 마음이 들긴 했지만.. 앞으로도 계속 이 퍼포먼스를 뽑아낼 수 있도록 하는게 중요할 것 같다는 생각이 들어서, 칭찬과 함께 말씀해주셨던 것들과 어떻게 이런 평가를 받을 수 있었을까? 라고 나름 생각해본 것들을 정리해둔다. 환경과 운 일단 운이 좋았다. 내가 들어갔을 당시 프로젝트는 몇개월째 딜레이되고 있었고. 구현율은 넉넉하게 잡아도 50% 정도의.. 말 그대로 뼈대만 간신히 잡힌..

DevLog 2022.08.09

Unity - 유닛테스트를 염두한 함수 설계

유닛테스트를 염두한 함수설계 유닛테스트를 여기저기 붙이다보니, 붙이기 쉬운 구조가 있고 어려운 구조가 있다는 것을 느끼고 있다. 당연한 이야기일 수 있지만 정리도 할 겸 기록해 둔다. 클래스 내에서 데이터를 가공하는 함수를 만들어야 할 때. 다음과 같은 함수를 생각해볼 수 있다. float stamina; float RecoverStamina(float recoverValue){ stamina += recoverValue; return stamina; } 이 경우 RecoverStamina는 호출 시 클래스 내의 Stamina에 접근해 RecoverValue를더한 뒤 Stamina를 반환한다. 기능적으로는 문제가 없는 함수라고 생각하지만, 이 경우에 테스트를 붙이기 정말 어려웠다.. 특히, 이 Stami..

개발 조각글 2022.08.08