일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- unreal engine redirection crash
- register component
- UE4
- 리디렉터 크래쉬
- Unreal Engine 5
- unreal engine
- Unreal Engine Error
- staticmesh mobility
- unreal engine skill
- 랜덤 맵 생성
- ue4 Crash
- deltaTime
- UnrealEngine
- Unreal Engine 4
- unity
- redirection crash
- 리디렉션 크래쉬
- 언리얼
- tscriptinterface
- UE
- redirector crash
- skill system
- LittleNightMare
- ue4 error
- Ai
- Random Map Generator
- change textblock color
- UE5
- splinemeshcomponent scale
- 13iew
- Today
- Total
목록unreal engine (15)
Class GameDev* SheepAdult

SplineMeshComponent의 크기를 직접적으로 설정하게 되면 StaticMesh가 의도한 위치에 생성되지 않는다. SetStartScale과 SetEndScale을 각각 설정해 줘야 의도한 대로 생성된다.잘못된 예)USplineMeshComponent* SplineMeshComp = NewObject(OwnerCharacter, USplineMeshComponent::StaticClass());SplineMeshComp->SetWorldScale3D(FVector(3));SplineMeshComp->RegisterComponent(); 옳은 예)USplineMeshComponent* SplineMeshComp = NewObject(OwnerCharacter, USplineMeshComponent..
투척 무기 예상 경로를 그려주는 기능을 구현하면서 SplineMeshComponent를 사용할 일이 생겼다. SplineMeshComponent를 런타임에 생성해 줬기 때문에 NewObject 후 RegisterComponent를 호출한 후 여러 세팅을 해줬다. 하지만 무엇이 문제인지 SplineMeshComponent에 등록한 StaticMesh의 Mobility가 Static 하다는 에러를 뱉었다. 20분 정도 삽질한 결과, 해당 컴포넌트의 모든 세팅을 마친 후 RegisterComponent를 해줘야 하는 문제였다. 해당 함수 구현부를 보고 싶어 ActorComponent.cpp의 해당 함수를 보려 했지만 볼 수 없게 되어 있어서 로직은 확인하지 못했다.. 아래처럼 하면 안되고USplineMeshC..

대부분의 게임엔 게임 플레이 타임이 표시된다. 하지만 컴퓨터마다 접속 시간이 달라 동시에 게임에 입장한다고 하더라도 컴퓨터마다의 속도가 다르기 때문에 GetWorld()->GetTimeSeconds()로 시간을 받아온다면 서버와 클라이언트마다의 시간이 모두 달라 게임에 악영향을 끼칠 수 있다. 그래서 서버 컴퓨터의 시간으로 클라이언트에 맞춰줄 필요가 있다. 그렇다면 서버와 클라이언트 사이의 시간 차를 구하여 클라이언트 컴퓨터에 연산하는 방향으로 일을 처리해야 한다. 과정은 아래와 같다. 먼저 클라이언트의 전송 시각과 서버가 수신 후 전송 시각을 전송한 클라이언트가 이를 수신하면, 수신한 데이터와 수신한 시각을 바탕으로 서버와 클라이언트 사이의 시간차를 구한다. C++코드로 구현을 해보았다. 이는 HUD에..
fps는 컴퓨터의 하드웨어마다 모두 다르기 때문에 deltatime 또한 다르게 계산된다. (참고 - https://sheep-adult.tistory.com/56) 그런데 언리얼 엔진에서 InputAxis 함수는 매 프레임마다 호출이 되지만 deltatime 매개 변수가 없고 Tick 함수와 분리가 되어 있기 때문에 어떤 방식으로 처리되는지 헷갈릴 수 있다(제가 그랬..). 그렇다면 입력 값은 캐릭터의 움직임과 deltatime에 대해서 어떻게 처리될까? 먼저, 만약 사용자가 입력을 하면 InputAxis의 인자로 입력 값이 전달된다. 입력 '축'이므로 음수 값과 양수 값이 존재할 수 있고(일반적으로 일반 input은 프로젝트 세팅의 "입력" 카테고리의 값, Enhanced Input에서는 인풋에 관련..
에디터에서 원하던 대로 작동하던 코드가 패키징을 하거나 에디터에서 독립형 게임으로 실행을 시킬 경우 물체를 움직이거나 게이지를 채운다거나 하는 행동에 속도 차이가 생길 수 있다. 이는 프로그램을 실행하는 하드웨어의 속도가 다르기 때문에 생기는 문제이다. 이러한 문제의 해결법으로는 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를 해주었다. 그런데도 크래쉬가 났다... 좀 더..
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; }

먼저 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); }

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