프로젝트 VV 개발일지(0)/다이어리

05.25 블루프린트와 인스턴스가 깨지면 변수명을 바꿔주자

누가 뭐래도 개발자 2025. 5. 26. 05:12

2025.05.25

오늘의 목표

상태 수치(StatusComponent) 구현 2

작업 내용

  • 상태수치 9종 임계값 델리게이트 통합

버그 / 문제점

  • HOTRELOAD StatusComponent2 오브젝트 레퍼런스 타입은 StatusComponent 오브젝트 타입과 호환되지 않습니다.

증상: 캐릭터 블루프린트에서 상태수치 게터랑 수정 함수가 연결되지 않음. 캐스팅 해도 안됨.

 

원인:

핫리로드 기능은 기존 클래스를 내부적으로 복제해서 StatusComponent2, 3를 만든다.

그런데, 이 과정에서 미리 열려 있었거나 기존에 컴파일 된 블루프린트 노드가 이전 버전의 클래스를 참조하려 하면서 호환성 에러가 발생하는 것. 

 

해결:

1. 핫리로드가 아닌, 정식 컴파일을 하자.

언리얼 에디터 종료 - VS 전체 빌드 - 에디터 실행.

=> 문제 없이 연결됨.

2. 참조가 깨진 경우, 블루프린트를 복제해도 된다고 함(구조만 복제되기 때문이라나 ) 

 

잘 되다가 코드 수정하니깐, 이번에는 런타임 에러.

PIE: Error: 블루프린트 런타임 오류: "CallFunc_GetStatusComponent_ReturnValue 프로퍼티를 읽으려던 중 None에 접근했습니다.

 

1번으로는 해결되지 않아서 2번 방법을 사용.

BP상에서 내부 변수와 실제 인스턴스가 어긋나면 생기는 현상이라고 함.

는 1번도 실패.

 

해결 방안:

3. BP 새로 생성 => 문제 없음을 확인했지만, 새로 설정하기 귀찮.

 

4. 인스턴스 변경 사항을 블루프린트에 적용

근데, 인스턴스 변경 적용해도 상태수치 컴포넌트의 디테일이 안살아난다.

 

 

5. 변수명 바꾸기

얌전히 컴포넌트 변수명을 바꿔주었다. 잘 인식 됨. 

 

검색해보니까 5번이 보편적인 것 같다. 

 

 

 

배운 것

  • 상태수치 델리게이트 통합

굴림 보정 8종과 나머지를 분리했었는데, 상태수치의 델리게이트 역할은 '상태 수치 X'가 'A 상태' 에서 'B 상태'로 변이했다는 걸 알려주는 것이기에 하나로 통합했다.

Tmap과 구조체를 활용.

 

각기다른 수치와 조건, 상태를 한 맵에 담으려다 보니 이름이 난리났다.

대략, [애너지] 상태이상에 각 임계치 상태 (크리티컬(0 이하인 경우)/ 디버프/ 노말/ 버프),

임계치 상태의 활성/비활성 조건(>=/ >/ <=/ </ 사용안힘) 을 enum으로 설정,

이전의 임계치 상태를 저장하는 Tmap, 이 모든 정보를 저장하는 Tmap.

 

상태 변경은 이전 임계치 상태 Tmap을 이용하고, 한 틱의 동시 상태 유발은 우선순위를 주어서 방지.

 

블루프린트로 간단 테스트

 

 

 

  • 컴포넌트는 판단을 알림 하고, 행동 책임은 다른 곳에 맡긴다.

캐릭터의 사망처리 함수는 게임모드에 있는데, 컴포넌트에서 hp <= 0 이라면, 사망처리는 어디에서 해야하는가?

게임모드를 접근하는 건 한곳으로 집중. 

중간에 캐릭터를 연결고리로 사용하는 것이 이상적, 고로 캐릭터에도 사망처리 전달 함수를 만들자.

 

 

 

다음에 할 일: 간단한 ui화