반응형

 

 

 

 

언리얼에서 위젯을 생성할 때, 마우스나 키보드에 대한 인풋에 대한 처리를 할때 UserWidget에서 각 입력장치마다 인풋 이벤트 함수가 존재하며 오버라이딩이 가능하다.

해당 이벤트들을 생성하면 ReturnNode에 ReturnValue를 반환할 수 있는데, 여기에는 Handled와 Unhandled가 존재한다.

 

 

 

1. (Un)handled

- Handled : 해당 위젯에 인풋 이벤트를 마지막으로 받고 뒤의 위젯에 입력 이벤트를 넘기지 않는다.

- Unhandled : 뒤의 위젯에 인풋 이벤트를 넘긴다.

 

 

 

2. 실험을 위한 위젯 구조

- Main위젯에 하이어라키 구조로 위젯을 추가한 형태와 Add to viewport로 z order를 나눈 두가지 형태로 실험을 해보았다.

- Main 위젯에는 OnMouseButtonDown 이벤트 함수와 LeftMouseButton 인풋 이벤트 노드 2가지를 두었고, Overlay 위젯은 OnMouseButtonDown 이벤트 함수만 사용했다.

 

2-1) Main Widget

 

2-2) Overlay Widget

 

 

 

 

3. Handled 유효 범위

3-1) 하이어라키 구조일때의 (Un)handled 동작 차이

3-1-1) Overlay Widget에 ReturnValue를 Handled로 두면 OverlayWidget의 이벤트함수만 호출이 된다. (MainWidget의 이벤트 함수와 인풋 이벤트 노드 호출 안됨)

3-1-2) OverlayWidget의 ReturnValue를 Unhandled로 두면 MainWidget의 이벤트 함수도 호출된다.

※ MainWidget의 이벤트 함수도 Handled로 두면 인풋 이벤트는 호출되지 않는다.

 

 

3-2) Add to viewport로 배치했을때의 (Un)handled 동작 차이

3-2-1) OverlayWidget에 ReturnValue를 Handled로 두면 OverlayWidget의 이벤트함수만 호출된다.

3-2-2) OverlayWidget의 ReturnValue를 Unhandled로 두면 MainWidget의 인풋 이벤트 노드만 호출된다.

※ 추측으로는 OverlayWidget이 MainWidget을 덮고있어서 이벤트 함수가 호출이 되지 않을거라 생각중이다.

 

 

 

 

 

반응형
반응형

 

 

 

 

언리얼에서 웹브라우저를 적용했는데 영어만 입력되는 현상이 있었다. (한영 전환 키가 먹히지 않음)

그래서 상태표시줄을 확인해보니 IME(Input Method Editor)를 사용하지 않는다는것을 확인할 수 있었다.

 

찾아보니 블루프린트에서 해결할 수 있는 방법은 없고  C++에서 Input Method를 적용해줘야 해결이 되는 문제였다.

 

 

해결방법

1. 웹브라우저 위젯을 상속받는 클래스 생성

- 설명을 위한 클래스이니 클래스명은 "MyWebBrowser"로 설정했다.

 

2. 생성된 CPP파일에 Input Method 작성

2-1) 헤더

#pragma once

#include "CoreMinimal.h"
#include "WebBrowser.h"
#include "MyWebBrowser.generated.h"

UCLASS()
class WEBBROWSERTEST_API UMyWebBrowser : public UWebBrowser
{
	GENERATED_BODY()

public:
	UFUNCTION(BlueprintCallable, Category = "WebBrowser")
	void EnableIME();
};

 

2-2) CPP

#include "MyWebBrowser.h"
#include "SWebBrowser.h"

void UMyWebBrowser::EnableIME()
{
    if (WebBrowserWidget.IsValid())
    {
        ITextInputMethodSystem* const TextInputMethodSystem = FSlateApplication::Get().GetTextInputMethodSystem();
        WebBrowserWidget->BindInputMethodSystem(TextInputMethodSystem);
    }
}

※ WebBrowserWidget은 SWebBrowser 클래스의 변수인데, UWebBrowser를 상속해서 클래스를 생성했으면 해당 클래스에 선언되어있는 멤버 변수이므로 따로 선언해줄 필요가 없다.

 

※ 참조할수 없는 외부형식 에러가 발생하면 종속성 모듈 추가를 해준다. (project.Build.cs)

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "WebBrowser", "UMG" });
PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });

 

 

3. 웹브라우저를 생성할 때, 작성한 'EnableIME' 함수를 호출해준다.

※ BlueprintCallable을 지정했으니 블루프린트해서 호출해도 되고, CPP에서 호출해도 된다.

 

 

 

결과

 

 

 

 

 

 

반응형
반응형

 

 

 

 

※ 로그 출력, 디버깅 포스팅은 아래 링크 확인하기

 

[언리얼] 로그 출력, 디버깅 하기

로그 출력 - 다음과 같이 작성하면 된다. (예시에서 Value는 지역변수) //카테고리, 로깅수준, 형식(인자) UE_LOG(LogTemp, Warning, TEXT("UpDown %f"), Value); 결과 디버깅 하기 - 기존에 켜둔 언리얼 에디터를

srdeveloper.tistory.com

 

 

 

 

로그를 호출한 함수 및 라인넘버 출력하는 매크로

//프로젝트 헤더에 작성하면 된다.
#define CALLINFO (FString(__FUNCTION__) + TEXT("(") + FString::FromInt(__LINE__) + TEXT(")"))
  • __FUNCTION__ : 함수명
  • __LINE__ : 라인 넘버

 

//로그를 출력할 라인에 다음과 같이 입력.
UE_LOG(LogTemp, Warning, TEXT("%s"), *CALLINFO);
  • CALLINFO를 적용하려면 해당 매크로를 가진 헤더를 포함시켜줘야한다.

 

 

결과

- 로그를 입력한 함수와 라인넘버가 Output Log창에 표시된다.

 

 

 

 

UE_LOG를 매크로로 정의하기

//헤더 파일에 입력
#define CALLINFO (FString(__FUNCTION__) + TEXT("(") + FString::FromInt(__LINE__) + TEXT(")"))
#define PRINT_CALLINFO() UE_LOG(LogTemp, Warning, TEXT("%s"), *CALLINFO)

//로그를 출력할 라인에 다음과 같이 입력
PRINT_CALLINFO();

 

 

 

 

인수를 여러개 넘겨받는 로그 매크로 정의하기

//헤더 파일에 입력
#define CALLINFO (FString(__FUNCTION__) + TEXT("(") + FString::FromInt(__LINE__) + TEXT(")"))
#define PRINT_LOG(fmt, ...) UE_LOG(LogTemp, Warning, TEXT("%s %s"), *CALLINFO, *FString::Printf(fmt, ##__VA_ARGS__))

//로그를 출력할 라인에 다음과 같이 입력
PRINT_LOG(TEXT("LogTest : %s"), TEXT("Log project"));
  • ... : 가변 인수

 

 

결과

 

 

 

 

 

카테고리 매크로 정의하기

//헤더 파일에 입력
DECLARE_LOG_CATEGORY_EXTERN(TESTLOG, Log, All);

#define CALLINFO (FString(__FUNCTION__) + TEXT("(") + FString::FromInt(__LINE__) + TEXT(")"))
#define PRINT_CALLINFO() UE_LOG(TESTLOG, Warning, TEXT("%s"), *CALLINFO)

//CPP 파일에 입력
DEFINE_LOG_CATEGORY(TESTLOG);

 

 

 

결과

  • 카테고리가 선언한 문자로 출력된다.

 

 

 

 

 

반응형
반응형

 

 

 

 

NavMesh를 이용해 기능을 구현하던 중, NavMesh가 씬에는 존재하지만 메쉬 데이터가 생성되지 않아서 네비게이션 기능이 동작하지 않음. 찾아본 결과, 프로젝트 세팅에 문제가 있었던걸로 확인.

 

 

 

해결 방법

Project settingsNavigation meshIs world partition enabled를 체크 해제해주면 된다.

 

 

 

 

 

반응형
반응형

 

 

 

 

언리얼 디버깅을 위해 비주얼 스튜디오에서 디버거를 실행하면 '~\UE4.exe' 프로그램을 시작할 수 없습니다. 라는 에러창을 볼 수 있다. 어려운 문제는 아니고 시작 프로젝트만 설정해주면 된다.

 

 

 

 

 

해결방법

1. 비주얼 스튜디오 솔루션 탐색기 창에서 언리얼 프로젝트를 찾는다.

2. 프로젝트를 우클릭 한 뒤 '시작 프로젝트로 설정'을 클릭한다.

3. 다시 디버거 실행하면 정상적으로 언리얼 에디터가 실행되는 것을 확인할 수 있다.

 

 

 

 

 

반응형

+ Recent posts