언리얼 엔진 소스 4.27.2를 받아다가 컴파일을 할 일이 생겼다.

엔진 소스를 깃허브에서 받고, 맨 먼저 Setup.bat를 한번 실행해줘야 하는 데 다음과 같은 에러가 떴다.

Failed to download 'http://cdn.unrealengine.com/dependencies/2605550-2722e8035d7444a18952cbd04a5c58c7/0104416c142ca7b3174660267c22f049db573bdb': 원격 서버에서 (403) 사용할 수 없음 오류를 반환했습니다. (WebException)

 

Setup.bat를 실행 시 깃허브에 접근해서 필요한 파일을 다운로드하게 되어 있는데, 그새 저장소 경로가 바뀌어서 생기는 문제일 걸로 보인다.

 

해결방법은 Commit.gitdeps.xml 파일을 최신 버전으로 다시 받는 것이다.

https://github.com/EpicGames/UnrealEngine/releases/download/{엔진버전}-release/Commit.gitdeps.xml 

 

위와 같은 경로인데, 지금 내가 필요한 버전은 4.27.2이므로, 다음의 경로에서 파일을 받으면 된다.

https://github.com/EpicGames/UnrealEngine/releases/download/4.27.2-release/Commit.gitdeps.xml

 

 

받은 파일은 다음의 위치에 넣어 주면 된다.

{엔진 소스 폴더}\Engine\Build\Commit.gitdeps.xml

 

 

참고 링크: https://forums.unrealengine.com/t/unable-to-build-4-27-from-source-setup-bat-403-forbidden-error/1156805/9

최근 새로 설치한 팀시티 빌드 에이전트에서 언리얼 엔진 소스를 체크아웃받아 놓은 폴더가 있었는데, 어느 날 확인 해보니 사라져 있었다.

엔진은 리빌드를 하면 너무 오래 걸리기 때문에 수정된 내용만 컴파일되도록 가급적 건드리지 않는 게 좋은데, 이렇게 사라져 버리면 전체 빌드를 하느라 시간이 많이 걸린다. 

원인을 파악해 보니 예전에도 본 것 같은 기능이 있었는데, 팀시티는 여러가지 이유로 체크아웃 폴더를 삭제하고 다시 받도록 할 수 있는데, VCS 설정이 바뀌거나 디스크 용량이 부족해서 삭제를 하는 것은 당연하지만 아무것도 안 했는데 삭제를 하는 것은 기간만료 기능 때문이다. 약 8일 정도 사용을 안 하면 자동으로 삭제를 한다고 한다.

팀시티 문서 링크: https://www.jetbrains.com/help/teamcity/2024.07/build-checkout-directory.html#Checkout+Directory+Expiration

 

Build Checkout Directory | TeamCity On-Premises

 

www.jetbrains.com

 

해당 기능을 끄려면 문서에도 나와 있듯이 두가지 방법 중 하나를 사용하면 된다.

빌드 에이전트 머신으로 들어가서 buildAgent.properties 파일을 찾아서 다음의 속성을 추가한다.

teamcity.agent.build.checkoutDir.expireHours=never

이 방법은 에이전트 머신마다 설정하는 방법이고 해당 에이전트에서 빌드하는 모든 프로젝트에 적용된다.

 

혹은, 팀시티 프로젝트에서 다음의 속성을 추가한다. (이 방법 추천)

system.teamcity.build.checkoutDir.expireHours

이 방법이 더 나은 거 같다. 원하는 프로젝트나 설정에만 적용할 수 있기 때문이다. 물론 전체 적용을 원한다면 Root project에 한 번만 설정하면 된다.

'개발 > 팀시티' 카테고리의 다른 글

팀시티 2018 설치하기  (0) 2019.03.12
팀시티 2018에서 사용할 MySQL 설치하기  (0) 2019.03.12

언리얼 엔진 최신 버전(5.4.2)을 비주얼 스튜디오 최신 버전 (2022)으로 컴파일하려고 하니 다음과 같은 경고가 뜬다.

Visual Studio 2022 compiler version 14.40.33811 is not a preferred version. Please use the latest preferred version 14.38.33130

 

그리고, 이상한 곳에서 컴파일 에러도 뜬다.

...Engine\Source\Runtime\Core\Public\Templates\SharedPointer.h(1092) : error C4702: unreachable code

 

검색을 해 보니, 언리얼 엔진 최신 버전과 비주얼 스튜디오 최신 버전간 호환성 문제가 있다고 한다.

비주얼 스튜디오 인스톨러에서 14.38에 해당되는 툴체인을 설치하면 해결된다.

정확히 뭐가 필요한 지 몰라서 14.38로 검색되는 걸 일단 다 설치해 보니 문제가 해결되었다.

일반적으로 많이 사용하는 Actor나 ActorComponent가 아니라, 간혹 Object를 바로 상속받거나 LocalPlayerSubsystem 같은 클래스를 상속받은 BP 클래스를 만들어서 사용해야 할 때가 있다. 그런데, 그렇게 상속받은 클래스에서 BlueprintFunctionLibrary에 정의된 함수를 호출하려고 하면 잘 안된다. 에디터에서 마우스 오른쪽을 눌러 다른 BP 함수 라이브러리의 함수를 찾아도 아예 보이지가 않는다.

 

정확한 원인은 잘 모르겠지만, BlueprintFunctionLibrary 함수를 호출할 때는 호출하려는 클래스의 GetWorld 함수 접근이 필요한데, Actor나 ActorComponent의 경우 해당 함수가 에디터에서도 접근할 수 있게 노출되어 있지만, UObject나 Subsystem 계통의 클래스들은 그게 안되어 있어서 생긴 문제로 보인다.

 

그래서, BP 클래스를 만들기 전에 부모 클래스를 c++로 만들고, Blueprintable 속성을 넣어주고, GetWorld 함수를 오버라이드하면 해결이 된다.

// MyGameSoundSubsystem.h
UCLASS(Blueprintable)
class MYGAME_API UMyGameSoundSubsystem : public ULocalPlayerSubsystem
{
    GENERATED_BODY()

public:
    virtual UWorld* GetWorld() const override;
//...
};
  
  
// MyGameSoundSubsystem.cpp
UWorld* UMyGameSoundSubsystem::GetWorld() const
{
#if WITH_EDITOR
    if (IsTemplate())
    {
        return nullptr;
    }
#endif

    return Super::GetWorld();
}

가장 간단한 방법은 위의 코드처럼 cpp 함수의 구현부에서 그냥 부모 함수만 호출해도 되긴 하는데, 에디터에서는 뭔가 또 다르게 작동하는 게 있어서 예외처리는 필요하다.

 

항상 위의 코드처럼 작성해야 하는 건 아니고 경우에 따라서는 부모 클래스나 Outer 클래스를 참조해야 할 필요도 있고, WorldContext를 명시적으로 노출해서 사용해야 하는 경우도 있다.

 

코드 출처: https://forums.unrealengine.com/t/can-you-use-a-blueprint-function-library-in-an-object-class/350918/31

 

ps. 일반적으로 Actor나 ActorComponent는 현재 맵(Level)의 월드에 귀속되지만, UObject를 상속받은 클래스 혹은 Subsystem 클래스들은 싱글턴처럼 쓰이는 경우가 많고, 현재 월드가 아닌 다른 월드(엔진 기본 월드?)에 귀속되어 있을 수 있다.

1. 바이오스 설정으로 들어가서 WOL 기능 켜기. (바이오스 제조사마다 메뉴 위치나 이름이 다름)

    Wake up on LAN이라고 명시적으로 나와 있는 제조사도 있지만,

    Powe on by PCIE 같은 이름으로 되어 있는 경우도 있다.

 

2. 장치 관리자의 네트워크 어댑터에서 랜 카드 속성을 연 다음

   고급 탭에서 Wake on Magic Packet 같은 속성이 있으면 활성화.

   전원관리 탭에서 "이 장치를 사용하여 컴퓨터의 대기 모드를 종료할 수 있음" 기능 활성화

   간혹 랜카드 자체 절전 기능 때문에 안 되는 경우가 있으니 확인 필요 (특히 인텔 랜카드)

 

3. 제어판의 전원 버튼 옵션으로 들어가서 "빠른 시작 켜기" 기능을 끄기. (이거 놓치기 쉬움)

 

4. 그리고 컴퓨터 설정은 문제가 없는데, 간혹 스위치 허브의 문제일 때도 있다.

시중에 나와 있는 대부분의 기가비트 스위치 허브는 문제가 없는데, 2.5 Gbps 혹은 10 Gbps를 지원하는 허브 중에 WOL을 제대로 지원하지 않는 경우가 있다. 정확히는 WOL이 필요로 하는 10 Mbps 속도를 지원하지 않는 경우인데, PC에 랜포트가 2개라면 WOL 전용으로 랜선을 따로 연결하거나, (랜카드가 지원하는 경우) 컴퓨터 전원이 꺼졌을 때도 1 Gbps(혹은 그 이상의 랜포트)가 계속 켜져 있도록 하면 된다. (대기 전력은 더 먹음)

'컴퓨터' 카테고리의 다른 글

윈도우 11에서 작업표시줄만 예전으로 되돌리기  (0) 2022.02.12

UGameInstanceSubsystem을 상속받은 c++ 클래스는 싱글턴처럼 하나만 생성되는 게 원칙이다.

UCLASS()
class MYGAME_API UMySubsystem : public UGameInstanceSubsystem
{
	GENERATED_BODY()
	...
};

 

서브 시스템을 가져다 쓸 때는 클래스 타입으로 검색해서 사용한다.

GetGameInstance()->GetSubsystem<UMySubsystem>()

 

그런데, 만약 c++ 클래스를 상속 받은 블루프린트 클래스를 만들어서 그걸 사용하고 싶다면 어떻게 해야 하는지 궁금해졌다. 검색해서 알아낸 방법은 다음과 같다.

 

먼저, c++의 서브시스템을 블루프린트에서 상속 받을 수 있게 Blueprintable 속성을 추가하고, ShouldCreateSubsystem 함수를 오버라이드해서 c++ 클래스의 생성은 막고 블루프린트 클래스만 생성할 수 있게 한다.

// MySubsystem.h
UCLASS(Blueprintable)
class MYGAME_API UMySubsystem : public UGameInstanceSubsystem
{
	GENERATED_BODY()
	
public:
	virtual bool ShouldCreateSubsystem(UObject* Outer) const override;
    ...
};

// MySubsystem.cpp
bool UMySubsystem::ShouldCreateSubsystem(UObject* Outer) const
{
    TArray<UClass*> ChildClasses;
    GetDerivedClasses(GetClass(), ChildClasses, false);
    return (ChildClasses.Num() == 0); // 최종 자식 클래스만 생성
}

 

에디터를 실행해서 MySubsystem을 상속 받는 BP_MySubsystem이라는 블루프린트 클래스를 생성한다.

 

일단 이렇게만 해도 에디터 플레이에서는 잘 작동한다.

 

하지만, 패키징 단계에서 해당 블루프린트 클래스에 대한 참조가 없으면 누락될 수 있으니, GameInstance에서 클래스 참조를 넣어 두자.

UCLASS(BlueprintType, Blueprintable)
class MYGAME_API UMyGameInstance : public UGameInstance
{
	GENERATED_BODY()

public:
	UPROPERTY(EditAnywhere, BlueprintReadOnly) 
	TSubclassOf<UMySubsystem> MySubsystemClass;

변수 선언은 위와 같이 하고, UMyGameInstance를 상속받은 블루프린트 클래스(예: BP_MyGameInstance)에서 MySubsystemClass 변수값에 BP_MySubsystem를 지정해 두도록 하자.

TortoiseSVN에서 잘못된 메시지로 커밋을 했을 때, Log에서 마우스 오른쪽 버튼을 누르면 로그 메시지 편집 기능이 있다.

하지만, 해당 메뉴를 클릭하면 관리자에게 문의하라는 에러가 뜬다.

While handling the 'svn:log' property on '/svn/MyProject/!svn/bln/999':
Repository has not been enabled to accept revision propchanges;
ask the administrator to create a pre-revprop-change hook

 

단발성 수정 방법

다음의 콘솔 명령어를 이용하면 해당 로그의 메시지만 수정할 수 있다.

svn propedit -r {리비전번호} --revprop svn:log {SVN 저장소 URL}

다만, 이 명령어는 관리자 권한이 있는 유저만 사용할 수 있다.

 

항상 허용하는 방법

관리자가 한번 설정하면 이후 모든 유저가 로그 메시지를 편집할 수 있게 허용하는 방법이다.

 

VisualSVN 서버 관리 툴을 연다. 저장소를 선택하고, 마우스 오른쪽 버튼을 눌러 속성창을 연다.

Hooks 탭에서 Pre-revision property change hook을 선택하고 하단의 Edit 버튼을 누른다.

창이 열리면 다음의 내용을 붙여 넣고 저장한다.

@ECHO OFF
:: Set all parameters. Even though most are not used, in case you want to add
:: changes that allow, for example, editing of the author or addition of log messages.
set repository=%1
set revision=%2
set userName=%3
set propertyName=%4
set action=%5

:: Only allow the log message to be changed, but not author, etc.
if /I not "%propertyName%" == "svn:log" goto ERROR_PROPNAME

:: Only allow modification of a log message, not addition or deletion.
if /I not "%action%" == "M" goto ERROR_ACTION

:: Make sure that the new svn:log message is not empty.
set bIsEmpty=true
for /f "tokens=*" %%g in ('find /V ""') do (
set bIsEmpty=false
)
if "%bIsEmpty%" == "true" goto ERROR_EMPTY

goto :eof

:ERROR_EMPTY
echo Empty svn:log messages are not allowed. >&2
goto ERROR_EXIT

:ERROR_PROPNAME
echo Only changes to svn:log messages are allowed. >&2
goto ERROR_EXIT

:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_EXIT
exit /b 1

Hook 스크립트를 입력하고, OK를 눌러 속성창을 닫으면 된다.

 

참고#1: https://stackoverflow.com/questions/304383/how-to-edit-log-message-already-committed-in-subversion

 

How to edit log message already committed in Subversion?

Is there a way to edit the log message of a certain revision in Subversion? I accidentally wrote the wrong filename in my commit message which could be confusing later. I've seen How do I edit an

stackoverflow.com

참고#2: https://stackoverflow.com/questions/197224/what-is-a-pre-revprop-change-hook-in-svn-and-how-do-i-create-it

 

What is a pre-revprop-change hook in SVN, and how do I create it?

I wanted to edit a log comment in the repository browser and received an error message that no pre-revprop-change hook exists for the repository. Besides having a scary name, what is a pre-revprop-...

stackoverflow.com

 

*스포주의*

 

최근에 넷플릭스에서 공개된 '삼체' 드라마를 재미있게 봤습니다. 예전에 소설로도 읽었지만, 내용이 너무 방대하고 복잡해서 이해가 쉽지 않았지만, 드라마는 간략하게 요점만 정리해 놓았기 때문에 대중적으로도 인기를 끌 수 있는 좋은 작품이라는 생각이 들었습니다.

 

그런데, 제 기억으로는 삼체인의 특성과 유사한 외계인이 과거 다른 드라마에서 이미 등장한 적이 있었습니다. 1987년에 방영된 "스타트렉: 넥스트 제너레이션"의 시즌 1, 에피소드 18편입니다. 제목은 "Home Soil"입니다. 스토리는 대략 다음과 같습니다.

 

인간은 어떤 행성을 테라포밍을 하려고 준비 중이었습니다. 해당 행성에는 지적 생명체가 없었기 때문에 바로 진행하려고 했고요. 그런데, 갑자기 드릴 같은 기계가 오작동을 하면서 인간을 공격하는 사건이 벌어졌습니다. 엔터프라이즈호는 이 사건을 조사하려고 이 행성을 방문하게 됩니다. 그들은 사고 현장에서 빛이 나는 이상한 크리스털을 발견하게 되는데, 마치 그 크리스털이 살아 있는 거 같다는 느낌을 받게 됩니다.

자세한 분석을 위해서 그걸 채취해서 엔터프라이즈호로 가져오는데, 엔터프라이즈 호의 컴퓨터가 해킹을 당하는 등 이상한 현상이 벌어집니다. 알고 보니 크리스털 안에는 아주 작은 외계인이 있었는데, 이들은 현미경으로 봐야 보일 정도로 작고, 실리콘이라는 무기질 기반의 생명체였습니다. 일반적으로 생명체는 대부분 유기질인데, 작고 무기질의 생명체라서 미처 발견을 못했던 것이었습니다. 상당한 지능을 갖춘 생명체라는 걸 알게 된 엔터프라이즈호 승무원들은 해당 지적생명체와 소통을 시도하고, 본인들은 지적 생명체가 있는 행성은 테라포밍 하지 않는다고 얘기를 해서, 서로의 오해를 풀게 되었다는 스토리입니다.

 

스타트렉에 나온 이 외계인은 반도체와 비슷한 특성을 가지고 있습니다. 혼자서는 별다른 능력이 없지만, 여럿이 뭉치면 엄청난 지능을 발휘하게 되죠. 삼체인의 특징과 유사합니다. 삼체인들도 그들의 몸으로 컴퓨터를 만들 수 있죠.

드라마 삼체에서는 사람으로 비유를 했는데, 작은 무기질의 삼체인은 반도체의 트랜지스터 같은 역할을 할 수 있다고 보면 될 거 같습니다.

 

"스타트렉: 넥스트 제너레이션"이 방영되기 전인 70~80년대는 현대적인 반도체가 본격적으로 등장하기 시작한 때라서, 당시 SF 드라마 작가들에게도 그런 기술의 발달이 영감을 줘서 반도체 같은 외계인이 스타트렉에도 등장한 걸로 보입니다.

 

그런데 재미있는 사실은, 스타트렉의 해당 에피소드의 시청률은 매우 낮았습니다. 기존의 다른 에피소드와 성격이 많이 달랐기 때문으로 보이는데요. 어떤 평론가는 "오리지널 Star Trek 시리즈와 달리 'Home Soil'은 하드 공상과학소설의 영역을 탐구했다"라고 얘기하기도 했습니다. 즉, 일반인이 이해하기엔 다소 어려운 설정이 아니었나 싶네요.

 

삼체 소설은 스타트렉의 해당 에피소드가 나온 지 20여 년이 지난 후에 나왔습니다. 그러니, 아무래도 스타트렉에 등장한 외계인이 삼체인의 원조 같다는 생각이 드네요. 다만, 스타트렉에서는 여러 여건상 표현하기가 쉽지 않았던 그 외계인을 삼체에서는 다양한 방법으로 잘 묘사하고 있다는 느낌이네요.

 

참고: https://en.wikipedia.org/wiki/Home_Soil

WSL의 우분투에서 앱을 실행하려고 하는데, 이런 에러가 발생한다면

error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

libssl 1.1 라이브러리를 설치해 줘야 한다.

일단 OpenSSL 라이브러리를 모아 둔 경로는 다음과 같다.

 

http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/?C=M;O=D 

 

Index of /ubuntu/pool/main/o/openssl

 

nz2.archive.ubuntu.com

 

윈도 10이나 윈도 11 64비트에서 WSL을 사용 중이라면, 위의 경로에서 libssl 1.1 중에서는 AMD64 버전을 받아야 하는데, 이름과 다운로드 경로는 아래와 같다.

 

libssl1.1_1.1.0g-2ubuntu4_amd64.deb

다운로드 경로: http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb

 

설치 방법은 다음과 같다.

1. 우분투를 실행하고 위의 파일을 다운로드한다. 명령어는 다음과 같다.

wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb

2. 다운로드한 파일을 설치하자. 명령어는 다음과 같다.

sudo dpkg -i libssl1.1_1.1.0g-2ubuntu4_amd64.deb

 

참고 링크: https://stackoverflow.com/questions/72378647/spl-token-error-while-loading-shared-libraries-libssl-so-1-1-cannot-open-shar/73074916#73074916

윈도우즈 운영체제에서는 윈도우 애플리케이션이 정상 작동 중인지 확인하기 위해서, 지속적으로 윈도우 메시지를 해당 애플리케이션으로 보내는데, 만약 일정 시간이 지나도 응답이 없으면, 해당 애플리케이션이 응답이 없으니 (강제로) 종료하겠느냐는 팝업을 띄운다. 그런데, 게임 등의 애플리케이션을 개발하다 보면 로딩해야 될 리소스가 많아서 시간이 오래 걸릴 경우가 있는데, 그렇게 로딩하는 와중에 이 팝업이 뜨면 유저는 해당 애플리케이션에 문제가 있다고 생각하고 강제 종료를 하게 될 수 있다. 해결 방법은 크게 두 가지이다.

 

1. 로딩 처리를 시간이 많이 드는 부분, 특히 파일 로딩을 비동기로 처리해서 메인 스레드에서 윈도우 메시지 처리가 끊기지 않게 하기.

 

2. 응답 없음 처리(고스팅 처리) 기능을 그냥 끄는 방법

 

1번이 바람직한 방법이긴 하지만, 프로그램 구조를 바꿔야 하고, 바꾸는 와중에 버그가 발생하기도 하고, 암튼 좀 어려울 수 있다. 2번 방식은 그냥 다음의 함수를 한번 호출해 주면 된다.

DisableProcessWindowsGhosting();

링크: https://learn.microsoft.com/ko-kr/windows/win32/api/winuser/nf-winuser-disableprocesswindowsghosting

 

DisableProcessWindowsGhosting 함수(winuser.h) - Win32 apps

호출 GUI 프로세스에 대한 창 고스팅 기능을 사용하지 않도록 설정합니다. 창 고스팅은 사용자가 응답하지 않는 애플리케이션의 주 창을 최소화, 이동 또는 닫을 수 있는 Windows 관리자 기능입니

learn.microsoft.com

참고로, 해당 기능을 다시 켜는 함수는 없다.

+ Recent posts