전체 글 569

[01/25] <어둠속의유산> 5일차

오늘은 ESC 메뉴를 완성하는 날인데... 상태머신으로 창을 전환중이었는데, 전환된 상태의 버튼들에 의해 또 상태가 전환되는 경우가 추가되니까 혼돈이 왔다. 더군다나 기존 상태머신에는 입력을 처리하는 경우를 별도의 메소드 없이 각 상태에서 구현해야했는데, 유튜브 상태머신 관련 영상을 좀 보고 상태머신을 수정했다. 상태머신은 플레이어나 NPC에도 적용되어 있기 때문에 우선은 UI 상태머신만 수정해두었다.  그리고 상태 전환을할때 미친 키 입력이 2번씩 처리되는 사건이 있었는데, 경험상 이건 입력이 Consume되지 않아서인데 Godot에서 입력을 어떻게 Consume하는지 정말 찾기 힘들었다. Claude에 물어보니 답이 나오더라...get_viewport().set_input_as_handled() 입력..

게임/게임개발 2025.01.25

[01/24] <어둠속의유산> 4일차

오늘은 드디어 씬 전환하는 방법을 배웠다. Title, GameOver 화면도 추가해서 제법 게임같아보인다. 화면을 오갈때 이벤트를 막고싶은데...어떻게하면 효율적인지 모르겠다.  또, 플레이어의 감정표현을 추가했다. 이제 이런거 추가하는건 EZEZ.expression이라고 하지말고 emote라고 할껄...네이밍이 생각해보니 아쉽다. 게임의 모든 이벤트 연결이 끝났다. 이제 남은건 몇 개 없는데, 한번 리스트업 해봐야겠다. BGM과 조명을 추가하니 제법 게임느낌이나기 시작했다! ㅋㅋㅋ  타이틀 화면의 로고를 만들었다. 에이스프라이트는 한글이 안나와서 참 아쉽단말이지... 비네트 효과도 쉐이더로 추가한 것이다.

게임/게임개발 2025.01.24

[01/22] <어둠속의유산> 3일차

또 InteractionArea를 건드려봤다. InteractionArea에 Sprite2D를 붙이고 ShaderParamter를 조정하는 건 영 아닌거같아서 InteractionArea는 활성/비활성 신호만 보내고, OutlineHighlight를 해주는 컴포넌트를 따로 만들었다. 구조가 더 깔끔해진 것 같다. 이렇게 정리한 끝에, 여러개의 Interactable이 활성화 되더라도, 플레이어와 가장 가까운 하나의 Interactable에만 하이라이트가 보이도록 수정되었다.  거지같은 Dialogic을 떼버릴 준비를 했다. 컷씬을 넣으려는데 어떻게 넣는건지 찾아봐도 없고...자유도없는 프레임워크 속에 갇힌 느낌이라, DialogManager로 이주하는 작업을 했다. 늦었다고 생각할때가 가장빠르다. Dia..

게임/게임개발 2025.01.22

[ComfyUI] Workflow를 Python API로 만들기

ComfyUI로 구성한 Workflow를 Python API로 만드는 방법을 공유한다. ComfyUI 서버에 HTTP/Websocket 통신을 하는 구조로 되어있기 때문에 사실 어떤 언어든 가능하다. 노드 ID의 확인과 사용예시로, Text 프롬프트를 읽고 이미지를 출력하는 Workflow가 있다고하면 ComfyUI에서는 이런 TextInput Node를 준비하고, 이 노드의 출력을 CLIP Prompt 노드의 STRING 포트와 연결한다. 이 노드의 우측상단 귀퉁이에는 #37이라는 번호가있는데, 이것이 노드 ID다. Workflow를 API 형태로 Export하고JSON 파일을 열어보면 “37”번 키에 해당 노드의 정보가 들어있음을 알 수 있다. 우리는 이런식으로 JSON 파일을 읽고, 입력값을 바꾸길..

[FastAPI] Server Sent Event(SSE)를 이용한 비동기 스트리밍 구현

이미지 생성 모델을 이용한 이미지 생성 및 이미지 처리 툴을 테스트하기 위해서 WebGUI가 필요했다. 이미지 생성은 오래 걸리면 10초가량도 소요될 수 있기 때문에, 태스크 처리 상황에 대한 클라이언트와 서버의 지속적인 통신이 필요하다. 나는 특히, 이미지 처리 상황을 ProgressBar로 보여주고 싶었다. HTTP/2의 주요 피쳐중의 하나인 SSE(Server Sent Event)를 통해서 이를 처리하는 방법을 공유하겠다. 사용한 서버쪽 프레임워크는 FastAPI다.app = FastAPI()async def progress_stream(): for i in range(100): d = { "progress": i / 100, } yie..

카테고리 없음 2025.01.21

[FastAPI] 요청/응답 로깅하는 법

Python 웹서버 프레임워크 FastAPI의 모든 요청과 응답, 응답시간을 로깅하는 미들웨어를 추가하는 코드다.import logginglogging.basicConfig(level=logging.INFO)logger = logging.getLogger("request_logger")@app.middleware("http")async def log_requests(request: Request, call_next): start_time = time.time() # 요청 정보 로깅 logger.info(f"Request: {request.method} {request.url}") logger.info(f"Headers: {request.headers}") logger.i..

[돌체 구스토] 지니오 S 터치 후기

얼마전까지 지인이 쓰던 SCISHARE 네스프레소 커피머신을 물려받아 사용하던 중,상품권을 쓰러 일렉트로마트에 갔다가 아주머니의 환상적인 마케팅에 충동적으로 구매했다. 돌체구스토머신은 머리가 동그랗게 생겨서 볼때마다 못생겼다고 생각해서 전혀 살 생각이 없었는데,직접 머리를 열어보니까 청소하기가 너무 편해보였다. 원래 쓰던머신은 커피 캡슐과 추출하는 부분사이를 절대 청소할 수 없는 구조였는데, 새로 산 머신은 그 부분이 아주 시원하게 노출되어있다. 그리고 높은 컵도 무리없이 쓸 수 있고, 어댑터를 끼우면 기존 네스프레소 캡슐과도 호환된다고한다.  언젠가 멋진 주방의 집으로 이사갈것을 꿈꾸며(?)맥북색깔로 샀는데 아주 맘에든다.

나/리뷰 2025.01.19

[01/19] <어둠속의유산> 2일차

음. 생일에 이러고있으니까 약간 현타오지만. 생일이 뭐...특별한가! 라고 마인드 컨트롤. Dialogue 스타일을 바꿨다. 게임 창 사이즈도 바꾸고, 대화와 맵이 잘 보이도록 했다. 원래는 시스템 메세지를 위한 스타일을 따로 만들었었는데, 화자의 Portrait을 레이아웃 밖으로 꺼내서 화자가 없을때 Portrait만 가리면 되도록했다. 그렇게해서 System Style을 떼냈다. 튜토리얼을 만들었다. 잔디밭이 휑했는데 기본적인 조작법을 아래에 알려주고, 해당 키를 누르면 하이라이트 되도록 했다. 하이라이트하기 위해서 Shader를 사용했고, 키를 누르지 않고있다면 Shader Parameter를 초기화 하는식으로 구현했는데...이게 맞나 싶다. 코드가 너무 verbose함. 새벽에 잠이안와서 튜토리얼..

게임/게임개발 2025.01.19

[01/18] <어둠속의유산> 1일차

RPG Marker MZ 에셋 준비, 몇가지 무료 SFX를 itch.io에서 다운받음 상태머신을 활용한 캐릭터 움직임 구현 타일맵을 구성하는 중, 합쳐진 타일의 기준점이 중앙에가있어서 타일맵의 그리드에 딱딱 맞지 않게 그려지는 문제가 있었는데, 렌더링 > 텍스트 원점을 내가 그려지길 원하는 쪽으로 바꿔주었더니 잘된다. 집 안, 바깥, 우주까지 필요한 맵들을 준비했다.우주는 GodotShaders에서 우주 셰이더를 다운받아서 구현했다. DialogSystem 라이브러리중 가장 유명한 Dialogic을 사용해봤다. 커스텀하는데 진짜 피똥쌈...아직 개별 스타일을 만드는 방법을 몰라서 전체를 커스텀했다. 다음엔 Dialogic말고 다른걸 써볼까...넘 복잡하다. 캐릭터가 다가가서 Interaction을 하는 ..

게임/게임개발 2025.01.18

[ComfyUI] AI를 이용한 배너광고 자동 생성 워크플로우

가능한 사람의 손을 거치지 않고 다음과 같은 형식의 배너 광고를 생성하는 것이 나의 목표였다.사실 이 첨부사진은 자동으로 만들어낸 이미지다!입력으로는 게임 일러스트 사진을주고, 광고 문구를 제공해주었다.이 광고 배너를 만든 ComfyUI 워크플로우를 하나하나 뜯어보면서 어떻게 구성했는지 설명해보겠다. Step1. 배너 크기만큼 늘리기어떤 AspectRatio를 가진 이미지라도 가로배너 이미지로 만들어주기 위해 좌측의 Padding 값을 계산하는 단계다. 세로형 이미지의 경우 이미지가 정방형이라고 가정했을때 생기는 좌우 패딩만큼의 간격을 오른쪽에 추가해준다. 을 하게되면 패딩한 만큼 이미지 옆에 회색 공간이 생기고, 마스크도 그에 맞춰서 생성된다. Step2. 마스킹된 영역 흐리게 채우기이전 단계에서 마스..