일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Ai
- 언리얼
- redirector crash
- ai jitter
- unity
- splinemeshcomponent scale
- staticmesh mobility
- Unreal Engine 5
- unreal ai lag
- UE5
- UnrealEngine
- unreal engine redirection crash
- register component
- ai 주춤거림
- ue4 error
- UE4
- UE
- Random Map Generator
- ue4 Crash
- redirection crash
- Unreal Engine Error
- deltaTime
- unreal engine
- Unreal Engine 4
- 리디렉터 크래쉬
- LittleNightMare
- ai 뚝뚝 끊김
- 랜덤 맵 생성
- 리디렉션 크래쉬
- 13iew
- Today
- Total
목록UE (8)
Class GameDev* SheepAdult
에디터에서 원하던 대로 작동하던 코드가 패키징을 하거나 에디터에서 독립형 게임으로 실행을 시킬 경우 물체를 움직이거나 게이지를 채운다거나 하는 행동에 속도 차이가 생길 수 있다. 이는 프로그램을 실행하는 하드웨어의 속도가 다르기 때문에 생기는 문제이다. 이러한 문제의 해결법으로는 deltatime이 있다. deltatime은 1초를 fps값으로 나눈 값을 저장하는 변수이다. 예를 들어, 60fps인 경우, 1 / 60 (0.01666...)을 detatime으로 저장한다. 그럼 이게 왜 해결책이 될까? 만약 Unreal의 경우 Tick함수, Unity의 경우 Update함수에서 일반적으로 1프레임마다 함수를 호출하게 되는데, 방금 말했듯이 하드웨어의 속도가 60 혹은 30 등 fps가 다르면 계산한 결과..
언리얼 엔진 위에서 Delay 기능에 대해 구글링하면 람다 함수를 활용하는 방법이 나온다. 예를 들어 아래와 같다. FTimerHandle WaitHandle; float WaitTime; GetWorld()->GetTimerManager().SetTimer(WaitHandle, FTimerDelegate::CreateLambda([&]() { // 딜레이 후 코드 }), WaitTime /*대기 시간*/, false /*반복*/); 그런데 "만약 딜레이 후 코드" 부분이 레벨이 바뀐 후 호출된다면 크래쉬가 나버린다. 그래서 처음엔 코드에 작성된 객체의 포인터가 레벨이 바뀌면서 참조 해제되어 null을 가리켜서 그런가 보다 생각해 객체를 null check를 해주었다. 그런데도 크래쉬가 났다... 좀 더..

먼저 InVisible하게 만들 오브젝트의 디테일 창의 렌더링 카테고리에서 Hidden In Game을 true로 설정해준 뒤, Lighting 카테고리의 Hidden Shadow를 true로 설정해주면 된다. Hidden Shadow는 Hidden으로 설정되었을 때 Shadow Cast해주는 기능을 한다.
본론부터 말하자면 CallFunctionByNameWithArguments 함수를 사용하면 된다. 해당 함수는 인자로 FOutputDeviceNull을 받는데 #include "Misc/OutputDeviceNull.h"를 include 해줘야 한다. #include "Misc/OutputDeviceNull.h" ... void ATest::TestFunction() { FOutputDeviceNull Ar; CallFunctionByNameWithArguments(TEXT("BPFunction"), Ar, nullptr, true); }
언리얼에 내장되어 있는 Interface 클래스가 아닌 다른 클래스에서 가상 함수를 만들어보면 // AMaster_InteractableObject.h public: UFUNCTION() virtual void Interact() PURE_VIRTUAL(AMaster_InteractableObject::Interact, ); 과 같이 보통 작성한다. 저 PURE_VIRTUAL을 보면 순수 가상함수를 말하는 것 같아 " = 0"으로 작성해도 똑같지 않을까 해서 아래와 같이 고치고 컴파일하면 public: UFUNCTION() virtual void Interact() = 0; "해당 클래스를 인스턴스화 할 수 없습니다"라는 에러가 뜨게 된다. 찾아보니 언리얼 오브젝트의 최상위 오브젝트인 UObject는 모..

결과물 Youtube Link : https://www.youtube.com/watch?v=KpPfvmAMPW8 Swing이 되지 않는 위아래로 움직이며 높이가 다른 플랫폼으로 이동하기 위한 Pole을 구현했다. 본 프로젝트에서는 1인칭과 사이드 뷰를 전환해가며 플레이하는 게임인데 해당 기능은 사이드 뷰 모드에서만 동작하게 할 것이다. 먼저 Pole 모드 가능 범위 내에서 왼쪽 마우스 버튼 홀딩 시엔 계속 매달려있는 상태여야 하고, W, S 키로 올라가고 내려가는 기능이 있다. 그리고 Pole에서 점프 시, 폴과 반대 방향으로 점프할 수 있다. 폴 방향으로 점프할 순 있으나 폴에 막힐 것이다. 먼저 다른 오브젝트들과 비슷하게 왼쪽 마우스 버튼을 누르면 스피어 트레이스를 메인 캐릭터 캡슐콜라이더 앞에 조사..

결과물 Youtube Link: https://www.youtube.com/watch?v=JjcCQbMbJbo 일반적인 콘솔 게임을 보면 여러 개의 슬롯이 있는 것을 알 수 있다. 게임을 진행하다가도 현재 데이터는 그대로 둔 채 새 게임을 하고 싶은 경우에, 혹은 다른 사람이 플레이하고 싶을 때 다른 슬롯을 사용하기 위함이다. 각각의 슬롯은 독립적으로 게임 데이터를 가지고 있어야 하며, 게임을 로드했을 시 맵 내의 오브젝트들이 데이터를 저장할 때의 상태 그대로 있어야 한다. 이 기능을 현재 프로젝트에 적용하기 위해 구현했다. 일단 멀티 슬롯이다. 이는 Multi-Slot Widget이며, 3칸 하나하나는 각각 Slot 위젯이다. void UMultiSlotWidget::NativeConstruct() {..

+ 2023.08.01 수정 * 본문에서는 Widget의 UI는 블루프린트 내에서 수정했다.아이템에 대한 정보를 UI로 띄우려면 Widget을 사용한다. 먼저 UserWidget c++클래스를 하나 생성한다. 그리고 생성한 c++클래스의 이름에 맞는 블루프린트 클래스를 생성한다. 예를 들어 c++ 클래스 이름을ItemDetailViewWidget으로 생성한 뒤 블루프린트 클래스 생성을 누르고 모든 클래스에서 검색을 해보면 이러한 블루프린트 클래스가 있을 것이다. 이 블루프린트 클래스를 생성하고 Widget 변수와의 상호작용을 테스트하기 위해 텍스트 하나를 만들고 변수로 지정해줬다. (변수로 지정은 굳이 해줄 필요 없다.) 그리고 위에서 만든 텍스트 변수와 이름이 똑같은 변수를 Widget.h파일에도..