Skip to content

플레이어 사망 쓰러짐 트윈이 파괴 중인 트랜스폼 대상으로 OnDestroy에서 생성됨 #419

Description

@dev-yunseong

문제

OnPlayerDestroyController.OnDestroy()(12-16행)가 플레이어 쓰러짐 애니메이션의 유일한 호출자인데, 이 시점에는 트윈 대상인 _player 루트 트랜스폼을 포함한 Player 계층 전체가 이미 파괴 중이다. Player.prefab을 확인하면 _player가 파괴 대상 오브젝트의 루트 트랜스폼 자신이며, PlayerFallDownControllerOnPlayerDestroyController도 같은 GameObject에 붙어 있다. DOTweenAction.FallForward가 만드는 시퀀스는 seq.SetLink(tr.gameObject)를 걸기 때문에 DOTween이 다음 틱에 곧바로 시퀀스를 죽인다. 결과적으로 이 사망 연출은 실제로는 동작하지 않는 죽은 코드다. 읽히지 않는 직렬화 필드 servedObject가 남아 있는 점도 원래 의도한 훅이 ServedObject.OnDestroyed였음을 시사한다.

위치

  • client/Assets/Scripts/GameScene/Player/OnPlayerDestroyController.cs:12

재현 / 영향

서버가 로컬 Player에 대해 status "Destroyed"를 보내면 ServedObject.HandleStatusDestroySelf(GameConfig.FRAME_DURATION)ObjectContainer.UnregisterObject(id)Destroy(gameObject)로 이어진다. 이때 OnPlayerDestroyController.OnDestroy가 파괴 진행 중인 루트 트랜스폼 위에 1초짜리 쓰러짐 시퀀스를 만들고, DOTween이 다음 틱에 이를 죽이므로 DOLocalRotate/DOLocalMoveZ/DOScale 단계가 하나도 렌더링되지 않는다. 같은 OnDestroy가 GameScene 언로드와 애플리케이션 종료 시점에도 트윈을 만들어 낸다. 영향은 연출 누락과 teardown 시점의 불필요한 트윈 생성으로, 게임플레이나 상태에는 손상이 없다.

수정 방향

애니메이션을 OnDestroy가 아니라 ServedObject.OnDestroyed(DestroySelf()에서 UnregisterObject 전에 발생)에서 재생하되, UnitDeathFadePresenter가 이미 쓰는 패턴대로 ServedObject보다 오래 사는 분리된 복제본 위에서 실행한다.


심각도: medium · 분류: correctness
자동 코드 리뷰(멀티 에이전트 검증 통과)에서 발견됨.

Metadata

Metadata

Assignees

Labels

fixfix bugspriority:P1조용히 틀린 값 / 데이터 소실

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions