Skip to content

유도 투사체 트윈에 SetLink가 없어 파괴된 오브젝트보다 오래 살아남음 #424

Description

@dev-yunseong

문제

DefaultProjectile.MoveTo의 유도(homing) 분기는 DOTween.To(() => 0f, v => { ... transform.position = ... }, 1f, duration).SetEase(Ease.Linear)(41-49행)를 SetTargetSetLink도 없이 만든다. 같은 메서드의 "position" 분기(21행)는 Transform이 파괴되면 자동으로 kill 되는 transform.DOMove를 쓰고, 모듈의 다른 트윈들도 모두 SetLink를 호출한다(DOTweenAction.cs:93, 100 등). 이 setter는 MonoBehaviour의 transform을 역참조하므로 ProjectileSpawnerDestroy(projectileObject, dto.duration)(ProjectileSpawner.cs:22)가 적용된 뒤에는 파괴된 오브젝트를 건드린다. Unity의 지연 파괴 시계와 DOTween의 누적 시간은 서로 독립적이며, 비행 중 씬 전환이 일어나면 오브젝트는 즉시 파괴된다.

위치

  • client/Assets/Scripts/GameScene/Object/Projectile/DefaultProjectile.cs:41

재현 / 영향

유도 투사체(end.targetType == "reference")가 비행 중일 때 GameEndEventController가 ResultScene을 로드하거나, 단순히 지연 Destroy가 트윈의 마지막 틱보다 한 프레임 먼저 적용되면, GameObject는 사라졌는데 고아 트윈이 DOTween의 DontDestroyOnLoad 인스턴스에서 계속 돌며 파괴된 Transform을 역참조한다. DOTweenSettings.assetuseSafeMode: 1이 켜져 있어 현재는 트윈당 MissingReference 경고 로그가 남고 트윈이 kill 되는 선에서 끝나지만, safe mode를 끄면 틱마다 처리되지 않은 MissingReferenceException이 발생한다. 실제로 누수되는 리소스는 없고 결함은 누락된 SetLink다.

수정 방향

DOTween.To 호출에 .SetLink(gameObject)(최소한 .SetTarget(transform))를 체이닝해 position 분기 및 코드베이스의 나머지 관행과 맞춘다.


심각도: low · 분류: 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