728x90
728x90
[ 프로그래밍/Unity Engine ][쿠고랑 AI 일일 개발일지 #01] Unity 6 UI Toolkit 실측 픽셀 대조: USS cubic-bezier 미지원 결함 해결기2026-11-08 18:30:18TL;DR — 3줄 핵심 요약• 문제: 컴퓨터 화면에 버튼을 그릴 때, 원래 계획했던 점(픽셀)의 위치와 실제 게임 화면에 그려진 점의 위치가 1~2개씩 어긋나는 문제가 생겼습니다.• 원인과 기술: 이미지를 9개 조각으로 나누어 늘리는 방법(9-슬라이스)과 버튼 움직임 속도 규칙(cubic-bezier)이 유니티 6 엔진에서 제대로 실행되지 않았습니다. 화면을 사진 찍어 점의 개수를 자로 재듯 세어보며 문제를 확인했습니다.• 해결과 인계: 작동하지 않는 규칙을 유니티가 읽을 수 있는 다른 규칙으로 바꾸고, 이 사실을 다음 작업자를 위해 노션(Notion) 공용 메모리에 기록했습니다.1인 인디게임 개발사 쿠고랑에서 만들고 있는 3D 큐브 스도쿠 게임 'Facet'의 화면을 유니티 6 엔진으로 옮기던 202..
[ 프로그래밍/42 Gyeongsan ][42경산 FDF] 와이어프레임 모델 구현 가이드: 등각 투영 좌표 계산부터 DDA·Bresenham 선 그리기까지2026-04-12 01:19:33TL;DR — 3줄 핵심 요약• 문제: .fdf 파일에는 숫자만 들어 있는데, 화면은 가로와 세로 두 개의 숫자로 위치를 정한다. 3차원 숫자를 2차원 화면 숫자로 바꾸지 못하면 선을 하나도 그릴 수 없다.• 기술/원인: MiniLibX 창은 픽셀 색 값을 담은 1차원 메모리 배열이다. (x, y) 픽셀의 주소는 y * line_len + x * (bpp / 8) 로 계산되고, 그 주소에 4바이트 색 값을 쓰면 화면의 그 점이 바뀐다.• 해결/인사이트: 원본 z[y][x]는 건드리지 않고, 그릴 때마다 중심 정렬 → zoom → z_scale → 회전 → 등각 투영 → shift 순서로 화면 좌표를 새로 계산한 뒤, DDA로 두 점 사이를 픽셀 단위로 채운다.FDF가 하는 일: 파일의 숫자를 선으로 바꾸..
[ 프로그래밍/Unity Engine ][Unity] ML-Agents로 구현하는 강화학습 게임 AI: 관찰·행동·보상 설계부터 학습 파이프라인까지2025-10-25 20:38:11TL;DR — 3줄 핵심 요약• 문제: 조건문으로 NPC를 짜면 상태(체력, 적 위치, 탄약, 부상병 수)가 늘어날수록 경우의 수가 곱으로 늘어나고, 개발자가 넣지 않은 조합에서 NPC는 아무 행동도 하지 못한다.• 기술/원인: ML-Agents는 상태를 숫자 배열(관찰)로 넘기고, 신경망이 출력한 행동 값을 받아 실행한 뒤, 그 결과로 보상 숫자를 돌려주는 루프를 반복한다. 신경망의 가중치는 PPO 같은 알고리즘이 누적 보상을 키우는 방향으로 조금씩 수정한다.• 해결/인사이트: 결과를 좌우하는 것은 알고리즘이 아니라 보상 함수다. 휴리스틱 모드로 환경이 정상인지 먼저 확인하고, 강화학습으로 정책을 학습시키고, 시범 데이터가 있으면 모방학습으로 출발점을 앞당기는 순서가 실전에서 가장 빠르다.ML-Agen..
[ 프로그래밍/42 Gyeongsan ][42경산 push_swap] 11개 명령어로 정렬하기: 그리디의 함정과 이진 기수 정렬 해법2025-09-21 17:33:28들어가며Push_Swap 과제를 성공적으로 해결하기 위한 첫걸음은 문제의 본질을 정확히 이해하는 것이다. 이 과제는 단순히 두 개의 스택을 이용해 데이터를 정렬하는 문제를 넘어, 제한된 명령어 집합으로 원형 리스트를 효율적으로 재배열하는 고유한 제약 조건을 가진 알고리즘 퍼즐이다. 핵심 과제 및 제약 조건이 프로젝트의 공식 문서에 따르면, 목표는 명확하다: 주어진 정수들을 가장 적은 수의 명령어로 정렬하는 것이다[^1]. 이를 위해 반드시 준수해야 할 핵심 규칙과 제약 조건은 다음과 같다. 기본 구조: a와 b라는 두 개의 스택이 주어진다. 프로그램 시작 시, 모든 정수는 스택 a에 위치하며 스택 b는 비어 있다[^1].오류 처리: 입력값에 중복이 있거나, 정수가 아닌 인자가 포함되거나, 정수 범위를 초..
[ 프로그래밍/42 Gyeongsan ][42경산 Born2beRoot] Rocky Linux 가상 서버 구축: LVM·UFW·SSH·sudo·SELinux 핵심 정리2025-08-05 18:53:21TL;DR — 3줄 핵심 요약• 문제: Born2beRoot는 "서버 한 대를 직접 세워라"는 과제다. 파티션, 방화벽, 원격 접속, 권한, 보안 정책을 각각 설정하고, 평가 때 그 이유를 설명해야 한다.• 기술/원인: 리눅스는 디스크를 논리 볼륨(LVM)으로 나누고, 커널의 netfilter 규칙(UFW)으로 포트를 막고, sshd 설정 파일로 원격 로그인을 제한하고, SELinux라는 커널 수준 접근 제어로 프로세스의 파일 접근을 따로 심사한다. 각 계층이 서로 다른 지점을 막는다.• 해결/인사이트: 순서가 중요하다. 방화벽 포트를 먼저 열고 SSH를 바꾼 뒤, SSH 재시작으로 접속이 끊기지 않는지 확인한다. SELinux 정책 때문에 막히면 setenforce 0으로 원인을 찾고 다시 1로 되돌린..
[ 프로그래밍/Unity Engine ][Unity C#] 비동기 프로그래밍 완벽 가이드: Coroutine vs Thread vs UniTask(Awaitable) 비교2025-07-30 02:56:57TL;DR — 3줄 핵심 요약• 문제: "1초 뒤 실행" 하나를 하려고 코루틴을 쓰는지, Thread를 쓰는지에 따라 프레임이 멈추기도 하고 예외가 나기도 한다. 셋 다 비동기처럼 보이지만 실행 위치가 다르다.• 기술/원인: Coroutine은 컴파일러가 메서드를 상태 머신 클래스로 바꾸고, Unity가 매 프레임 MoveNext()를 호출해 이어서 실행한다. 메인 스레드에서 돌므로 Unity API를 쓸 수 있지만 병렬 실행은 아니다. Thread는 OS가 코어에 배정하는 별도 실행 흐름이다. Unity API는 메인 스레드에서만 안전하다.• 해결/인사이트: 프레임 타이밍과 Unity API가 필요하면 Coroutine(또는 Awaitable/UniTask), CPU를 오래 쓰는 계산은 Job Syst..
[ 프로그래밍/42 Gyeongsan ][42경산 ft_printf] 가변 인자(va_list)로 직접 구현하는 printf: 형식 지정자 처리와 버퍼 최적화2025-07-20 19:28:56TL;DR — 3줄 핵심 요약• 문제: printf는 인자를 몇 개 받을지 컴파일할 때 모른다. 인자의 개수와 타입이 호출마다 다르기 때문이다. 그래서 함수는 서식 문자열을 직접 읽으면서 "다음 인자를 어떤 타입으로 꺼낼지"를 스스로 결정해야 한다.• 기술/원인: 가변 인자는 메모리(또는 레지스터 저장 영역)에 연달아 놓이고, va_list는 그 위치를 가리키는 포인터다. va_arg는 그 포인터를 타입 크기만큼 진행시키며 값을 읽는다. 타입을 잘못 지정하면 엉뚱한 바이트를 읽는다.• 해결/인사이트: 구현은 세 부분으로 나뉜다. 서식 문자열을 훑는 파서, 타입별로 값을 문자열로 바꾸는 변환기, 완성된 문자열을 한 번에 write로 내보내는 출력기. 이 순서로 만들면 디버깅이 쉽다.printf가 실제로 하..
[ 프로그래밍 ]리눅스 한 학기 살기 - 13주차 (完)2025-06-02 01:18:45TL;DR — 3줄 핵심 요약• 문제: 3학점만 들으면 졸업이 되는 학기에 18학점을 채우고, 매주 리눅스 프로그램 하나를 파서 2페이지 이상 보고서를 쓰는 일정을 스스로 만들었다. 시간이 남아서가 아니라, 쓰는 명령이 실제로 무엇을 하는지 모른 채 졸업하고 싶지 않아서였다.• 기술/원인: 매주 하나씩 정한 도구가 서로 연결되어 있었다. 패키지 설치(curl·make) → 원격 접속(SSH·RDP) → 네트워크(VPN·nmap) → 실행 환경(Docker·Jenkins) → 관찰(htop·tree). 한 주의 삽질이 다음 주의 전제가 되었다.• 해결/인사이트: 12주 동안 남은 것은 명령어 목록이 아니라 확인 순서다. 문제가 생기면 ① 프로세스가 떠 있는지(systemctl status) ② 포트가 열렸..
728x90
728x90