일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- RVO
- algorithm
- 오블완
- Unreal Engine5
- 줄 세우기
- softeer
- C++
- 1563
- UnrealEngine4
- DeferredRendering
- NRVO
- winapi
- UE5
- 2294
- C
- 언리얼엔진5
- 팰린드롬 만들기
- baekjoon
- Frustum
- GeeksForGeeks
- const
- RootMotion
- 백준
- 티스토리챌린지
- 프로그래머스
- UnrealEngine5
- IFileDialog
- directx
- Programmers
- DirectX11
- Today
- Total
목록UnrealEngine5 (50)
Game Develop
이슈저장용글에 가깝다. 12345678910111213141516171819202122232425USTRUCT(Atomic) struct FSkillList{ GENERATED_USTRUCT_BODY() public: UPROPERTY(Transient) TMapFName, TObjectPtrUSkill>> skillList;}; UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )class HYOBINSPROJECT_API USkillComponent : public UActorComponent{ GENERATED_BODY() public: USkillComponent(); const TMapFNa..
여기서 말하는 강참조는 GC의 수거대상이 안되게 참조하고있다는 의미이다.간혹 관련해서 구글링하다보면 여러글에서 TObjectPtr을 사용하면 GC가 수거를 안한다고 되어있는데, 내가 실험해본 결과는 아니다. 보통 그런글에는 TObjectPtr에 UPROPERTY가 선언되어있는데, 그렇기때문에 수거를 안한거다. 나는 실험을 위해 몬스터 때릴때 나오는 데미지위젯을 대상으로 실험해봤다.기본적으로 데미지위젯은 생성시 AddViewport로 슬레이트시스템에 등록하고 애니메이션재생이 끝나면 RemoveFromParent로 슬레이트시스템에서 제거하게 해놨다.즉 슬레이트시스템이 강하게참조하는부분은 RemoveFromParent로 삭제했으니 신경 안써도된다. 여기서 실험적인 요소를 넣어서, 데미지위젯을 CreateWid..
컨트롤러는 전방을, 캐릭터는 왼쪽을 바라보고 있다고 가정.캐릭터는 전방기준으로 8가지방향에 대해 구르는 몽타주가 있다.캐릭터는 왼쪽을 바라보고 있는데 키입력을 D키 누르고 구르기를 시도한다면, 캐릭터는 어떤 몽타주를 재생해야하는가?오른쪽으로 굴러야하니 오른쪽으로 구르는 몽타주? 아니다. 위치이동은 키입력의 월드방향벡터로 하는게 맞지만, 몽타주는 오른쪽으로 구르는 몽타주가 아니라 뒤로 구르는 몽타주를 재생해야 자연스럽다.왜? 캐릭터는 왼쪽을 바라보고 있으니까, 뒤로 굴러야 오른쪽으로 이동하는것처럼 자연스러워진다.그러면 컨트롤러기준의 키입력방향벡터가 캐릭터의 로컬기준으로 어디방향인지를 알아내기 위해서는, 먼저 키입력방향벡터를 캐릭터의 로컬방향벡터로 변환해줘야 한다. 그러면 먼저 키입력방향벡터를 알아내보자.여..
예시 1. 피격시 군중제어상태를 Down, Knockback 등으로 바뀐다.2. 행동트리의 최상단에서는 이 군중제어상태가 None일때만 하위노드를 수행하도록 했다.3. 근데 간혹 한번씩 None이 아닌데도 하위노드로 뻗어나가는 경우가 생김. 이런 비슷한 경우일 경우, 최상단에서 특정상태를 검사하는 (2번같은) 데코레이터의 Observer aborts값이 None인지 아닌지 확인할 것.이유는 아래의 각 옵션 설명을 보면 알 수 있다. Observer Aborts 설정 요약:None: 블랙보드 값이 변경되어도 즉시 트리를 다시 평가하지 않음.Self: 해당 노드와 하위 노드를 즉시 다시 평가함.Lower Priority: 이 노드보다 우선순위가 낮은 노드들을 다시 평가함.Both: 이 노드와 하위 노드, ..
몬스터 행동트리를 만지던 도중, 태스크노드에서 게임시작시 한번만 호출하게 되는 함수를 원하게 됐다.그래서 챗지피티한테 물어봤더니 두개의 함수를 추천해줬다. InitializeFromAsset 과 InitializeFromMemory 원리를 전부 파악한건 아니니, 거두절미하고 쓰겠다.어차피 뭐 그냥 직접 태스크노드에서 위 두 함수 오버라이드해서 BP찍어보는게 확실하긴 하다. InitializeFromAsset :1. 행동트리파일을 오픈할 때 호출.2. 이후 행동트리에서 이것저것 만진 후 Save할 때 또 호출.3. 게임 시작시에 호출. InitializeFromMemory :=> BehaviorTreeComponent의 StartTree를 호출 할 때 호출된다. 나같은경우 인스턴스마다 호출할 필욘 없고..
액션성을 중요시하다보니, 어퍼기를 이용해 몬스터를 공중에 띄우는 기능이 있다. 그냥 막연히 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..