일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- splinemeshcomponent scale
- Ai
- 리디렉터 크래쉬
- ue4 error
- Unreal Engine 4
- register component
- ai 뚝뚝 끊김
- deltaTime
- ai jitter
- UE5
- LittleNightMare
- unity
- Random Map Generator
- UE
- 언리얼
- redirection crash
- unreal ai lag
- ai 주춤거림
- Unreal Engine 5
- staticmesh mobility
- unreal engine
- 랜덤 맵 생성
- redirector crash
- 13iew
- ue4 Crash
- Unreal Engine Error
- UE4
- 리디렉션 크래쉬
- unreal engine redirection crash
- UnrealEngine
- Today
- Total
목록UE4 (11)
Class GameDev* SheepAdult

Nav Mesh를 런타임 중 변경하는 것은 구글링을 해보면 쉽게 알 수 있는 내용이다. 바로 아래와 같이 Runtime Generation을 Dynamic으로 바꿔주면 된다. 프로젝트를 생성한 후 아무런 설정도 건들지 않았다면 실행이 잘 되겠지만 본인도 모르는 사이에 설정을 바꿨다면 위의 값이 Dynamic이어도 runtime에 nav mesh가 바뀌지 않을 때가 있다. 바로 Navigation System의 설정값 중 "초기 빌드 잠금"이 true일 경우이다. 저 값을 true로 설정하면 내비게이션 시스템의 내비게이션 리빌드가 ReleaseInitialBuildingLock()을 호출할 때까지 중지된다.
TMap Container에 TArray를 Key나 Value로 저장하려고하면 Nested Container이기 때문에 저장할 수 없다고 에러 메세지가 뜬다. 이럴 경우 USTRUCT를 하나 선언한 후 이 안에 Nested Container를 담으면 된다. 아래는 예시 코드이다. USTRUCT() struct FTest { GENERATED_BODY() public: UPROPERTY() TArray Transforms; }; USTRUCT(Atomic, BlueprintType) struct FLevel1Struct { GENERATED_BODY() public: UPROPERTY() TMapTestData; }

(2022-12-27 수정) 물건이 떨어져서 바닥에 닿았을 때 소리가 나는 경우를 구현하고자 할 때, OnComponentHit을 사용해서 구현해야 한다는 생각이 자연스럽게 들 것이다. 하지만, OnComponentHit은 우리가 생각했던 것보다 더 많은 빈도수로 호출된다. 만약 어떠한 처리도 하지 않고 물건을 떨어뜨리면 바닥에 한 번만 닿아도 수십 번의 소리가 재생되어 원치 않던 소리가 나므로 적절한 처리를 해주어야 한다. 본문에서 사용할 처리 방법은 OnComponentHit의 매개변수인 NormalImpulse에 임계점을 주어 강한 충돌만 다룰 것이다. 여러 오브젝트에 이식할 수 있도록 컴포넌트로 만들었다. 아래는 PhysicsCollisionSoundComponent.cpp 이다. // Physi..

우리가 만약 UPROPERTY()로 선언한 변수 값이 늘어나 디테일 창에서 정리를 하고 싶거나 특정 값을 기준으로 해당 값을 Disable(Deactivated) 혹은 Able(Activate) 시키고 싶을 때가 있을 것이다. 이럴 경우 언리얼 UPROPERTY()의 EditCondition을 사용하면 된다. 사용법은 아래와 같다. UPROPERTY(Specifier, meta=(EditCondition="BooleanPropertyName")) 자료형 변수명; EditCondition은 Boolean 자료형을 받으며 true 조건이 되면 활성화가 되고 false 조건이면 비활성화가 된다. 테스트로 아래와 같이 코드를 작성해 보았다. UPROPERTY(EditAnywhere) bool bIsTesting..

(상수 같은 경우 코드의 가시성을 높이기 위해 따로 빼두지 않고 넣어놨습니다.) 3D 게임 개발 시 간단하게 이동을 구현하면(기본 언리얼이 제공하는 3D 콘텐츠 팩 같은 경우), 좌측으로 이동했다가 우측으로 이동할 경우 특별한 마찰력 등의 저항을 주지 않았다면 짧은 시간 안에 속도가 0으로 줄어들었다가 몸이 반대로 돌아가며 속도가 다시 서서히 올라간다. 방향 전환이 이루어질 때 아무런 애니메이션 없이 휙 돌아가는 모션이 없어 어색해 약간 주춤(?)하는(자동차 드리프트 느낌) 애니메이션을 넣어 보고자 했다. (코드는 마지막에) 1. 구현에서의 첫 번째 오판 - 판단 처음에 생각했을 때 캐릭터의 AxisValue를 받아서 구현해 보고자 했다. 일단, 속도가 너무 느리면, 즉 걸을 때는 일반적인 경우처럼 하기..

메뉴를 열거나 pause 키로 게임을 중단시키고 싶을 경우 일반적으로 UGameplayStatics::SetGamePaused(GetWorld(), true); 를 사용해 게임을 중단시킨다. 그리고 다시 게임으로 돌아오기 위해 ESC를 누르거나 P키(일반적으로 Pause키)를 누르면 안 눌러지는 것을 알 수 있다. 왜냐하면 게임이 중단되면 Input도 중단되기 때문이다. 그러면 FlipFlop형태로 중단했다가 재개하려면 어떻게 해야 할까? 블루프린트를 살펴보면 아래와 같은 bool 값이 있다. 저기 Execute when Paused가 있는 것을 알 수 있는데 저것을 true로 바꿔주면 된다. c++ 에선 아래와 같다. void AMainCharacter::SetupPlayerInputComponent(..
스켈레탈 메쉬에 대한 몽타주가 끝나거나 블렌드 아웃될 때, 혹은 노티파이가 시작될 때 등 스켈레탈 애니메이션에 대한 Delegate를 활용하여 코드를 더 안전하고 효율성 있게 짤 수 있다. 언리얼은 위젯 애니메이션에도 이러한 Delegate를 지원한다. 아래는 전체적인 코드이다. // Widget.h #pragma once #include "CoreMinimal.h" #include "Blueprint/UserWidget.h" #include "Components/Image.h" #include "FirstPersonDefaultWidget.generated.h" /** * */ UCLASS() class CAP2_API UFirstPersonDefaultWidget : public UUserWidget..

결과물 Youtube Link : https://www.youtube.com/watch?v=olNclpA5Df0 +2022.4.30 수정 +2023.1.29 수정 (오랜만에 글 보는데 너무 예전 코드라 일부 수정) 3인칭 중에서도 사이드 뷰 시점일 경우에 물건을 줍고 던지는 기능을 구현해 봤다. 유튜브나 구글엔 원하는 형식의 강의가 없어서 스스로 구현해봤다. 먼저 구현된 모습이 어떨지 상상해 보면, 캐릭터가 물건을 집을 수 있는 위치에서 왼쪽 마우스 버튼을 누르면 그 물건을 줍는다. 줍는 애니메이션이 실행 중일 때는 움직일 수 없어야 하며, 줍는 애니메이션 실행 중 왼쪽 마우스 버튼을 뗀다면 애니메이션이 끝난 후 툭 떨어 뜨려야 한다.(사실 줍는 동안 손을 떼면 애니메이션이 해당 지점에서 중지하고 Rev..

결과물 Youtube Link : https://www.youtube.com/watch?v=t0hdhi6UnbM 사이드 뷰 게임에서의 밀고 당기기 기능을 어느 정도 구현해봤다. 처음에 감이 잘 잡히지 않아 정리를 해보고 구현했다. 본문 같은 경우 AddForce 같은 물리로 구현한 것이 아닌 AddWorldOffset과 AddWorldRotation을 사용해서 굉장히 자연스러운 구현은 못했지만 원하는 결과는 어느 정도 얻었다. 먼저 원리는 이렇다. 우선 개인적인 생각으로는 본인이 물건을 잡고있는 방향의 옆 방향을 입력했을 때는 움직일 수 없게 하는 게 자연스럽다고 생각했다. 에서 (1)은 움직일 수 없는 각도이고 (2)는 움직일 수 있는 각도이다. 만약 움직이는 키를 왼쪽 아래 방향을 입력한다면 왼쪽 아..
기본적인 Crouch() 함수를 사용해 캐릭터의 앉는 기능을 구현하면 부자연스럽게 뚝뚝 끊어져 보이는 것처럼 앉게 된다. 3인칭이나 사이드뷰같은 경우 SpringArm의 CameraLag을 통해 부드러운 앉기를 구현할 수 있지만 보통 1인칭은 캡슐 컴포넌트에 카메라를 박아 넣는 방식을 사용하므로 직접 구현해주는 게 낫다고 판단해 구현해 보았다. 먼저 Timeline에 쓰일 변수와 함수를 Pawn으로 사용할 메인 캐릭터 헤더파일에 아래와 같이 추가해 준다. private: // SmoothCrouching FOnTimelineFloat SmoothCrouchInterpFunction; // (1) FOnTimelineEvent SmoothCrouchTimelineFinish; // (2) UFUNCTION..