일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- C
- softeer
- IFileDialog
- UnrealEngine5
- 절두체
- 절두체 크기
- DeferredRendering
- Frustum
- 2294
- 백준
- NRVO
- const
- RVO
- 트리의 지름
- 가장 먼 노드
- winapi
- 프로그래머스
- DirectX11
- GeeksForGeeks
- RootMotion
- C++
- UE5
- algorithm
- UnrealEngine4
- 가장 큰 정사각형
- 줄 세우기
- Programmers
- directx
- 언리얼엔진5
- baekjoon
- Today
- Total
목록UnrealEngine5 (20)
Game Develop
필요없는 잡소리를 듣고싶지 않다면 https://forums.unrealengine.com/t/when-is-the-constructor-called/480067 When is the Constructor called? Hey guys, first of all, i am sorry for my English. So i need to say that i am in the beginning of GameDev. I know the basics of c++, and so on, and therefore i wanted to look into Unreal Engine. My Problem is something like this: why is it not possible to forums.unrealengine..
UPROPERTY를 당연히 쓰긴 써왔지만, 사실 각프로퍼티에 대해 좀 헷갈렸었다. 설명은 많지만 아키타입이 뭔지도 헷갈리고, 그냥 적용범위가 넓은 프로퍼티를 써서 되게만 해왔던 것 같다. 하지만 const처럼, 읽기전용으로 할것을 굳이 Edit관련 프로퍼티를 넣을필요가 없기에 한번 싹 정리를 했다. 공식문서등에 나오는 아키타입이란 것은, 우리가 어떤 액터를 만들고 해당 액터를 상속받는 블루프린트클래스파일을 만들경우 이 블루프린트파일이 아키타입이라 생각하면 된다. 유니티의 프리팹이랑 매우 비슷한 개념이라고 하며, UPROPERTY에서 아키타입에 관해 Edit이라던가 Visible관한 설명이 나오면 이 블루프린트파일내에서 디테일패널에 표시할건지, 수정까지할건지 등에 대한 속성을 결정하는거라 보면 된다. 위의..
다른부분에 대해서 구글링하다가, 우연히 접하게 되었다. 이름에서 알 수 있듯이, C++의 inline과 비슷한데 좀 더 강력한 강제성을 지녔다고 한다. 애초에 c++에서의 inline같은 경우는 명시하더라도 컴파일러가 임의로 인라인화를 안시킬수도 있으며 inline을 명시 안했더라도 인라인화를 시켜버리기도 한다. 예를들어 헤더에서 함수정의까지 할 경우 인라인화를 시키는 경우가 있다. 그에반해 언리얼 FORCEINLINE은 좀 더 강제성을 띈다고 한다. 다만 당연히 무조건 좋은건 아니고 공식문서에도 좀 더 보수적으로 사용하라고 되어있다. 어떤곳에 사용하지않는게 좋은지는 알아갈때마다 이 글에 추가해봐야겠다. 일단 현재는 Getter 함수에다가는 전부 선언해줬다.
ActorPool로 관리할 액터들에게 PoolableActor라는 인터페이스를 상속시켰었다. 해당 인터페이스에는 m_bIsActive, 즉 활성화여부를 따지는 bool변수 딱 하나만 있었다. 아무생각없이 그렇게 하다가, 인터페이스 관련 글을 보다보니 원래 객체지향설계에서 인터페이스에는 멤버변수가 없는게 정설이라고들 하더라... 원시타입인 bool 하나라서 괜찮지 않을까? 싶다가도, 후에 특정 액터클래스에도 같은 변수명이 있을수도 있는, 즉 겹칠수도 있는 상황이 있을수도 있단다. 생각해보니 말이 된다. 물론, 현제 내가 아는 영역에서는 활성화여부란 액터풀에 관련된 활성화여부밖에 없지만, 그건 취준생의 생각일 뿐이다. 그래서 언리얼 인터페이스가 아니라 그냥 추상클래스로 바꾸려고 여러 시도를 했다. 거의 인터..
튜토리얼?이라던가 그런것들 보면 보통 생성자에서 부착해서 쓰고들 한다. 그래서 생성자에서만 호출 가능한 로드함수들을 사용하고는 한다. CreateDefaultSubobject라던가 ConstructorHelpers::FClassFinder (혹은 FObjectFinder 등) 같은 걸 쓴다. 일단 기존의 생성자에서 호출하는 코드. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 UWidgetComponent* widgetComponent = CreateDefaultSubobject(*assetPath); widgetComponent->SetupAttachment(mesh); widgetComponent->SetRelativeLocation(relativeLocation); wi..
언리얼 유효성검사하다보면, 막 배우는 사람들입장에서는 헷갈리는 부분들이 있다. 뭔 로우포인터쓰면 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해서 구현해놨는지 알 수 없다. (이건 약간 뇌피셜) 순수가상함수뿐만 아니라 그냥 가상함수 선언 후, 자식클래스에서 오버라이드하더라도 에러가 뜨면서 빌..