콘텐츠로 이동

Unreal Engine 4

Hive SDK를 설치 후 수행하는 작업을 안내합니다.

화면 자동 회전 기능 설정

화면 방향을 양방향(가로와 세로 방향 모두)으로 설정 시, 아래 설정이 필요합니다.

Android

Android 앱 빌드에서 화면 방향을 양방향(가로와 세로 방향 모두)으로 설정 시, 화면 자동 회전 기능이 정상 동작하려면 아래 코드 수정이 필요합니다.

  1. /Engine/Build/Android/Java/src/com/epicgames/ue4/GameActivity.java.template로 이동하세요.
  2. HiveActivity.onConfigurationChaged() API를 추가하세요.
    @Override
    public void onConfigurationChanged(Configuration newConfig)
    {
    HiveActivity.onConfigurationChanged(this, newConfig); // Add
    super.onConfigurationChanged(newConfig);
    
    
    // forward the orientation
    boolean bPortrait = newConfig.orientation == Configuration.ORIENTATION_PORTRAIT;
    nativeOnConfigurationChanged(bPortrait);
    }
    

iOS

iOS에서 양방향 설정 추가 기능이 정상 동작하려면 Unreal Engine IOSAppDelegate.cpp 파일 내 화면 회전 관련 메서드인 application(\_:supportedInterfaceOrientationsFor:)를 구현해야 합니다. 이 메서드 리턴값은 게임에 적용시킬 UIInterfaceOrientationMask값을 반환합니다. 가로 전용 게임은 landscape, 세로 전용 게임은 portrait을 반환하며, 가로와 세로 화면을 동시 지원하는 게임은 landscapeportrait를 모두 반환합니다.

/Engine/Source/Runtime/ApplicationCore/Private/IOS/IOSAppDelegate.cpp에 아래의 코드를 추가하세요.

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
  // TODO: 가로 전용 게임
  return UIInterfaceOrientationMaskLandscape;
  // TODO: 세로 전용 게임
  return UIInterfaceOrientationMaskPortrait;
  // TODO: 가로와 세로 모두 지원하는 게임
  return UIInterfaceOrientationMaskAll;
}

Swift 호환성 설정 (iOS)

iOS 개발 환경에서는 Unreal Engine 4와 Swift 언어 호환을 위해 아래 파일들에서 'Add' 주석으로 표시한 라인 혹은 라인들(Add부터 Add End)을 추가하세요.

Engine/Source/Programs/UnrealBuildTool/ProjectFiles/Xcode/XcodeProject.cs

    {
       Content.Append("\t\t\t\t\"PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]\" = " + IOS_BUNDLE + ";" + ProjectFileGenerator.NewLine);
   }
   // Add
   if (ProjectFile != null)
   {
       Content.Append("\t\t\t\tSWIFT_VERSION = 5.0;" + ProjectFileGenerator.NewLine);
       Content.Append("\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"" + GamePath + "/dummy-Bridging-Header.h\";" + ProjectFileGenerator.NewLine);
   }
   // Add End
}
if (TVOSRunTimeVersion != null)
{
if (XcodeProjectFileGenerator.bGeneratingRunIOSProject)
{
   Content.Append("\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;"+ ProjectFileGenerator.NewLine); // Add
   Content.Append("\t\t\t\tINFOPLIST_FILE = \"" + IOSInfoPlistPath + "\";" + ProjectFileGenerator.NewLine);
   Content.Append("\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"" + IOSEntitlementPath + "\";" + ProjectFileGenerator.NewLine);
}

Content.Append("\t\t\t\t\"INFOPLIST_FILE[sdk=macosx*]\" = \"" + MacInfoPlistPath + "\";" + ProjectFileGenerator.NewLine);
if (IOSRunTimeVersion != null)
{
   Content.Append("\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;"+ ProjectFileGenerator.NewLine); // Add
   Content.Append("\t\t\t\t\"INFOPLIST_FILE[sdk=iphoneos*]\" = \"" + IOSInfoPlistPath + "\";" + ProjectFileGenerator.NewLine);
   Content.Append("\t\t\t\t\"CODE_SIGN_ENTITLEMENTS[sdk=iphoneos*]\" = \"" + IOSEntitlementPath + "\";" + ProjectFileGenerator.NewLine);
}

Engine/Source/Programs/UnrealBuildTool/Platform/IOS/IOSToolChain.cs

    Result += " -Xlinker \\\"" + Path.GetDirectoryName(OutputFile.AbsolutePath) + "\\\"";
}
Result += " -Xlinker -rpath -Xlinker /usr/lib/swift";  // Add
Result += " -dead_strip";
Result += " -m" + GetXcodeMinVersionParam() + "=" + ProjectSettings.RuntimeVersion;
Result += " -Wl";

HIVEAppDelegate 적용 (iOS)

iOS 개발 환경에서 Hive SDK를 사용하기 위해 Swizzling을 이용해 AppDelegate를 수정합니다. 앱 시작시 초기화하는 단계에서 아래 코드를 추가해주세요.

////////////////////////////////////////////////////////////////
// IOSAppDelegate.h 헤더 추가
#if PLATFORM_IOS
#include "Runtime/ApplicationCore/Public/iOS/IOSAppDelegate.h"
#endif
////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////
// AppDelegate 추가코드 본문
#if PLATFORM_IOS
UIApplication * dummyApplication = [UIApplication sharedApplication];

Class clzHIVEAppDelegate = NSClassFromString(@"HIVEAppDelegate");
SEL selApplicationDidFinishLaunchingWithOptions = NSSelectorFromString(@"application:didFinishLaunchingWithOptions:");
if( clzHIVEAppDelegate != nil && [clzHIVEAppDelegate respondsToSelector:selApplicationDidFinishLaunchingWithOptions] ) {
    NSMethodSignature *method = [clzHIVEAppDelegate methodSignatureForSelector:selApplicationDidFinishLaunchingWithOptions];
    if (method != nil) {

        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:method];
        [invocation setSelector:selApplicationDidFinishLaunchingWithOptions];
        [invocation setTarget:clzHIVEAppDelegate];
        [invocation setArgument:(void*)&dummyApplication atIndex:2];
        NSDictionary *localLaunchOptions = [IOSAppDelegate GetDelegate].launchOptions;
        if( localLaunchOptions != nil ) {
            [invocation setArgument:(void*)&localLaunchOptions atIndex:3];
        }
        [invocation invoke];
    }
}
#endif
////////////////////////////////////////////////////////////////

FmallocAnsi 설정 (iOS)

Unreal Engine iOS와 C++ 표준 템플릿 라이브러리 호환을 위해 아래와 같이 FMallocAnsi 설정이 필요합니다. 앱 프로젝트의 {YourProject}.Target.cs파일에 다음 코드를 추가합니다.

public class YourProjectTarget : TargetRules
{
    public YourProjectTarget(TargetInfo Target) : base(Target)
    {  
        // 앱 클라이언트에 대한 ANSI 할당자 강제 실행
        if(Target.Platform == UnrealTargetPlatform.IOS)
        {
            GlobalDefinitions.Add("FORCE_ANSI_ALLOCATOR=1");
        }
    }
}