일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Frustum
- NRVO
- C
- winapi
- baekjoon
- 절두체 크기
- 백준
- GeeksForGeeks
- 언리얼엔진5
- 절두체
- 줄 세우기
- Programmers
- const
- 2294
- IFileDialog
- UnrealEngine4
- 프로그래머스
- C++
- DirectX11
- 팰린드롬 만들기
- 가장 큰 정사각형
- UE5
- RootMotion
- DeferredRendering
- softeer
- directx
- RVO
- UnrealEngine5
- algorithm
- 1563
- Today
- Total
목록UnrealEngine5/이것저것 (38)
Game Develop
튜토리얼?이라던가 그런것들 보면 보통 생성자에서 부착해서 쓰고들 한다. 그래서 생성자에서만 호출 가능한 로드함수들을 사용하고는 한다. 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해서 구현해놨는지 알 수 없다. (이건 약간 뇌피셜) 순수가상함수뿐만 아니라 그냥 가상함수 선언 후, 자식클래스에서 오버라이드하더라도 에러가 뜨면서 빌..
예를들어 시각기능의 시야각을 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()..