# 2026 포트폴리오용 재구성 코드

실제 업무 당시 소스가 아닙니다. 프로젝트에서 다룬 문제를 바탕으로 새로 작성한 독립 예제입니다.

## 검증
Unity 6000.0.23f1 컴파일 및 Editor 검증 56개 통과. 실제 장비 연동과 제품 통합은 검증 범위에 포함하지 않습니다.

## 설치
Unity 프로젝트의 Assets/Examples 폴더에 사용할 .cs 파일을 복사합니다. PortfolioExamples 네임스페이스의 정적 함수와 모델은 호출용 스크립트에서 사용합니다. GhostReplay와 RotationSensorSelector만 GameObject에 붙이는 MonoBehaviour입니다.

## 기존 예제
- GhostReplay: time,x,y,z,qx,qy,qz,qw 헤더가 있는 CSV TextAsset을 지정합니다. ghost-sample.csv를 사용할 수 있습니다. 최근접 지점 탐색은 교차 경로에서 경로 진행도를 보장하지 않습니다.
- RotationSensorSelector: 같은 좌표계로 보정된 pose Transform들을 입력합니다. 실제 SDK 어댑터는 tracked 상태와 데이터 만료를 갱신해야 합니다. output을 입력 pose로 사용하지 마세요.

## ReplayTimeline.cs
위치·회전은 보간하고, 활성 여부와 애니메이션 상태는 기록 시점에 맞춰 선택합니다.

사용: ReplayFrame 배열에 증가하는 시간을 넣고 Sample(frames, time)을 호출합니다. time을 줄이면 역방향 탐색이 됩니다.

범위: 단일 객체의 메모리 내 샘플입니다. 파일 입출력, 다중 객체 수명, 음성 동기화는 포함하지 않습니다.

## PoseAlignment.cs
센서 기준의 관절 자세를 로컬 좌표로 바꾼 뒤 아바타 기준으로 옮깁니다.

사용: 보정된 sensorRoot, sensorJoint, avatarRoot Pose를 Retarget에 전달합니다.

범위: 축·단위·스케일은 미리 일치해야 합니다. 장비 캘리브레이션이나 스켈레톤 리깅 전체를 구현하지 않습니다.

## FrameDelayBuffer.cs
정해진 개수의 샘플을 보관한 뒤 입력 순서대로 출력합니다.

사용: new FrameDelayBuffer<T>(delayFrames)를 만들고 샘플마다 Push를 호출합니다.

범위: 프레임 수 기준 지연입니다. 가변 네트워크 지연 보정이나 TCP 전송 계층은 포함하지 않습니다.

## AdaptiveNpcPace.cs
경로 진행도 차이를 사용해 앞선 NPC는 늦추고 뒤처진 NPC는 빠르게 합니다.

사용: 동일한 경로의 playerProgress와 npcProgress를 Speed에 전달합니다.

범위: 폐곡선 경로의 랩 처리는 호출자가 해야 합니다. 물리 이동·경로 추종은 포함하지 않습니다.

## PerceptionRules.cs
거리·시야각·가림 여부로 탐지를 판단하고, 아군 신호와 기억 시간으로 상태를 선택합니다.

사용: InView에 월드 위치·방향과 외부 raycast 결과를 전달하고 Decide로 상태를 선택합니다.

범위: Raycast, 실제 전투, 경로 이동, 동료 통신은 별도 계층입니다.

## TutorialSequence.cs
잡기·작동·재장전 입력을 순서대로 확인하는 작은 상태 모델입니다.

사용: 장비 입력 어댑터에서 Accept(TutorialStep)를 호출합니다.

범위: 특정 XR SDK 입력 바인딩, 총기 물리, 실제 애니메이션은 포함하지 않습니다.

## LocalLeaderboard.cs
플레이어별 최고 점수를 유지하고, 동점은 이름 순으로 정렬합니다.

사용: Submit(player, score) 후 Top(count)로 결과를 받습니다. 스테이지별로 별도 인스턴스를 만듭니다.

범위: 메모리 내 모델입니다. 파일 저장·복원과 온라인 랭킹은 구현하지 않습니다.

## PathRecovery.cs
이동해야 하지만 위치 변화가 없는 시간을 누적해 복구 필요 여부를 반환합니다.

사용: 매 프레임 Tick을 호출하고 true일 때 주변 공간을 검사한 뒤 복구 동작을 수행합니다.

범위: 안전한 위치 탐색이나 실제 이동은 호출자가 담당합니다. 벽을 통과시키는 코드는 없습니다.

## SharedOrigin.cs
double 좌표에서 공통 원점을 뺀 뒤 Unity의 float 좌표로 변환합니다.

사용: 이미 같은 직교좌표계·단위로 변환된 WorldPoint와 origin을 사용합니다.

범위: 위경도 투영, ECEF 변환, 지구 곡률 계산을 대신하지 않습니다.

## SessionRoleSelector.cs
동일한 참가자 목록에서 가장 작은 ID를 선택하는 결정적 예시입니다.

사용: SelectCoordinator에 현재 참가자 ID 목록을 전달합니다.

범위: 새로 작성한 일반 예제이며 당시 프로토콜이 아닙니다. 합의·장애 복구·분할 네트워크는 해결하지 않습니다.

## SensorOverlayProjection.cs
가상의 카메라와 점을 사용해 화면 UV와 시야 내부 여부를 계산합니다.

사용: 카메라 로컬 좌표, 수직 FOV, 화면 종횡비를 Project에 전달합니다.

범위: 공개 수학을 이용한 독립 예제입니다. 실제 항공 장비·프로토콜·센서 모델을 재현하지 않습니다.

## ScenarioChecklist.cs
가상의 Connect·Inspect·Complete 단계로 순차 검증 원리를 설명합니다.

사용: 임의의 단계 이름으로 생성하고 Confirm(name, result)을 호출합니다.

범위: 실제 발사 절차나 제어 코드와 무관한 교육용 예제입니다. 실패 시 현재 단계를 유지합니다.

## TrainingRoster.cs
합성 장비 ID와 마지막 수신 시간으로 온라인 상태를 판단합니다.

사용: 단조 증가하는 초 단위 시간을 Heartbeat와 IsOnline에 전달합니다.

범위: 실제 장비 통신·개인정보·GPS 데이터는 사용하지 않는 일반 상태 모델입니다.

## PathProjectile.cs
시작점·제어점·도착점으로 2차 베지어 경로를 계산합니다.

사용: Sample에 세 위치와 0~1 진행도를 전달해 표시 위치를 받습니다.

범위: 명중 판정과 점수는 별도입니다. 이동 표적을 따라갈지 고정할지는 호출자 정책입니다.

브라우저 데모는 동일한 개념을 설명하는 JavaScript 구현이며, C# 코드의 WebGL 빌드가 아닙니다.
