소프트웨어 kvm 인 Input Director 를 사용하고 있는데 윈도우즈 10 설치 후 slave pc 가 로그인 전에 인식이 안되는 문제가 있었다. 빠른 부팅 모드가 문제를 일으키나 보다.

참고 : https://groups.google.com/forum/#!msg/input-director/Vazvfi1hryg/fYSWqJWVFAAJ

  • '제어판 > 하드웨어 및 소리 > 전원 옵션'에서 '전원 단추 작동 설정' 을 클릭
  • '현재 사용할 수 없는 설정 변경' 클릭
  • '빠른 시작 켜기' 를 체크 해제하니 잘 동작했다.
출처 : https://www.howtogeek.com/243901/the-pros-and-cons-of-windows-10s-fast-startup-mode/


언리얼 기본 옵션은 1파일로 데이터와 설정 파일이 패킹된다. 프로젝트가 커지면 수십 GB가 되기도 한다. 원활한 패치/배포를 위해 파일을 적당히 분리할 필요가 있다.

UE4는 Chunk 를 이용해 패킹 데이터를 분리할 수 있다. 특정 폴더만 분리하고 싶다면 먼저 특정 폴더에 PrimaryAssetLabel 클래스의 데이터 애셋을 생성한다.

애셋 이름은 다른 PrimaryAssetLabel 애셋과 겹치지 않아야 한다.

Chunk ID 를 겹치지 않게 1 이상의 값으로 설정하고 Label Assets in My Directory를 체크한다. Label Assets in My Directory 를 체크하면 애셋이 위치한 폴더 아래 폴더까지 한 Chunk 로 묶인다. 특정 애셋이나 특정 블루프린트 기준으로 묶을 수도 있다.

그리고 패키지 세팅에서 Packaging > Generate Chunks 를 체크한다.

패키징을 하면 해당 폴더의 데이터가 chunk0 pak 파일로 분리된 것을 확인할 수 있다. 설정하지 않은 나머지 파일은 0 파일로 패킹된다.

현재 프로젝트의 chunk 설정을 확인하고 싶으면 개발자 툴 > 애셋 검토 창을 이용하면 된다.

프라이머리 애셋 타입 추가 버튼을 누르면 목록이 아래에 나타난다.

Chunk 는 쿠킹 전에는 보이지 않는다. Windows 용 콘텐츠 쿠킹을 하거나 실제 패키징을 하면 청크 추가 버튼을 눌러 Chunk 목록을 대략적으로 확인할 수 있다. 

만약 갱신되지 않으면 에디터를 재시작하면 제대로 보이기도 한다. 

엔진 : 4.20.3

참고 : http://api.unrealengine.com/KOR/Engine/Basics/AssetsAndPackages/AssetManagement/CookingAndChunking/index.html

윈도우즈 10 에서 플러그인이나 젠킨스 업데이트 후 재기동이 안되는 문제가 있다. 아래 그룹 설정 활성화가 필요하다.

1. gpedit.msc 를 실행해 로컬 그룹 정책 편집기를 엽니다.

2. '로컬 컴퓨터 정책 > 컴퓨터 구성 > 관리 템플릿 > 시스템 > 사용자 프로필 > 사용자 로그오프 시 사용자 레지스트리를 강제로 언로드하지 않음' 을 사용으로 바꿉니다.

출처 : https://issues.jenkins-ci.org/browse/JENKINS-50219

P.S. 윈도우즈 8 이후로는 그룹 정책 편집기가 기본적으로 설치되지 않을 수 있다. 아래 URL 을 참고해서 설치하자.

https://www.technipages.com/windows-install-group-policy-management-console

UE4 : UCLASS - Within

해본 것/팁과 정보 2018.12.18 00:00 posted by 이밋

UCLASS(Within=PlayerController, config=Input, transient)
class ENGINE_API UPlayerInput : public UObject
{
GENERATED_BODY()


UCLASS 에 Within 이라는 키워드가 있다. 이 클래스를 생성, 보유할 수 있는 클래스를 제한하는 지정자다.

void UPlayerInput::FlushPressedKeys()
{
APlayerController* PlayerController = GetOuterAPlayerController();


GetOuterAPlayerController() 함수 구현이 궁금해서 헤더 파일을 다 뒤져봤지만 찾을 수가 없어서 차이점을 검색해보다 발견하게 되었다.

DECLARE_WITHIN(APlayerController)

Within 지정자를 사용하면 자동생성되는 코드에 위와 같은 매크로가 추가된다.

#define DECLARE_WITHIN_INTERNAL( TWithinClass, bCanUseOnCDO ) \
/** The required type of this object's outer ({{ typedef-type }}) */ \
typedef class TWithinClass WithinClass;  \
TWithinClass* GetOuter##TWithinClass() const { return (ensure(bCanUseOnCDO || !HasAnyFlags(RF_ClassDefaultObject)) ? (TWithinClass*)GetOuter() : nullptr); }


#define DECLARE_WITHIN( TWithinClass ) \
DECLARE_WITHIN_INTERNAL( TWithinClass, false )

위와 같은 매크로로 GetOuterAPlayerController 코드가 추가되는 구조였다.

참고 : [UE4]  클래스 및 UCLASS 주요 지정자

애셋이나 모듈 정리하다 보면 특정 클래스를 상속받은 BP 클래스를 찾고 싶을 경우가 있다. BP 클래스의 경우 레퍼런스 뷰어로 찾을 수 있는데 상속받은 부모가 네이티브 클래스일 경우 난감했다.

블루프린트 전체 찾기를 하다보면 검색어 문법이 있을 것 같았다. Content Browser > Advanced Search Syntax 에 따르면 아래와 같은 식으로 ParentClass 를 가진 객체를 검색할 수 있었다.

ParentClass:[ParentClass 이름]

예를 들어 아래와 같이 Actor 클래스를 상속받은 애셋들을 찾고 싶을 때 Type:Actor 라고 치면 안보인다.

ParentClass:Actor 라고 입력해야 보인다.

Detail 정보는 모두 필터로 사용할 수 있는 것 같다. AND, OR 같은 연산자도 지원한다.

지난 번에 애셋 정리할 때 알았으면 더 쉽게 처리할 수 있었을텐데 :)

출처 : https://docs.unrealengine.com/en-us/Editor/Content/Browser/AdvancedSearchSyntax

엔진버전 : 4.20.3

명령창에서 'slmgr /dlv' 입력 후 제품 키 채널 내용을 확인하면 된다.

출처 : http://damoa-nawa.tistory.com/100

// Should we use unity build mode for this module?
bool bModuleUsesUnityBuild = false;
if (Target.bUseUnityBuild || Target.bForceUnityBuild)
{
if (Target.bForceUnityBuild)
{
Log.TraceVerbose("Module '{0}' using unity build mode (bForceUnityBuild enabled for this module)", this.Name);
bModuleUsesUnityBuild = true;
}
else if (Rules.bFasterWithoutUnity)
{
Log.TraceVerbose("Module '{0}' not using unity build mode (bFasterWithoutUnity enabled for this module)", this.Name);
bModuleUsesUnityBuild = false;
}
else if (SourceFilesToBuild.CPPFiles.Count < MinSourceFilesForUnityBuild)
{
Log.TraceVerbose("Module '{0}' not using unity build mode (module with fewer than {1} source files)", this.Name, MinSourceFilesForUnityBuild);
bModuleUsesUnityBuild = false;
}
else
{
Log.TraceVerbose("Module '{0}' using unity build mode", this.Name);
bModuleUsesUnityBuild = true;
}
}
else
{
Log.TraceVerbose("Module '{0}' not using unity build mode", this.Name);
}


특정 모듈이 UnityBuild 가 안걸려서 확인해봤다.

일단 bUseUnityBuild는 기본적으로 켜져(true) 있다.
소스 파일 개수가 32개 넘을 때 UnityBuild가 동작하는데 파일 개수가 50개 인 줄 알았는데 cpp 기준으로는 25개 밖에 안되었다.

그냥 bForceUnityBuild 를 켜서 돌아가도록 했다.

위 로그는 Verbose 이상일 때 보이니 BuildConfiguration.xml 수정이 필요하다.

<?xml version="1.0" encoding="utf-8" ?><Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">

<BuildConfiguration>

<!--<bAllowXGE>false</bAllowXGE>-->

<LogLevel>VeryVerbose</LogLevel>

</BuildConfiguration>

</Configuration>



bUseAdaptiveUnityBuild (Boolean)

Use a heuristic to determine which files are currently being iterated on and exclude them from unity blobs, result in faster incremental compile times. The current implementation uses the read-only flag to distinguish the working set, assuming that files will be made writable by the source control system if they are being modified. This is true for Perforce, but not for Git.

4.19 올리고 나서 작업하는 파일만 Unity Build 에서 빼서 컴파일이 되길래 엔진 기능인 줄 알았는데 마침 그 때 Perforce 로 저장소를 바꿔서 동작하는거였다. -ㅁ-

비싸고 빠른 쓰레기 Perforce 는 encoding 이 달라도 같은 파일으로 인식하는 경우가 있는 것 같다. reconcile 을 해도 modified 로 체크가 되질 않았다. svn 같으면 지우고 update 받으면 되는데 Perforce 는 이게 애매했다.

초기 버전으로 workspace 를 돌리고 그걸 최신화 하는 식으로 비슷하게 처리했다.

  • 일단 문제 폴더를 선택하고 오른쪽 마우스 메뉴에서 Get Revision 을 선택한다.
  • Specifying revision using 을 선택하고 Changelist 에 0 을 입력한다.
  • Get Revision 버튼을 누르면 populate 되었던 처음 버전으로 폴더 내용이 돌아간다.
  • 그 상태에서 Get Latest Revision 을 눌러 최신 버전을 받는다. 
p4 command line 에서는 sync 명령어를 이용하면 된다. :(


aws 아이콘

해본 것/팁과 정보 2018.07.31 00:00 posted by 이밋

aws 로 작업하다보면 아키텍처 다이어그램을 그릴 일이 많은데 gliffy 에서 아이콘을 제공하고 있으나 최신 서비스에 대한 아이콘은 없을 수도 있다.

aws 에 아이콘 리소스를 제공하고 있으니 아래 URL 을 참고하자.

https://aws.amazon.com/ko/architecture/icons/

PowerPoint, Visio, EPS or SVG, 스케치 형식 4가지 종류가 제공된다.