본문 바로가기

언리얼14

[UE4]애님노티파이를 이용시 발생했던 버그(루프 애니메이션이 아닌 경우) 애니메이션 공격동작의 특정 부분에 AttackEnd라는 노티파이를 추가하여 스테이트를 IDLE로 전환하는 작업을 진행 중이었다. 처음에는 IDLE 스테이트로 잘 돌아왔지만 두번째 공격 애니메이션 재생시 IDLE로 전환되지 않고 애니메이션이 끝난 채로 캐릭터가 멈춰버렸다. 코드 상의 문제인가 싶어 이리저리 살펴봤지만 그냥 하루만 날렸다. 알고 보니 공격 애니메이션은 루프 애니메이션이 아니였고 한번 재생이 된 후, 처음으로 되돌아가지 않아 노티파이 역시 동작하지 않고 있었다. 애님 블루프린트이 스테이트 머신에서 해당 스테이트를 클릭하고, 디테일에서 Always Reset on Entry를 체크해주자. 2018. 12. 5.
[UE4]Anim 블루프린트 Threadsafe 경고 해결 애니메이션 블루프린트에서 트랜지션룰을 셋하고 있다. GetCurStateType은 enum값을 가져오는 함수로 meta = (BlueprintThreadSafe)가 UFUNCTION 내에 선언되어 있다. 그런데도 자꾸 저런 경고가 뜬다. 블루프린트 함수를 뒤져보니 GetPlayerCharacter와 형변환은 meta가 NotBlueprintThreadSafe로 되어 있었다. 이 문제를 해결하는 방법은 두가지가 있었다. 1. 클래스 세팅에서 Multithread 옵션을 끈다.2. 해당 값을 블루프린트 내의 변수에 저장해서 쓴다. 2번을 이용하여 해결했다. Curstate라는 변수에 저장하여 해당 변수를 이용하여 트랜지션룰을 만들었더니 해결되었다. 2018. 12. 5.
[UE4]enum을 string으로(C++) 로그 출력 등 디버깅 용도로 enum 값을 출력하고 싶을 때가 있다. 123456789FString APlayerCharacter::GetEStateAsString(EStateType EnumValue){ const UEnum* enumPtr = FindObject(ANY_PACKAGE, TEXT("EStateType"), true); if (!enumPtr) { return FString("Invalid"); } return enumPtr->GetNameStringByIndex((int32)EnumValue);}Colored by Color Scriptercs 이와 같이 쓰면 된다.enum은 blueprinttype으로 되있어야 한다. 참고로 4.16버전 이전에는 GetEnumName을 썼는데, 그 이.. 2018. 11. 24.
[UE4]GC에 의한 UObject 상속받은 객체 삭제 방지 클래스 안에서 UObject를 동적으로 생성하는 작업을 하다보면 가끔 플레이 도중 아무것도 안하고 있으면 0xFFFFFFFF와 같은 에러메세지와 함께 액세스 위반 에러가 뜬다. 콜 스택을 봐도 감이 안잡혀 짐작가는 바는 GC(Garbage collector)밖에 없었다. 해당되는 UObject를 AddToRoot 함수를 사용하여 GC에 의한 삭제를 방지할 수 있다. 예: MyObject->AddToRoot(); 2018. 11. 20.