fix(monster): MonsterAttack.OnBeginPlay AnimationClip 타입가드 (LEA-3023/2007) #64

Merged
gahusb merged 1 commits from fix/monsterattack-animationclip-guard into main 2026-06-16 00:47:41 +09:00
Owner

증상

전투맵 진입 시 몬스터 수만큼 서버 로그에 반복:

  • [LEA-3023] TypeMismatch : 'AnimationClip'으로 타입을 사용해야 합니다MonsterAttack.OnBeginPlay 본문 10행
  • [LEA-2007] AttemptToIndex : 'clip'은 nil입니다 — 11행

근본 원인 (systematic-debugging)

MonsterAttack.OnBeginPlay는 chasemonster 모델에서 상속된 물리 근접공격 스크립트로, 스프라이트의 AnimationClip 프레임으로 공격범위(BoxShape)를 계산한다. 그런데 이 게임의 몬스터 스프라이트는 (공식 필드맵에서 수확한) 정적 Sprite라, LoadAnimationClipAndWait(SpriteRUID)가 AnimationClip을 못 받아 nil 반환(엔진이 LEA-3023 로깅) → 다음 줄 clip.Frames[1]이 nil 인덱싱(LEA-2007).

전 codeblock 교차검색 결과 MonsterAttack/AttackNear를 호출하는 코드가 어디에도 없다 — 카드 기반 턴제 전투에서 이 멜리 로직은 죽은 코드이고, OnBeginPlay가 clip 로드에서 크래시하므로 공격 타이머조차 안 걸린다. 즉 게임 동작 영향 0, 로그 스팸만 발생(같은 세션 로그에서 덱 컨트롤러 정상 동작 확인).

근거: 에러 메시지 + 코드 정독 + 라이브 서버 로그(methodLineNum 10/11) + 전 codeblock 교차참조 + 공식 API 문서(ResourceType.AnimationClip=6, GetTypeAndWait 반환형).

수정

LoadAnimationClipAndWait 호출 전에 GetTypeAndWait로 리소스 타입을 확인해 ResourceType.AnimationClip이 아니면 early-return + clip nil 가드. 두 에러를 모두 원천 차단한다.

  • 정적 스프라이트 몬스터: 공격범위 설정을 건너뜀(원래 미사용이라 무해)
  • 애니메이션 클립 몬스터: 기존과 동일 동작
_ResourceService:PreloadAsync({self.Entity.SpriteRendererComponent.SpriteRUID}, function()
	if _ResourceService:GetTypeAndWait(self.Entity.SpriteRendererComponent.SpriteRUID) ~= ResourceType.AnimationClip then
		return
	end
	local clip = _ResourceService:LoadAnimationClipAndWait(self.Entity.SpriteRendererComponent.SpriteRUID)
	if clip == nil then
		return
	end
	local firstFrameSprite = clip.Frames[1].FrameSprite
	...

변경 파일

  • RootDesk/MyDesk/MonsterAttack.codeblockOnBeginPlay에 가드 6줄(타입 3 + nil 3)

⚠️ 적용/검증 (메이커 필요)

MonsterAttack은 생성기가 없는 메이커 저작 codeblock이라 디스크를 직접 패치했다. 반영하려면:

  1. 메이커에서 로컬 워크스페이스 reload (git pull 후 절차와 동일 — RULES §5; reload 전에 maker_save 하면 패치가 덮일 수 있음)
  2. 빌드 콘솔 0 에러 확인
  3. 플레이테스트 → 전투맵에서 LEA-3023/2007 사라짐 확인

코드는 정적 검증 완료(패치된 OnBeginPlay 29줄, API 문서 대조). 런타임 검증은 reload 후 플레이테스트로.

🤖 Generated with Claude Code

## 증상 전투맵 진입 시 **몬스터 수만큼** 서버 로그에 반복: - `[LEA-3023] TypeMismatch : 'AnimationClip'으로 타입을 사용해야 합니다` — `MonsterAttack.OnBeginPlay` 본문 10행 - `[LEA-2007] AttemptToIndex : 'clip'은 nil입니다` — 11행 ## 근본 원인 (systematic-debugging) `MonsterAttack.OnBeginPlay`는 chasemonster 모델에서 상속된 **물리 근접공격** 스크립트로, 스프라이트의 AnimationClip 프레임으로 공격범위(BoxShape)를 계산한다. 그런데 이 게임의 몬스터 스프라이트는 (공식 필드맵에서 수확한) **정적 Sprite**라, `LoadAnimationClipAndWait(SpriteRUID)`가 AnimationClip을 못 받아 nil 반환(엔진이 LEA-3023 로깅) → 다음 줄 `clip.Frames[1]`이 nil 인덱싱(LEA-2007). 전 codeblock 교차검색 결과 `MonsterAttack`/`AttackNear`를 호출하는 코드가 **어디에도 없다** — 카드 기반 턴제 전투에서 이 멜리 로직은 죽은 코드이고, OnBeginPlay가 clip 로드에서 크래시하므로 공격 타이머조차 안 걸린다. 즉 **게임 동작 영향 0, 로그 스팸만** 발생(같은 세션 로그에서 덱 컨트롤러 정상 동작 확인). 근거: 에러 메시지 + 코드 정독 + 라이브 서버 로그(`methodLineNum` 10/11) + 전 codeblock 교차참조 + 공식 API 문서(`ResourceType.AnimationClip`=6, `GetTypeAndWait` 반환형). ## 수정 `LoadAnimationClipAndWait` 호출 **전에** `GetTypeAndWait`로 리소스 타입을 확인해 `ResourceType.AnimationClip`이 아니면 early-return + clip nil 가드. 두 에러를 모두 원천 차단한다. - 정적 스프라이트 몬스터: 공격범위 설정을 건너뜀(원래 미사용이라 무해) - 애니메이션 클립 몬스터: 기존과 동일 동작 ```lua _ResourceService:PreloadAsync({self.Entity.SpriteRendererComponent.SpriteRUID}, function() if _ResourceService:GetTypeAndWait(self.Entity.SpriteRendererComponent.SpriteRUID) ~= ResourceType.AnimationClip then return end local clip = _ResourceService:LoadAnimationClipAndWait(self.Entity.SpriteRendererComponent.SpriteRUID) if clip == nil then return end local firstFrameSprite = clip.Frames[1].FrameSprite ... ``` ## 변경 파일 - `RootDesk/MyDesk/MonsterAttack.codeblock` — `OnBeginPlay`에 가드 6줄(타입 3 + nil 3) ## ⚠️ 적용/검증 (메이커 필요) MonsterAttack은 **생성기가 없는 메이커 저작 codeblock**이라 디스크를 직접 패치했다. 반영하려면: 1. 메이커에서 **로컬 워크스페이스 reload** (git pull 후 절차와 동일 — RULES §5; reload 전에 maker_save 하면 패치가 덮일 수 있음) 2. 빌드 콘솔 0 에러 확인 3. 플레이테스트 → 전투맵에서 LEA-3023/2007 사라짐 확인 코드는 정적 검증 완료(패치된 OnBeginPlay 29줄, API 문서 대조). 런타임 검증은 reload 후 플레이테스트로. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
gahusb added 1 commit 2026-06-16 00:38:30 +09:00
증상: 전투맵 진입 시 몬스터마다 [LEA-3023] TypeMismatch(AnimationClip) +
[LEA-2007] AttemptToIndex(clip nil) 서버 로그 스팸(몬스터 수만큼 반복).

원인: MonsterAttack.OnBeginPlay(chasemonster 모델 상속·메이커 저작·생성기 없음)가
정적 Sprite인 SpriteRUID를 _ResourceService:LoadAnimationClipAndWait에 넘김 →
AnimationClip이 아니라 nil 반환(LEA-3023) → clip.Frames[1] 인덱싱(LEA-2007).
이 멜리 공격 로직은 카드 기반 턴제 전투에서 호출하는 코드가 전혀 없는 죽은 코드라
크래시 외 게임 영향은 없으나 로그를 더럽힘.

수정: LoadAnimationClipAndWait 호출 전 GetTypeAndWait가 ResourceType.AnimationClip이
아니면 early-return + clip nil 가드. 정적 스프라이트 몬스터는 공격범위 설정을 건너뜀
(원래 미사용), 애니메이션 클립 몬스터는 기존대로 동작.

주의: MonsterAttack은 생성기 없는 메이커 저작 codeblock이라 디스크 직접 패치.
적용하려면 메이커에서 로컬 워크스페이스 reload 필요.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
gahusb merged commit 4228f58b09 into main 2026-06-16 00:47:41 +09:00
gahusb deleted branch fix/monsterattack-animationclip-guard 2026-06-16 00:47:46 +09:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gahusb/maplecontest#64