| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- UnrealEngine5
- C
- baekjoon
- UnrealEngine4
- Effective C++
- 백준
- RootMotion
- Unreal Engine5
- softeer
- IFileDialog
- NRVO
- 2294
- 팰린드롬 만들기
- directx
- 줄 세우기
- winapi
- Programmers
- algorithm
- 1563
- UE5
- 언리얼엔진5
- DirectX11
- RVO
- TObjectPtr
- 프로그래머스
- GeeksForGeeks
- C++
- 티스토리챌린지
- 오블완
- const
- Today
- Total
목록UnrealEngine5 (36)
Game Develop
액션성을 중요시하다보니, 어퍼기를 이용해 몬스터를 공중에 띄우는 기능이 있다. 그냥 막연히 AddImpulse를 이용해서 데이터테이블에 지정된 값만큼 z축으로 띄우게 했었는데, 가만히 살펴보니 액터(몬스터)의 CharacterState에 따라서 값이 달라지는 걸 알 수 있었다. OnGround상태일 때랑 Falling 상태일 때 띄워지는 정도가 달랐던 것.그래서 ChatGPT한테 물어보니, Falling상태일 땐 중력값에 의해 속도가 -z축쪽으로 힘이 가해지니, +z축으로 힘을 가한 내 AddImpulse 함수랑 충돌해서 더 적게 띄워진 것이였다. 또한 AddImpulse 는 액터의 질량에도 영향을 받는다고 한다. 이렇게 현재 액터에 가해지고있는 속도나 액터의 질량을 무시하고싶으면 LaunchCharac..
https://www.youtube.com/watch?v=vLyxzPFbTBU 내용은 계속 업데이트 예정. 모션워핑 노티파이스테이트의 각 옵션 Root Motion Modifier Scale은 선형애니메이션에 적절. (그냥 일직선으로 걷는다던가)Skew Warp는 동선이 약간 호를 그리는 애니메이션일 때 사용. 모션워핑을 통해 개발자가 애니메이션의 특정구간을 재생할 때 원하는만큼 이동시키게 한다는 등의 기능을 구현 가능.타겟을 지정해주면, 회전시킨다던가. 노티파이랑 노티파이스테이트로도 가능한 부분들이 많긴하지만, 약간 노가다성(?) 작업들이 많을 수 있는 부분을 좀 더 편하게, 생산성있게 해주는 기능인 것 같다.
내가 설계한 구조상, 노티파이스테이트에서 매개변수로입력한 공격이름에 대한 정보를 DataManager라는 서브시스템에서 가져오게 해놨다. 그래서 으레 다른곳에서 했던것처럼 UDataManager* dataManager = GetWorld()->GetGameInstance()->GetSubsystem(); 이런식으로 가져왔는데, 크래쉬가 발생했다. 확인결과 GetWorld()자체가 그냥 nullptr을 반환했다. 그래서 그냥 느낌상으론, NotifyState는 액터나 액터에 부착되는 액터컴포넌트같은것들처럼 월드에 속한개념이 아니다보니(?) 그냥 nullptr을 리턴하는 것 같다. 좀 더 정확히는, 그냥 노티파이트스테이트에서 GetWorld()를 하면 UObject의 GetWorld를 가져오고, MeshCo..
상황 A라는 몽타주를 재생하다 StopAllMontage(0.2f)를 호출하고, B몽타주를 재생하게 해놨음. A라는 몽타주의 7프레임정도에 노티파이를 심어놨다고 가정. B에도 10프레임정도?에 노티파이를 심어놨다고 가정. 내가 예상한 결과는, A라는 몽타주를 재생하다 7프레임 이전에 StopAllMontage(0.2f) 호출 후, B몽타주 재생시 당연히 자연스럽게 B를 재생. 7프레임이전에 Stop했으니 노티파이는 호출안된다고 생각. 그러니 당연히 될거라 생각하고 실행함. 결과 10번중에 1번꼴로 B를 재생시작하자마자 A에 심어놨던 노티파이가 호출되는 이슈가 발생. 아예 B자체가 재생안된건가? 싶어서 애님인스턴스의 OnMontageStarted랑 OnMontageEnded라는 델리게이트변수에 로그출력용..
천천히 조금씩 업데이트 할 예정. 애님인스턴스의 델리게이트변수중에선 OnMontageStarted와 OnMontageEnded가 있다. 말 그대로 몽타주재생 시작할때와 끝날 때 호출시킬 함수를 바인딩 할 수 있는 델리게이트변수이다.Ended에는 매개변수로 bInterrupted라고 하나 더 있는데, 해당 Ended가 호출된게 몽타주가 끝까지 재생해서 호출된건지, 아니면 몽타주를 재생하는 '중간에' 다른 몽타주재생을 호출해서 강제로 끊긴건지에 대한 여부이다.bInterrupted가 true이면 강제로 끊겼다는 의미이다. 그리고 이렇게 A몽타주를 재생하다가 중간에 B몽타주를 재생했다고 가정해보자.그러면 A의 Ended가 먼저 호출될까, 아니면 B의 Started가 먼저 호출될까?정답은 B의 Started가..
이런 enum class의 상태들이 있을 때, 이것들의 순서를 변경했다면 반드시 행동트리에서도 관련된것들을 다시 체크해줘야 한다.나같은 경우 순서를 바꿨었는데, 그럴경우 행동트리에서 데코레이터노드의 값들이 변경되거나 아예 값이 설정이 안되어있기도 했다. State Is Equal To Chase라고 지금은 잘 되어있긴 한데, 뭣모르고 바꾼다음에 몬스터AI가 이상하게 수행되었었다.그러다가 자세히 보니 값들이 풀려있거나 다른것으로 설정되어있던것을 확인할 수 있었다.혹시 갑자기 행동트리가 멋대로 작동한다면, 이 부분을 확인해볼것.
const UEnum* enumPtr = FindObject(ANY_PACKAGE, TEXT("EMainPlayerSkillStates"), true);if (enumPtr != nullptr){ for (int i = 0; i NumEnums(); ++i) { EMainPlayerSkillStates enumState = (EMainPlayerSkillStates)(enumPtr->GetValueByIndex(i)); //UE_LOG(LogTemp, Log, TEXT("> %s"), *enumPtr->GetNameByIndex(i).ToString()); }} 구글링 시, 언리얼4버전에서는 FindObject할 때 꺽쇠로 캐스팅할 클래스명시 안하는걸로 되어있는데, ..
프로젝트의 TMap컨테이너를 사용해야하는데 Key값으로 FName을 사용하거나 주소값 (AActor*라던가 등)을 사용하곤 한다. 이 때 FName을 Key값으로 사용할 시, 성능이 괜찮은지 궁금해서 구글링하던 결과 괜찮은 글을 찾았다.근데 이건 6년전 글이라 UnrealEngine4 버전 기준이다.성능이 빠르다는것은 5버전이더라도 유효할것이고, 이유도 비슷할거라서 일단 포스팅했다.5내에서의 원리는 추후... 언젠가 조금이라도 분석해보겠다. https://www.reddit.com/r/unrealengine/comments/828neo/questionfname_performance_in_a_database_tmap/?rdt=45138 From the unrealengine community on Red..