일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 언리얼엔진5
- Programmers
- NRVO
- DeferredRendering
- 줄 세우기
- UE5
- 오블완
- RVO
- DirectX11
- 티스토리챌린지
- winapi
- 팰린드롬 만들기
- RootMotion
- Unreal Engine5
- C
- algorithm
- softeer
- 프로그래머스
- C++
- Frustum
- IFileDialog
- UnrealEngine5
- 백준
- directx
- UnrealEngine4
- baekjoon
- 2294
- GeeksForGeeks
- const
- 1563
- Today
- Total
목록UnrealEngine5 (31)
Game Develop
언리얼 유효성검사하다보면, 막 배우는 사람들입장에서는 헷갈리는 부분들이 있다. 뭔 로우포인터쓰면 nullptr이 대입안되서 위험하고.. UPROPERTY쓰면 어쩌고 저쩌고.... 다른 기준으로 좀 이해하기 편하게 쓰자면, 어떠한 액터의 Destroy()를 호출했을때를 기준으로 생각하는것도 괜찮다. 일단 UPROPERTY()가 명시된 액터의 경우, Destroy를 호출한 다음 GC가 호출되기 이전, 이후는 다음과 같다. 이전 : 여전히 기존의 메모리를 가르킴. 이후 : 변수에 nullptr대입 즉, 만약 Destroy 호출 후에 GC가 호출되기 이전에 그저 해당 유효성검사를 nullptr로 한다면 개발자가 의도하지않은 동작이 일어날 수 있다는 의미이다. 어쨌든 Destroy를 호출했다는 것은 해당 호출 이..
언리얼에는 특정클래스에 특정인터페이스가 상속되어있는지 확인하는 함수가 있다. spawnedActor->GetClass()->ImplementsInterface(UPoolableActor::StaticClass()) 이 함수를 사용할 때 주의할 점은, 클래스타입만으로 GetClass() 호출 후, ImplementsInterface를 호출하면 false만 리턴한다는 것이다. (실제로 상속받았는데도) 예를들어 나같은 경우 블루프린트액터가 아닌 일반액터에 대한 액터풀을 생성하거나 액터풀에서 액터를 꺼내올 때 아래와 같이 액터의 StaticClass만 넘긴다. m_ActorPool->CreateActorPool(AMeleeMinion::StaticClass(),1); 그럼 검사를 할 때 AMeleeMinion:..
언리얼엔진에서 가상함수를 따로 생성해주기 위해선 C++에서 했던 것 처럼 하면 안된다. 아래처럼 순수가상함수를 생성해본다고 가정하자. virtual void TestFunction() = 0; 이런식으로 작성하고 빌드하면, '추상클래스를 인스턴스화 할 수 없다'라는 에러가 뜰 것이다. 일단 결과적으로, UObject의 하위 시스템은 각 클래스를 인스턴스화 할 수 있어야 한다고 한다. 아마 에디터에서 내부적으로 사용할 CDO를 생성하기 위해 그런 것 같다. 하지만 위와같이 C++에서만 알아먹게 선언해놓는다면 에디터는 자식클래스에서 저걸 제대로 override해서 구현해놨는지 알 수 없다. (이건 약간 뇌피셜) 순수가상함수뿐만 아니라 그냥 가상함수 선언 후, 자식클래스에서 오버라이드하더라도 에러가 뜨면서 빌..
예를들어 시각기능의 시야각을 90도로 설정해놨는데 180도로 설정하고싶다? 변경 후 ConfigureSense를 다시 호출해줘야한다. // 초깃값. m_SightConfig->PeripheralVisionAngleDegrees = 90.0f; // 처음 설정값 GetPerceptionComponent()->ConfigureSense(*m_SightConfig); . . . 이후에 특정 이벤트로 인해 180.0f로 바꾸고싶으면 m_SightConfig->PeripheralVisionAngleDegrees = 180.0f; // 이렇게만 하면 적용안된다 GetPerceptionComponent()->ConfigureSense(*m_SightConfig); // 다시 호출해주면 적용된다. 다시 호출하는걸 모르..
며칠동안 C++로 생성한 AIPerception 컴포넌트가 제대로 감지를 못해서 막혔었다. 아예 감지가 안되는건 아닌데, 됐다 안됐다 그랬었다. 감지가 제대로 안됐던거는 SightConfig 각 옵션값들 (시야각,인지거리 등등)을 넣을 때 뭔가 잘못 넣어서 그랬던 것 같다. 혹시 몰라서 블루프린트로 컴포넌트 추가하고 확인해보니까 잘만 되길래 '값설정을 잘못한 것 같은데..?'라는 생각을 했다. 그래서 다시 C++코드로 아무값도 없이 컴포넌트가 생성됐을 때의 디폴트값 그대로 냅두고 빌드 후 플레이 시키니까 잘만 됐다.... 그리고 시각이나 청각 등등의 Config를 생성 후에 OnTargetPerceptionUpdated에 호출할 함수를 바인딩 하는 경우가 많을것이다. (혹은 PerceptionUpdate..
나는 '공격'에 대한 정보를 아래와 같이 세분화시켜봤다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 struct FAttackInfoStruct { GENERATED_USTRUCT_BODY() // 언리얼 오브젝트임을 알리는 매크로 public: float damage; bool bIsDot; bool bHasCrowdControl; ECrowdControlType crowdControlType; // CC기 종류 float crowdControlTime; // CC기 지속시간 bool bHasKnockBack; float knockBackTime; // 경직시간 -> 피격체의 힛트모션 재생시간과 대응 float knockBackDistance; // 밀려지는 정도 }; Colored b..
그냥 FString을 역참조해주면 된다. FString은 내부적으로 TArray 타입을 멤버변수로 가진 상태에서 관리하기 때문이다. F12로 정의찍다보면 역참조연산자(*)가 const TChar* 리턴된다고 코드가 작성되어있다. 메쉬나 애님인스턴스 로드할 때 경로를 매개변수로 넘겨줘서 로드하게 하려다보니까 알게 됐다. 보통 아래같이 문자열리터럴을 TEXT 매크로를 통해 const TChar*로 변환시켜서 넘긴다. 1 2 3 4 5 6 7 8 9 static ConstructorHelpers::FObjectFinder tempMesh(TEXT("에셋경로")); if (tempMesh.Succeeded()) { GetMesh()->SetSkeletalMesh(tempMesh.Object); GetMesh()..
블루프린트파일 같은거 다루다보면 가끔씩 디테일패널같은게 사라져서 안보이는 경우가 있다. 분명 상단의 Window탭을 누르면 Details에 표시가 되어있는데 안보인다. 에디터를 껐다켜도 안되고 블루프린트파일을 삭제했다가 재생성해도 해결되지 않을 경우, 아래와 같이 하면 된다. 아주 간단하다. 마찬가지로 Window탭을 누르고 최하단쪽 보면 'Load Layout'이 있고, 마우스를 갖다대면 'Default Editor Layout'이 있다. 이거 누르면 다시 잘 보인다..