13 KiB
13 KiB
FirstRising 비주얼 개선 — 세션 3 인수인계서 (2026-09-19)
작성: 총괄PM · PD 지시 "다음 세션에서 작업 이어갈 수 있도록 세션 공유하고 이 세션은 작업 마무리". 이 문서 한 장으로 다음 세션을 시작한다. 이전 인계서:
2026-09-19_비주얼개선_자율작업_인수인계.md(세션 2 · Phase 1~10 상세) ·2026-09-19_비주얼개선_세션인수인계.md(세션 1 · 원칙·프롬프트 원문). 대화 원문 요약:2026-09-19.md§5.
0. 다음 세션 첫 프롬프트
FirstRising TestVisual 비주얼·타격감 작업을 이어서 진행해.
인수인계서 E:\BurningTimes\공유\대화로그\FirstRising\2026-09-19_비주얼개선_세션3_인수인계.md 를 먼저 읽고,
§2 원칙을 지키면서 §6 남은 작업 중 내가 지시하는 것부터 진행해. 지시가 없으면 §6-1 성능 실측부터 해.
작업은 C:\BurningTimes\FirstRising 의 bt/work 브랜치에서 하고, 시작 전에 브랜치·Unity 연결 상태를 확인해.
1. 현재 상태 한눈에
- 레포
C:\BurningTimes\FirstRising· 브랜치bt/work=9a6bf3c02a(세션 3: 성능 실측 수정72d7124497+ 원격 병합8453d1d5fe+ 크래시 수정, 미push) · origin/master = origin/bt/work =7d393378c4(bluecell2 가 master↔bt/work 병합, TestVisual 커밋이 master 에 포함됨) - 원격 변경 영향: 게임
TestMonstersController가 이제 테이블의 보스 13·엘리트 9 를 플레이어 기준 격자에 스폰 → TestVisual "보스 1마리·상단 공터" 설정 무효(PD 결정 대기, 대화로그2026-09-19.md§7) - 이 PC 저장소
core.autocrlf=input(pull 차단 재발 방지, 세션 3). Play 잔여(CharacterFresnelEffect.mat·NanumBarunGothic SDF.asset)는 pull 전에git restore로 되돌리면 됨 - 다른 작업자 실행 안내:
Assets/BurningTimes/Visual/README_TestVisual.md(Unity 6000.3.9f1 ·Assets/Scenes/TestVisual.unityPlay · Game 뷰 1080×1920) - 게임 코드·원본 데이터 무수정 — 모든 연출은 TestVisual 씬 +
Assets/BurningTimes/Visual/안에서만 동작 - Unity CLI 연결(
com.unity.pipeline0.6.0-exp.1, 공개 레지스트리) —unity command --project-path C:\BurningTimes\FirstRising <명령> - 로컬 미커밋 파일(커밋 금지 · 작업 무관):
CharacterFresnelEffect.mat(게임 FresnelRenderFeature 가 Play 중 기록) ·NanumBarunGothic SDF.asset(동적 폰트 아틀라스) ·Coffin01.mat(URP 자동 변환) ·TagManager.asset(기존 로컬 변경) · 줄바꿈만 다른 설정 파일들 ·Assets/P09_Modular_Humanoid/(구매 결정 전) ·Assets/_Recovery/·output/
2. PD 지시·원칙 (누적 · 모두 유효)
- 목표: 현재 에셋 + 셰이더·조명·후처리·VFX·카메라로 디아블로식 핵앤슬래시 "고퀄리티 3D 액션 RPG 비주얼 + 타격감"
- TestVisual 에서 먼저 모두 끝낸 뒤 원본 반영은 PD 지시 시. 원본 URP·맵을 테스트에 쓸 땐 복사본으로
- 게임 코드·원본 에셋·ProjectSettings 무수정 · 커밋은 PD 지시 시에만(지시가 있으면
bt/work에만 — 2026-09-19 PD 지적 "내가 지시하기 전까진 커밋하지 말라고 했잖아") · push·master 반영도 PD 지시 시만(원격 bt/work 도 새 커밋 자동 push 금지) - 세션 전환 권고·요구 금지(C40 훅 경고가 떠도 작업 계속) · 허락 대기·파일 보고로 작업을 멈추지 말 것
- 감사 에이전트 호출 금지(BT19-Org) · 무거운 에이전트 호출은 비용·선택지 먼저 보고(C50)
- 모델·LoRA·필터 자율 다운로드 허락(자체 원칙:
.safetensors만, 실행파일·pickle 금지) · ComfyUIC:\Comfyui, 참고 pinterest·civitai - 기록: PD 지시 로그 BT18 ⑨ 줄 · 대화로그
2026-09-19.md§5 (안건 종료 시 1회, 간결)
3. 이번 세션 완료 (bt/work 커밋)
| 커밋 | 내용 |
|---|---|
516fb88f28 4e955f04d1 |
보스 1마리(EvilUndead7 idx 71) · 2배 크기 · 렌더 해상도 0.75 를 TestVisual 전용으로 이동(WorldManager.cs 변경은 9026d835ce 로 원복) |
5fc02132f2 |
보스 근접 카메라 후퇴 · 플레이어 무적(TVTestCheats) · P09 여전사 외형 교체(TVCharacterSwap, lilToon→URP Lit 복사본) |
6dd1563c6e |
보스 스폰 → 묘지 위쪽 문 밖 공터 (2,-47) · 교체 캐릭터 몸 방향 버그 수정(HumanPoseHandler 몸통 값은 루트의 부모 기준) |
058eac18a8 |
원래 캐릭터 복귀 · TVMonsterZones(구역 5곳 5~8마리, 순찰→피격 추격→10초 재생성, 5~8타 HP) · TVPlayerAttackRange(사거리 ×0.7=6.3 m, 적 없으면 공격 중지) · 평소 카메라 16 m/FOV 50 |
c8125d3857 |
WL 타격감 이식(HitFeelDirector 재작성 + TVPresentationHook): 등급별 히트스톱·흔들림·펀치·경직·넉백 + PD 조정 |
06565f107c |
TVDamageNumbers 금색 외곽선 데미지 숫자(게임 숫자 스프라이트는 이 씬에서만 끔) · 베기 줄기·별 섬광 |
9a66b66e60 |
TV_AnimatedProxy 셰이더 + TVMonsterProxies(몬스터 실제 그림자·보스 슈퍼 아머 외곽선) · TVBossLights · TVMonsterLocomotion(보폭 실측·발 미끄러짐 제거) · TVPreDamageHook(플레이어 피격 숫자) · 이동 방향 |
f61aca517c |
README_TestVisual.md(다른 작업자 실행 안내) → git push -u origin bt/work |
PD 최종 조정값(씬 저장됨): 피격 붉은 섬광 세기 0.1(0.03 s 유지·0.06 s 소멸) · 경직 0.09/0.06/0.04 s(히트 모션 유지) · 넉백 0.2 m(모션 없는 몬스터 0.12 m, 같은 대상 0.35 s 간격) · 보스 슈퍼 아머(경직·밀림·섬광 없음, 외곽선 0.03 m) · 사거리 원 0.012 m·알파 0.12 · 데미지 숫자 72 px·외곽선 0.13·dilate −0.15 · 보스 이동 약 7 m/s(보폭 × 0.55, 슬로모션 방지)
4. TestVisual 구성 — BT_Visual 오브젝트
| 컴포넌트 | 역할 |
|---|---|
VisualProfileSwitcher |
Play 중에만 전용 URP(Visual/Settings/URP_TestVisual*) 로 교체, 렌더 0.75 |
HitFeelDirector |
타격감 전체(등급·히트스톱·흔들림·펀치·섬광·경직·넉백·불꽃·처치 조명·보스 슬로모·플레이어 피격) · 이벤트 Damaged·PlayerDamaged |
TVDamageNumbers |
데미지 숫자(TMP, Black Han Sans, Materials/UI/TV_DamageNumber.mat) |
TVPlayerAttackRange |
사거리 배율·공격 중지(Character.suppressCastSkill)·대상 해제·사거리 원 |
MonsterZones(TVMonsterZones) |
구역 Zone1~5 · 몬스터 번호·수·HP · 순찰 |
TVMonsterLocomotion |
보폭 표(우클릭 Measure Stride Speeds) · 이동 속도 보폭×0.55~1.6 · 재생 속도 = 속도 ÷ 보폭 |
TVMonsterProxies |
몬스터 메시 복사본(그림자만 / 보스는 그림자+외곽선) |
TVBossLights · TVCameraProfile · TVBossScale |
보스 키·림 조명 · 카메라 16 m/보스 18.5 m · 보스 2배 |
TVTestCheats · TVCharacterSwap(꺼짐) |
무적 · P09 교체 |
| 기타 | TVEntityBlobShadows · TVShadowCasterSanitizer(그림자 패스 없는 캐스터 끄기 — 크래시 방지) · TVLightFlicker · TVFollowTarget · Volume · 키 라이트 |
5. 기술 메모 (다음 작업에 필요한 실측 사실)
- ECS 순서:
GpuEcsAnimatorSystemGroup(Simulation, Transform 전) →TR_UpdateSystemGroup(CharacterSystem = 몬스터 AI, DamageSystem) → Presentation. 훅 2개(DisableAutoCreation, TestVisual 에서만 생성):TVPresentationHook(Presentation 맨 앞 — 피해 적용 뒤·GPU 업로드 전) ·TVPreDamageHook(DamageSystem 직전) - 렌더 직전 훅에서 바꾼 애니 재생 속도는 다음 프레임 애니메이터가 게임 AI 보다 먼저 쓴다 → 게임이 매 프레임 1 로 덮어써도 유지됨
- 몬스터 AI: 항상 플레이어 추격 ·
FrozenMoveComponent.frozen=1이면 이동 안 함 · frozen 아니면 플레이어와 19.3 m(maxBoundDistance17.3+2) 넘을 때 근처로 순간이동 ·SpawnMonsterEntityInEditor(..., blind=1)이면 기절 상태로 생성(에디터 전용 API) · HP 는 스테이지 가중치로 결정(인자 hp 무시) - 몬스터 GPU 애니메이션: Walk(1) 칸은 전부 빈 클립 — Run(2)만. 실제 이동 클립은 오버라이드 컨트롤러의 run/walk/fly 클립(미라 walk3_inplace 등) · 보폭(몸 크기 1): 미라 0.31 · 스켈레톤 1.92 · 좀비 1.82 · EU5 0.85 · EU 1.17 · EU2 0.58 · EU6 0.53 · 보스 3.74 · 레이스(비행) 제외
- 몬스터 셰이더
URP_Lit_AnimatedMesh: 그림자 패스는 LOD 1000 서브셰이더에만, 게임은 Midium(셰이더 LOD 999) → 그림자 없음. 애니메이션 =GpuEcsAnimatorMobile.cgincAnimateBlend_half(uv1 = 본 인덱스,_AnimatedBoneMatrices, 인스턴스_AnimationState) · 피격 색 = 발광 +=_RimAmount×(1−N·V)×_RimColor, 게임 피격 색은 HDR 빨강 (3,0,0) - 메시 복사본:
em.Instantiate(메시 엔티티)는GpuEcsAnimatedMeshComponent를 그대로 가져가 원본과 같이 움직임 ·RegisterMaterial/RegisterMesh후MaterialMeshInfo교체 · 원본 LinkedEntityGroup 밖이라 쓰러짐·비활성 때 직접 삭제해야 함 - 플레이어: 자동 공격 =
PlayerInputSystem.UseSkill(적 없어도 발사) · 사거리 = 현재 무기 스킬targetingRange(9 m) · 무적이면 DamageSystem 이 피해 요청을 버림(takeDamageCount만 증가) - 시간: 게임 팝업(
PopupBase)이 timeScale 0 → 닫을 때 1 로 복원 · 히트스톱은 0.0001 을 써서 구분 HumanPoseHandler의 bodyPosition/Rotation 은 루트의 부모 기준- 크래시 이력: 그림자 캐스터인데 활성 서브셰이더에 ShadowCaster 패스가 없는 엔티티 → SRP Batcher 네이티브 크래시 → Sanitizer 로 방지 중. 새 셰이더에는 반드시 ShadowCaster 패스를 넣을 것. 판정은 LOD 999 기준(
9a6bf3c02a): 에디터 Play 는 LOD 1000/무제한으로 시작해 늦게 999 로 내려가므로, 현재 LOD 로 판정·캐시하면 몬스터 셰이더(LOD 1000 에만 ShadowCaster)가 통과해 크래시(09-19 18:11) - 재질 조회: 게임
CharacterAbnormalMaterialJob이 상태 이상 뒤 원래 재질을 런타임 등록 ID 로 써 넣는다 → 그런 엔티티는RenderMeshArray.GetMaterial이 null. 원래 재질은Fx.AbnormalMaterialComponent.originalBatchMaterialID→EntitiesGraphicsSystem.GetMaterial(id)로 찾는다(72d7124497)
6. 남은 작업 · PD 결정 대기
성능 실측완료(세션 3,72d7124497) — 결과·남은 결정은 대화로그2026-09-19.md§6. 초과·근접: 묘지 Draw 250~270 · SetPass 전투 최대 79 · 렌더 0.75. PD 결정 대기: 품질 등급(Low/Medium/High) 분리 · 실기기 측정 경로(TestVisual 은 에디터 전용 스폰이라 기기 빌드 불가). 측정 도우미 조각: ProfilerRecorder 를AppDomain.SetData에 보관해 여러 eval 에 걸쳐 수집 · 스킬 선택 팝업은EditorApplication.update콜백으로CommonSkillSelectUI.OnSelectSkill(availableSkillJsons[0])자동 선택 · Frame Debugger 는 에디터 창 최소화 상태에선 캡처 0 → 기능 토글 방식 사용- PD 피드백 대기: 보스 이동 약 7 m/s(너무 빠르면
TVMonsterLocomotion.minMoveFactor낮추기 또는 보스 크기 조정) · 붉은 섬광 세기·숫자 크기 등 체감 조정 - P09 구매 여부(PD) — 구매 시 에셋 커밋 여부 결정
- 원본(게임 본편) 반영 — PD 지시 시: 표준 PostProcessData(또는 UberPost 그레이딩 복원)·Volume · 맵 LightingData 점검 · 몬스터 셰이더 LOD 0 에 ShadowCaster 추가(복사본 대신) · 그림자 거리 · 타격감·데미지 숫자·보폭 맞춤을 ECS 시스템으로 이식 · 품질 등급별 on/off
- 추가 개선 후보(WL 에 있고 아직 안 옮긴 것): 연속 처치 문구(DOUBLE/TRIPLE…)·보스 처치 킬캠 줌 · 데미지 숫자 병합(0.25 s 합산 ×N) · 몬스터 림 · ComfyUI 지면 텍스처
7. 작업 방법 (실증 · 다음 세션용 조각 코드)
- 스크래치패드 도우미는 세션마다 새로 만들어야 한다. 핵심 조각:
- Play 대기:
editor_play후 3초 간격으로GameObject.Find("Ariel")존재·Time.timeScale==1확인 - 플레이어 이동(eval):
PlayerTag+LocalTransform엔티티의Position을 (x, y, z) 로,PhysicsVelocity0 - 컴파일 대기:
editor_status --json의compiling·domainReloadInProgress가 false,status=="ready" - 콘솔:
get_console_logs --json· 비우기 =UnityEditor.LogEntries.Clear()(리플렉션) - 캡처:
capture_game_view --source screen --json→ base64 → 스크래치패드 PNG(Assets 저장 금지)
- Play 대기:
- 규칙: 스크립트 수정 전 Play 중지 →
AssetDatabase.ImportAsset→ 컴파일 대기 · 씬 값은 편집 모드에서SerializedObject+EditorSceneManager.SaveScene·AssetDatabase.SaveAssets()금지(→SaveAssetIfDirty) · 씬에 저장된 값이 스크립트 기본값을 덮으므로 기본값을 바꾸면 씬 값도 같이 바꿀 것 - 커밋 메시지는 Write 로 만든 파일을
git commit -F로(PowerShell 5.1Set-Content -Encoding utf8은 BOM 을 붙임 —f61aca517c제목 앞에 BOM 이 들어감, 기능 영향 없음) · 제목 다음 빈 줄 필수 - 명령 한 번이 5초 넘으면 CLI 응답만 끊기고 실행은 계속됨 → 무거운 작업은 나눠서