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화
'프로젝트 VV 개발일지(0) > 다이어리' 카테고리의 다른 글
05.27 카메라 토글, 추적 모드와 자유이동 모드 (0) | 2025.05.27 |
---|---|
05.26 휴식 (0) | 2025.05.26 |
05.24 강한 참조와 약한 참조 (0) | 2025.05.25 |
05.23 TObjectPtr 와 GC의 자동 nullptr처리에 관해 (0) | 2025.05.24 |
05.22 UClass Pointer (0) | 2025.05.22 |