일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 티스토리챌린지
- C++
- IFileDialog
- baekjoon
- UnrealEngine4
- 언리얼엔진5
- UE5
- 백준
- winapi
- Unreal Engine5
- GeeksForGeeks
- RootMotion
- 줄 세우기
- const
- DirectX11
- algorithm
- RVO
- 2294
- C
- DeferredRendering
- 오블완
- 프로그래머스
- softeer
- 1563
- NRVO
- directx
- Frustum
- 팰린드롬 만들기
- UnrealEngine5
- Programmers
- Today
- Total
목록UnrealEngine5/이것저것 (51)
Game Develop
언리얼엔진에서 가상함수를 따로 생성해주기 위해선 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'이 있다. 이거 누르면 다시 잘 보인다..
예를들어 캐릭터의 전투여부에 따라 Idle모션이 바뀐다고 가정. 애님인스턴스 c++파일에서는 캐릭터클래스를 TryGetPawnOwner로 받아와서 애님인스턴스클래스자체에서도 bool IsCombat을 계속 업데이트하게 해놨다. 입문자를 위한 책예제에서는 전부 블루프린트에서 하게 해놨는데, 일단 블루프린트와 C++성능 차이가 꽤 있다는 것을 인지하고 있었기 때문에 틱마다 수행하는 이런 간단한 값업데이트정도는 C++로 하는게 맞다고 판단했다. 사실 일단은 규모가 작기 때문에 현재를 기준으로 치면 블루프린트로 처리하든 C++코드로 처리하든 별 의미는 없다. 다만, 어차피 결국 커지기 마련이고 최대한 코드로 처리할 수 있는 부분은 코드로 처리하는게 맞는 것 같다. 실제로 이렇게하니까 아래와 같이 에디터자체에서도..
나같은 경우 플레이어캐릭터의 애니메이션 이벤트그래프는 일단 c++코드로 작성하고 애님그래프쪽만 블루프린트로 처리 해보려 한다. 일단은 이벤트그래프쪽은 c++코드로 처리하려고는 하는데 언제 어떻게 비중이 바뀔지는 아직 모르긴한다.. 어쨌든 AnimInstance 클래스에 아래와 같이 플레이어캐릭터 포인터 변수를 선언해주었다. class AMainPlayer* m_MainPlayer; 하지만 그냥 C++로만 하듯이 이렇게 선언해서 사용하면 안된다. 언리얼엔진에는 가비지컬렉터가 존재한다는것을 반드시 인지하고 있어야 한다. 언리얼 엔진의 가비지컬렉터에 관한 내용은 매우 방대하기 때문에 전부를 다루는것은 어렵고, 개발하면서 부딪치는 문제를 해결할 때마다 관련 경험에 대한 글을 반드시 작성하는게 좋을 것 같다. (..