캠프파이어 설치(10) → 상인 설치(30) → 사과나무 설치(60) → 던전 생성(100).
한 번에 발판 1개 · 단계는 PlayerPrefs 1키(WL_Island_FlowStep · 시작마다 초기화).
원본 섬 확장 가격판(FI Purchaser)은 첫 던전 승리 전까지 렌더러·콜라이더만 끄고,
승리(OnStageCleared) 시 WL_Island_ExpansionUnlocked=1 → 그대로 다시 켠다
(이후 확장 순서는 FI 원본 Island.Constraint 그대로 · 우리 코드는 켜고 끄기만).
밭은 시작 시 생성 보류 유지(hideFarms 1) · 던전 2~4 행 enabled_ 0.
되돌리기 = flowV2Enabled 0.
원본(Assets/FarmingIsland/** · Assets/Script/**) 0줄.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
① 발판 = 열림 구역(숨긴 밭 전부) XZ 정중앙 + 인스턴스 스케일 50 %
- WLIslandSettings: platformScale 0.5 / platformCenterOnZone 1 / platformCenterVisibleOnly 1
- 트리거는 스케일 역보정으로 월드 3.40 m 유지 · FI 프리팹 0줄
② 던전 결과창 왼쪽 버튼 = 같은 스테이지 재입장(StageDirector.Retry)
- WLStageUiSettings: dungeonPrimaryRetry 1 / dungeonPrimaryText 「다시 도전」
- 스테이지 모드(#815)는 Current==null 이라 한 줄도 지나가지 않음
③ 액티브 스킬 사용 OFF (PD 「우선 엑티브 스킬은 사용 Off 해줘」)
- 새 파일 ActiveSkillLock.cs · WLCombatCoreSettings.activeSkillsEnabled 0
- 자동 스킬 캐시(arr_magicData) 비움 + 패드 스킬 슬롯 0 · 기본 공격 불변
게이트 PASS(resident · errors[] · 콘솔 error 0) · ProjectSettings/Packages dirty 0
Assets/Script/** · Assets/FarmingIsland/** 0줄
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
더미 = 던전 씬 2개의 별도 루트 PC_LH_M05(전시용 치비) + ArenaWalkerRig(이 리그가 body 로 치비를 걷게 한다).
FixDuplicates 는 ArenaWalker 가 붙은 오브젝트만 꺼서 치비가 그대로 남았다 → 두 씬에서 제거(루트 10→8).
카메라 = 입장 프레임에 위치만 순간이동하고 회전은 4%/프레임만 도는 원본 CamStatus 0 가지(RealCamera.cs:199·208)와
StageDirector.Enter 의 PC 워프가 원인. WLDungeonCameraRig 를 실행순서 -100 으로 당겨 LateUpdate 에서
최종 구도로 즉시 앉히고, 던전 로딩 화면은 정착·입장 뒤에 닫게 했다. 원본 0줄 · 되돌리기 SO 스위치 4개.
실측(프레임별 · 전→후): 회전 튐 0.46°+6.89° → 0.00°+0.00° · 워프 뒤 2 m 추적 지연 → 0.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- WLIslandSceneSetup.ApplyIslandCameraDistance: 섬 씬의 Cinemachine 가상 카메라(islandVcamName)의 m_CameraDistance 를 islandCamDistance 로. FI 씬·코드 0줄.
- WLIslandSettings: islandCamDistance 15 · islandVcamName PlayerVirtualCamera 신설 · camDistance 는 기준 기록값 22 로 복원(던전은 dungeonCamDistance 13).
- 되돌리기 = islandCamDistance 0.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- 원인(실측): 전투 시작 신호는 RealCamera 의 카메라 연출이 끝날 때 나온다 —
PCActor.StartCam → Set_Target(pc, CamRot_Portal) → CamStatus=0 + list_tfCamactionTarget.Add(pc)
→ LateUpdate 가 목록을 다 비우면 Start_Game() → ActorInfo.All_Stop(false) + DungeonInfo.Start_Dungeon.
그런데 원본에 그 목록을 비우는 곳이 없어 맵을 바꾸면 **죽은 Transform** 이 남고,
재입장 때 `camTarget.position`(RealCamera.cs:199)이 MissingReferenceException 을 던져
LateUpdate 가 매 프레임 끊긴다 → Start_Game() 이 영영 안 불려 전투가 멈춘 채로 남는다.
(816i 가 Get_PortalPos 콜백을 되살리기 전에는 이 경로 자체가 안 돌아 드러나지 않았다.)
→ 죽은 항목만 걷어내고, 비면 지금 대상을 한 개 채운다(원본 0줄 · SO 로 끔).
- 같은 씬을 쓰는 던전(1·3 = WL_Dungeon01, 2·4 = WL_Dungeon02)에서 씬 이름으로만 찾느라
**언제나 앞 줄**의 스테이지가 돌던 것 수정 — 입장 요청(Pending)을 우선한다.
실측: 던전 3 입장 시 stageIndex 12·보상 192(전에는 10·96).
- 던전 전용 카메라 거리(dungeonCamDistance)를 SO 에 분리(섬 값은 그대로).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- "Screen position out of view frustum" 의 진짜 원인을 실측으로 확정: 좌표가 화면 밖이라서가 아니라
**카메라 투영이 깨졌을 때**만 난다(near==far · 직교 size ≤ 0 · aspect ≤ 0). 꺼진 카메라는 무관.
→ 깨진 투영을 찾아 되살리는 감시(0.5초 주기 · SO 로 끔) 추가.
- 섬 카메라 실측값(각 45° · 거리 22 m · FOV 60 · 원근 · 고정 방향)을 SO 에 담아 던전에 적용.
RealCamera 의 (cameraHeight, DistanceAway, DistanceUp, rotateAround) 로 역산해 넣는다.
- 이동 방향 리드(#755) 배율을 SO 로 노출(기본 1 = 지금 그대로 · 0 이면 섬과 완전히 같은 고정 구도).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- LoadMapMgr 파생 노드를 씬마다 새로 만들지 않고 DontDestroyOnLoad 하나로 상주시킨다.
씬 전환에서 파괴된 노드를 정적 Ins 가 계속 가리켜 Get_PortalPos 의 StartCoroutine 이
MissingReferenceException 을 내던 것을 없앤다(원본 LoadMapMgr.cs 0줄 · 파생 + private 필드 주입).
- 맵 프리팹이 없어 m_MapData 가 영원히 null 이라 Co_Get_PortalPos 가 끝나지 않던 것도 함께 해결 —
꺼진 오브젝트에 런타임 MapData 를 만들어 넣는다(MapData.Awake/Start 미실행 = RenderSettings 무변경).
- 던전 씬의 아레나 룩 카메라(직교 · MainCamera 태그)가 전투 화면을 차지하던 것을 끄고
전투 카메라(RealCamera)만 남긴다.
- WLDungeonCameraRig — 섬(FI Cinemachine) 실측 구도(각 45° · 거리 22 m · FOV 60 · 원근)를
던전 카메라에 그대로 적용한다. 값은 WLIslandSettings SO.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
816g 가 실측으로 지목: WLIslandSaveSettings.asset 의 m_Script 가 {fileID: 0}
이라 Resources.Load 가 null → 세이브가 여전히 Level01.dat / InGame.dat 로
갈리고 있었다(33afe0b8d 는 코드만 들어가고 설정이 안 붙은 상태였다).
원인: 유니티는 ScriptableObject 를 **클래스 이름과 같은 이름의 .cs 파일**
에서만 MonoScript 로 인식한다. 그 클래스가 WLIslandSave.cs 안에 있어
m_Script 를 바인딩할 수 없었다.
조치: WLIslandSaveSettings.cs 로 분리 + .asset 의 m_Script 를 새 GUID 로.
검증: ResolveSaveName("InGame") = "WL_Island" (런타임 실측) · 컴파일 오류 0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
PD 추가 지시 2건.
① 「던전 열기는 한 번만 · 이후 같은 자리에 또 등장하면 안 된다」
던전 한 줄 = 발판 한 자리(`WLDungeonDef.platformUseFarm`·`platformPosition`).
값을 치르면 그 자리는 영영 비고 다음 발판은 표가 지정한 **다른 자리**에 선다.
해금 수는 PlayerPrefs 에 남겨 껐다 켜도 유지된다(실측: Play 재시작 후에도
던전 1 그대로 · 밭 자리 발판 없음 · 다음 발판만 (-2,0,-2) 가격 30).
FI `RefreshIsland` 의 가격표 재생성이 우리 발판을 되살리지 않는 것도 실측
(섬 확장 4→5칸 후 발판 수 1 유지 · 자리 그대로).
덤으로, 골드가 많을 때 가만히 서서 던전이 연달아 팔리던 것도 막았다.
② 던전 진입 멈춤
던전 씬에는 `MobControlMgrList` 가 0개다(실측: WL_Dungeon01·02·ArenaProto 전부 0).
섬과 같은 이유로 로딩 칸 0 이 안 찬다 → 던전 표의 씬 이름을 로딩 보정 대상에 포함.
③ §1 남은 몫 — 새로 연 타일이 `WL/HullOutline` 패스를 못 받아(슬롯 1 vs 2)
경계에서 테두리 유무가 갈렸다. 열린 직후 기존 타일의 머티리얼 배열을 그대로
물려준다(새 머티리얼 0개). 실측: 8칸 전부 재질 조합 1가지.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
PD 지시 3건 중 §2·§3.
- 초기 상태: 밭(Farm·Soil) 렌더러·콜라이더만 끄고(오브젝트는 살려 둔다 —
끄면 섬 확장 때 FI 가 꺼진 오브젝트에서 코루틴을 시작해 콘솔 에러가 난다),
던전 입구는 해금한 수만큼만 세운다. 처음에는 0개.
- 발판 = FI 가 섬 확장에 쓰는 **가격판 프리팹 그대로**(PD 정정: 새 모델 금지).
실측으로 프리팹 렌더 범위를 재서 밭 한가운데·바닥 바로 위로 맞춘다
(원본은 물 위 y≈-0.5 에 눕도록 돼 있어 섬 위에 그냥 놓으면 지면 아래로 들어간다).
- 지불도 FI `Purchaser` 그대로 — 보이지 않는 더미 `Island` 를 대상으로 물리고
그 `OnActivated`(public event)를 받아 던전 표의 한 행을 켠다. FI 코드·프리팹 0줄.
- 시작 골드 500 → 10. `IslandManager.Awake` 안에 이미 있던 1줄 훅(세이브 이름)
시점에서 `startingMoney` 를 바꾼다 = FI 새 줄 0.
- 던전 하나 = 발판 한 자리. 값을 치르면 그 자리는 영영 비고 다음 발판은 다른 자리.
- 던전 씬도 `MobControlMgrList` 가 0개라 로딩 칸 0 이 안 찬다 → 던전 표의
씬 이름을 로딩 보정 대상에 포함.
되돌리기: `WLIslandSettings.gateFlowEnabled = 0` 하나로 지금 상태 100 %.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
PD 「title 씬에서 시작하면 로딩 90%에서 더이상 진행이 안된다」
→ 그래서 _MainMenu 로 우회했고, 그 탓에 우리 섬에 도달한 적이 없어
「풀밭이 전혀 안 바뀐다」로 이어졌다. 두 증상의 뿌리가 하나였다.
원인(PD 의 멈춘 화면에서 Lead 직접 실측):
list_loadingComplete = [False, True]
칸 1 = UI 준비(NewGameUI.cs:88) → True
칸 0 = 몬스터 프리팹 로드(MobControlMgrList.cs:28) → False
섬(Level01·맵 900)은 전투 맵이 아니라 MobControlMgrList 가 아예 없다
(실측 인스턴스 0) → 칸 0 이 영원히 False → 로딩창이 안 닫힌다.
씬·풀·게이트·룩·PC 는 전부 정상 생성돼 있었고 화면만 가려져 있었다.
조치: 섬 씬이 붙은 뒤 MobControlMgrList 가 없으면 칸 0 을 우리가 채운다.
전투 맵은 건드리지 않는다(그쪽은 원본이 채운다). 원본 파일 0줄 수정.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
PD 「세이브가 경로마다 갈리면 안돼. 그냥 기존 세이브를 초기화하고
단일 경로로 맞춰」.
원인(816f 실측): IslandManager.Awake 가 saveFileName 을 활성 씬 이름으로
잡아, 섬 단독 Play 는 Level01.dat · 게임 정식 경로(Additive)는 InGame.dat
로 갈렸다. 섬을 키워 놔도 다른 경로로 들어가면 초기 상태가 나왔다.
조치:
- IslandManager.cs:119 **1줄** 훅 → WLIslandSave.ResolveSaveName()
- 새 파일 WLIslandSave.cs + SO(WL_Island · enabled_=1)
- 기존 세이브 4개(InGame/Level01/Level02/WL_FarmLook.dat) 백업 후 삭제
→ Temp/claude/island_save_backup_143818
- enabled_=0 이면 원래 동작(씬 이름)으로 복귀
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
PD 보고: 'OnStep' on animation 'Run' has no receiver!
원인(실측): WLIslandPcRig 가 FI 플레이어의 컨트롤러를 우리 치비 비주얼의
Animator 에 복사해 같은 클립을 함께 돌린다(816d). FI 의 Run 클립이 쏘는
OnStep 의 수신자 PlayerController(FarmingIsland/Scripts/Core/PlayerController.cs:243)
는 부모에 있는데, 유니티는 애니메이션 이벤트를 Animator 와 같은 GameObject
에만 보낸다 → 비주얼 자식에서 수신자 없음.
부모 Animator 가 이미 같은 이벤트를 PlayerController 로 보내 발소리는 정상
재생된다. 비주얼 쪽은 중복이므로 수신자를 만들면 발소리가 두 번 난다
→ 비주얼 Animator 의 fireEvents 만 끈다. 기존 파일 0줄 수정(자가 부착).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- NavMeshSurface.useGeometry = PhysicsColliders — RenderMeshes 기본값은 메시 Read/Write 를 요구해 콘솔 에러 100건(실측)
- 베이크 후 앵커 위 NavMesh 존재를 로그로 남긴다(WL_Dungeon01 실측: (0,0.07,0) 있음)
- 이름표·「들어가기」 버튼에 한글 TMP 폰트 지정(기본 폰트에는 한글 글리프가 없어 □ 로 나왔다)
- 던전 3 입구를 덤불 위치에서 (2.5,0,11) 로 이동(에디트 모드 레이캐스트 실측)
- 던전 입장 시 프롬프트 숨김
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- NavMeshSurface 기본값(collectObjects=All · useGeometry=RenderMeshes)을 그대로 쓴다(게이트 PASS)
- 섬 카메라 소유권 SO(islandCameraOwner 기본 1 = FI 카메라) · 떠날 때 되살림
- WL 전투 PC 는 Addressables 콜백으로 늦게 생긴다 → hidePcWatchSeconds 동안 감시해 숨김
- 프로브 전용 DebugSceneOverride(던전 복사본 씬 미등록 구간 검증용)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>