문제
OnPlayerDestroyController.OnDestroy()(12-16행)가 플레이어 쓰러짐 애니메이션의 유일한 호출자인데, 이 시점에는 트윈 대상인 _player 루트 트랜스폼을 포함한 Player 계층 전체가 이미 파괴 중이다. Player.prefab을 확인하면 _player가 파괴 대상 오브젝트의 루트 트랜스폼 자신이며, PlayerFallDownController와 OnPlayerDestroyController도 같은 GameObject에 붙어 있다. DOTweenAction.FallForward가 만드는 시퀀스는 seq.SetLink(tr.gameObject)를 걸기 때문에 DOTween이 다음 틱에 곧바로 시퀀스를 죽인다. 결과적으로 이 사망 연출은 실제로는 동작하지 않는 죽은 코드다. 읽히지 않는 직렬화 필드 servedObject가 남아 있는 점도 원래 의도한 훅이 ServedObject.OnDestroyed였음을 시사한다.
위치
client/Assets/Scripts/GameScene/Player/OnPlayerDestroyController.cs:12
재현 / 영향
서버가 로컬 Player에 대해 status "Destroyed"를 보내면 ServedObject.HandleStatus → DestroySelf(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
자동 코드 리뷰(멀티 에이전트 검증 통과)에서 발견됨.
문제
OnPlayerDestroyController.OnDestroy()(12-16행)가 플레이어 쓰러짐 애니메이션의 유일한 호출자인데, 이 시점에는 트윈 대상인_player루트 트랜스폼을 포함한 Player 계층 전체가 이미 파괴 중이다.Player.prefab을 확인하면_player가 파괴 대상 오브젝트의 루트 트랜스폼 자신이며,PlayerFallDownController와OnPlayerDestroyController도 같은 GameObject에 붙어 있다.DOTweenAction.FallForward가 만드는 시퀀스는seq.SetLink(tr.gameObject)를 걸기 때문에 DOTween이 다음 틱에 곧바로 시퀀스를 죽인다. 결과적으로 이 사망 연출은 실제로는 동작하지 않는 죽은 코드다. 읽히지 않는 직렬화 필드servedObject가 남아 있는 점도 원래 의도한 훅이ServedObject.OnDestroyed였음을 시사한다.위치
client/Assets/Scripts/GameScene/Player/OnPlayerDestroyController.cs:12재현 / 영향
서버가 로컬 Player에 대해 status "Destroyed"를 보내면
ServedObject.HandleStatus→DestroySelf(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
자동 코드 리뷰(멀티 에이전트 검증 통과)에서 발견됨.