ACK, 팀프로젝트

X좌표와 Y좌표를 반대로 계산해서 한번 오류가 났다.
(가로가 Y고 세로가 X인거 개킹받네)
예상대로 움직이는 방향을 X, Y가 아닌 Y, X로 전환해 주니 정상적으로 동작하는 것을 확인할 수 있었다.
==========
1. ApplyDamage가 제대로 동작하지 못하는 것으로 보인다.
2. Friction(마찰력) 계수를 증가시켜 줬음에도 적당히 감속하지 못하는 문제가 있다.
2 -> SetLinearDamping(1.f)로 상시 감속을 부여할 수 있다.
크아악 트러블 슈팅~
=====
'3번째' 리스타트에서 '자주' 크래시가 발생한다. (아니었음)
호출 스택도 보이지 않는다.
주석 처리된 부분이 크래시가 나는 부분이라는 힌트이다. (다만 GC오류라면 알기 어려울 수 있다.)
AActor::GetWorld(void)const; (?)
FLogCategoryLogSpawn LogSpawn
#pragma optimize("", off)
#pragma optimize("", on)
리스타트의 전과 후의메모리가 다른 것에서 터지는 것으로 보인다. (높은 확률로 포인터 쪽)
패키지 로드(?)
발사체?
메모리는 컨테이너 관련으로 접근하면 확률이 높다.
GC를 꺼서 확인해 보는 방법 / 디버깅 모듈을 죄다 키는 방법 이 있지만 이 방법으로는 해결하지 못했다.
gc.VerifyObjectsDestroyed 1
필살기 -> 터지지 않던 이전 버전을 찾아서 돌아가기
develop을 기준으로(그렇게 관리 중 이니까) 전 버전으로 되돌아가면서 문제가 발생하지 않는 버전을 찾는다.
터지지 않는 구간을 찾았고 그 다음 커밋이 범인임이 거의 확정되었다.
clode (얘도 결국 못 찾았다)
총알로 사용했던 projcetile이 범인으로 보인다.
lamda
Add/
생명 주기 Lifecycle
/Remove
객체가 생성돼서 소멸하는 주기
객체가 LifeCycle이 다했는데 접근을 하는 문제가 생길 수 있다.
타이머 핸들이 지역변수
핸들이 죽고 나면 저 타이머를 영원히 끌 수 없게 된다.
New - Delete / 생성 관련된 처리가 됐다면 반드시 소멸 관련된 처리를 생각해줘야 한다.
* this는 nullptr 자체가 불가능하다.
Self = TWeakObjectPtr(this)
self.IsValid()
*1 TMap / TArray - 포인터가 연결이 되었다면 소멸하는 시점에 연결을 반드시 끊어줘야 한다.
*2 GC 때문이다. - Destroy는 바로 소멸 시켜주지 않는다.
Mark & Sweep
보통 개똥 같은 접근 오류면 Destroy
권장 되는 패턴
SetTimer를 걸었다면
객체가 소멸하는 시점에 RemoveTimer를 호출하자
또 하나 그냥 알아두면 좋은 것
RawPointer에 대한 위험성 -> TWeakObjecPtr의 IsValid함수로 사용
캡처에서 [this, & ]는 피하는 것이 좋다.
ensure / valid
==
문제가 생겼던 구문은
ShootingmachineComponent의 91 DoFire() 함수 내에서 총알 projectile을 생성하면서 생겼다.(130~134줄)
Set TimerHandle 을 하고 해제를 하지 않은 상태로 Destroy()에 들어가고 있었고 Destroy()함수는 GC가 작동하는 순간에 호출되므로 중복 호출이 되더라도 즉시 알 수 있는 방법이 없다.(UE의 단점)
당연히 빈 포인터를 다시 호출하는 형태가 되면 크래시로 터진다.
===
'TIL' 카테고리의 다른 글
| 26.02.27일자 - TIL (0) | 2026.02.27 |
|---|---|
| 26.02.26일자 - TIL (0) | 2026.02.26 |
| 26.02.24일자 - TIL (0) | 2026.02.24 |
| 26.02.23일자 - TIL (0) | 2026.02.23 |
| 26.02.20일자 - TIL (0) | 2026.02.20 |