개발 조각글 26

Unity Refactoring - 달팽이 키우기 리팩토링 준비

달팽이 키우기 리팩토링 목차 리팩토링 준비 구조 재설계 UI Manager 설계 클래스간 관계 Action 분리하기 핵심루프 설계 유닛 테스트 달팽이 키우기 리팩토링 준비 들어가며 달팽이 키우기는 2020년 즈음 교수님과 하던 연구실 플젝을 끝내고, 4학년으로 복학하기 직전에 후다닥 만든 게임인데. 2개월만에 기획에서 런칭까지 끝내야했던 까닭에.. 설계없이 무작정 짰던 나머지 모든 로직이 status.cs에 들어가 있는 기적의 구조를 갖게 된 게임이다. 그러던 와중 최근에 참여했던 가족 모임에서, 사촌동생이 달팽이가 너무 잘 죽는다고 피드백을 주었고. 오래간만에 값이나 좀 바꿀까 싶어서 들어가봤다가 이대로는 좀 아닌 것 같아가지고.. 겸사겸사 일하면서 배운것도 실습해볼 겸, 예전에 만들었던 달팽이 키우기..

개발 조각글 2022.07.28

Unity - Scriptable Object

Unity - Scriptable Object 요약 ScriptableObject는 유니티 엔진이 쉽게 읽고 쓸 수 있는 직렬화 방식이다. 이를 통해 에셋단계에서 바로 읽고 쓸 수 있으므로 씬에서 인스턴스를 생성하지 않아도 된다. (= 메모리를 아낄 수 있다) Scriptable Object도 static instance를 통해 싱글톤처럼 사용할 수 있다. 단 ScriptableObject는 유니티에 특화되어 있으므로 유니티 외부로 보낼때는 주의가 필요하다. 또한 상태를 영구적으로 저장할 수 없다 (앱 종료 시 변화량이 휘발된다) 유니티 도큐먼트에 따르면 ScriptableObject는 다음과 같다. ScriptableObject는 클래스 인스턴스와는 별도로 대량의 데이터를 저장하는 데 사용할 수 있는 ..

개발 조각글 2022.07.24

Processing - Mac에서 Cam을 찾지 못할 때

Processing - Mac에서 Cam을 찾지 못할 때 Mac OS Catalina 환경에서 Processing 3.5.4 버전을 쓸 때 Video Library for Processing 3 2.0를 이용해 Cam.Start()를 사용하려고 하면, (Target VM failed to initialize) 오류가 발생하면서 뻗어버리는 경우가 있는데. 이럴때는 프로세싱 아이콘을 우클릭해서 "패키지 내용 보기"로 패키지폴더를 열어주고, Contents > MacOs 로 들어가면 있는 터미널 아이콘의 Processing을 실행해야한다 (이 때, 이미 열려있는 프로세싱 창들을 완전히 꺼줘야 한다.) 그러면 터미널이랑 같이 새 프로세싱 창이 뜰텐데 여기에다 아까 실패한 Cam관련 파일을 실행하면, 프로세싱 실..

개발 조각글 2022.07.23

Python - input = input() 문제

Python - input = input() 문제 C#(정확히는 Unity)로 개발에 입문하고, 줄곧 C 같은 정적 타입 언어만 사용하다가. 동적 타입인 파이썬을 사용할 일이 있어서 좀 쓰게 되었다. 쓰던 와중 파이썬이 런타임에서 자료형이 결정된다는 건 알고 있었지만.. input = input() 이것도 된다는걸;;; 알아버려 가지고, 정확히 이게 어떻게 돌아가는 건지 한번 정리해두기로 했다. C#과 같은 것들은 정적타입 언어라, 컴파일단에 먼저 선언된 데이터 타입에 따라 메모리를 할당하고 식별자는 할당된 메모리를 가리키기 때문에. int타입 변수에 string과 같은 것들을 암시적으로 그냥 막 집어넣을 수 없다(정 하고 싶으면 casting을 통해, 컴파일러에게 메모리 손상이 있을 수도 있다는 거 알..

개발 조각글 2022.07.22

Unity - 인스펙터 두개 띄워놓기

Unity - 인스펙터 두개 띄워놓기 유니티에서 작업할 때, 인스펙터에다가 뭘 끌어서 놓아야 할 때 종종. 드래그해야 하는걸 클릭을 해버리는 바람에 클릭된 오브젝트의 상세정보가 뜨면서, 다시 원 오브젝트를 포커싱해야 할 때가 생긴다. 그런 짜증나는(!) 상황에는 인스펙터를 두개 띄워놓으면 해결할 수 있다. ↑ 이것처럼 창 우측 상단의 ⋮ 버튼을 누른 뒤. AddTab > Inspector를 하면 인스펙터를 하나 더 열어놓을 수 있다! 그 다음에 새로생긴 인스펙터의 자물쇠를 눌러서 잠가놓으면, 선택된 오브젝트를 계속 인스펙터상에 포커싱해 둘 수 있다.

개발 조각글 2022.07.18

Python - TextToCsv

Python - TextToCsv 이제 긁어온 텍스트를 저장할 때, 그냥 .txt형식으로 저장하면 한두개 정도는 괜찮은데 이제 이게 데이터가 많이 쌓이거나 했을떈, 가공이나 이런게 너무너무 힘들어지기 때문에 CSV로 변환해서 저장하기로 했다. python 에는 csv모듈이 있으며, 해당 모듈을 import하는 것으로 csv를 가공할 수 있다. with open('result' + fileId + '_desc.csv', 'a', encoding='utf-8-sig', newline='') as f: writer = csv.writer(f) ... descText = [col1, col2, col3, col4 ... ] writer.writerow(descText) 위와 같은 코드를 통해 with open으..

개발 조각글 2022.07.17

Python - Torch 챗봇 테스트

https://wikidocs.net/157001 9. koGPT2 챗봇 만들기 언어 모델 (Language Model)이란 문장 혹은 단어에 확률을 할당하여 컴퓨터가 처리할 수 있도록 하는 모델입니다. 한발 나아가 언어 모델링 (Language Mod ... wikidocs.net 챗봇 코드가 필요한 사람은 이곳으로 가십시오, 이 포스트는 이 페이지 코드의 도움을 받았으며 이곳에 더 잘 정리되어 있습니다. 작년에 했던, 시짓는 AI프로젝트가 조금 찜찜하게 끝나고. (관련링크) 아쉬웠던 차에 올해도 AI관련 프로젝트를 할 기회가 생겨서 냉큼 참여하게 되었다. 이번에는 챗봇을 만들어보는 일인데.. 확실히 특정 기기만 사용해야 한다는 제약상황이 사라지니까 한결 살 것 같다. (작년에는 JetsonNano만 ..

개발 조각글 2022.06.12

Processing - Video_Capture가 작동하지 않을 때

프로세싱을 사용하다 보면 Video 라이브러리의 LiveCam을 사용해야 할 때가 있는데. 노트북에 웹캠이 있는데도 불구하고 이게 실행이 안 될 때가 있다. //Try video = new Capture(this, width, height) //Error //Processing video library using GStreamer 1.16.2 //IllegalStateException: Could not find any device 그럴때는 아래처럼 "pipeline:autovideosrc"를 적어주면 된다. video = new Capture(this, width, height, "pipeline:autovideosrc"); Capture함수는 Capture의 인자로 deviceName도 받을 수 있도..

개발 조각글 2022.06.04

Phthon - Web 정보 긁어오기

DoCwalTest.cs 사이드 프로젝트로 웹의 정보를 긁어올 일이 생겨서 간단하게 만들어 보았다. urllib.request 모듈로 requset 결과를 저장한 다음에. BeautifulSoup을 이용해 html 파싱을 진행하는 방식이다. archive 내의 텍스트만 필요한 상황이어서 arta = soup.find_all('div', class_='*** class name ***') filteredText = url + '\n' for art in arta: filteredText += art.text.strip() soup(soup는 BeautifulSoup로 파싱한 결과물)에서 원하는 div를 찾은 뒤. text.strip()을 통해 텍스트만 추려서 넣어두었다. 이렇게 하면 같은 필요 없는 정보를..

개발 조각글 2022.05.30

Unity UI 컴포넌트 캐싱[0]

UIObj.cs Getcomponent는 비싸기 때문에, 스크립트 내에서 미리 캐싱해서 쓰고있는데. Find 함수를 쓰게 되면 매번 Find("name")을 달아줘야 한다. 이 과정에서 캐싱을 위해 생성한 변수의 이름을 변경하거나, 해당 오브젝트의 이름을 변경하는 경우 NewName = transform.Find("OldName").GetCompoenet();의 형식을 갖게 되는데 이게 점점 누적되면서, NewName과 OldName이 아주 다른 이름이 되어버리는 경우가 종종 생긴다. 이렇게 되면 대응되는 변수와 오브젝트를 찾기가 아주 어렵기 때문에 오브젝트 네임과 변수명을 반드시 일치시켜야만 하는 구조가 있어야 한다고 생각해 하나 만들었다. 만들어두니 꽤 편리해서 여기저기 가져다 쓰는 중이다. publ..

개발 조각글 2022.05.20