모든 문서(일반 문서, 분류 문서, 파일(이미지, 사운드 등) 문서)는 분류가 달려 있어야 합니다.
--Administrator (토론)
Hub/docs/ios/unity3d/getting started
컴투스위키
Hive | >> | >> |
플랫폼별 환경설정 가이드 Hive Unity3d_iOS 환경설정 |
>> |
하이브 모듈 API 레퍼런스 |
>> |
하이브 기능 활용 가이드 |
목차 |
소개
이 문서는 Unity3D iOS 플랫폼 환경에서의 Hub 2.x 라이브러리 적용을 위한 준비 및 프로젝트 설정에 대해 설명합니다.
프로젝트 설정
Unity3D 프로젝트에 플러그인 적용
Hub 모듈의 C# 인터페이스를 갖고 있는 파일을 Unity3D 프로젝트에 추가합니다.
- 샘플 프로젝트를 참고하여 Unity 프로젝트 내에 아래와 같은 폴더를 만듭니다.
- (Unity프로젝트)/Assets/Plugins/
- (Unity프로젝트)/Assets/Plugins/iOS
- 샘플 프로젝트의 C2SHub2Plugin.cs, C2SHub2PluginiOS.cs 파일을 각각 위 폴더들에 복사합니다.
- ..../Assets/Plugins/C2SHub2Plugin.cs
- ..../Assets/Plugins/iOS/C2SHub2PluginiOS.cs
Unity3D 프로젝트 빌드 방법(최초 빌드시)
Unity3D 프로젝트를 빌드하여 Xcode 프로젝트를 생성합니다.
- Unity > File > Build Settings... 선택하여 Platform으로 iOS를 선택합니다.
- 프로젝트 옵션 중에 Development Build에 체크하고, Build 버튼을 누르고 원하는 경로와 이름을 정합니다.
- 유니티에서 프로젝트 생성이 끝나면 자동으로 Xcode가 실행되고, 샘플 프로젝트가 빌드되는데 프로젝트 환경 설정을 해야하므로 빌드를 취소합니다.
Xcode 빌드 환경 설정
유니티가 생성한 Xcode 프로젝트에 허브 모듈을 적용하기 위한 환경 설정을 합니다.
- 다음 사항을 고려하여 iOS hub 시작하기를 참고하여 환경설정을 합니다.
- 단, Hub 모듈 라이브러리인 C2SHub2 대신 C2SHub2Unity 를 사용합니다.
- Library 배포 저장소 경로 확인
- 단, Hub 모듈 라이브러리인 C2SHub2 대신 C2SHub2Unity 를 사용합니다.
외부 라이브러리 의존성 설정
- HIVE SDK 동작에 필요한 외부 라이브러리들을 자동으로 추가 할 수 있는 External-Dependency-Manager for Unity (구: GooglePlayServiceResolver, 이하 EDM4U) 패키지를 사용하는 것을 권장합니다.
- EDM4U 사용 및 설정 가이드는 Module Dependency Guide 페이지의 내용을 확인해주세요.
AppController.mm 파일 수정
UIApplicationDelegate
//
// AppController.m
//
#include "C2SHub2Unity.h"
// ...
- (void) applicationDidBecomeActive:(UIApplication*)application
{
printf_console("-> applicationDidBecomeActive()\n");
if (_didResignActive)
{
UnityPause(false);
}
_didResignActive = NO;
// added
CS_unity_hubApplicationDidBecomeActive();
}
// added
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
if (CS_unity_hubApplicationOpenURL(url, sourceApplication, annotation))
{
return YES;
}
// 필요에 따라 추가적인 스키마 처리
// 스키마 처리 결과에 따라 YES 또는 NO 반환
}
// 상단의 openurl 함수가 iOS 9.0 이상에서 곧 deprecated 될 예정이라 하단의 함수를 따로 추가해야함. (Available in iOS 9.0 and later)
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
return [self application:app openURL:url sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
}
// ...
// AppController.m
//
#include "C2SHub2Unity.h"
// ...
- (void) applicationDidBecomeActive:(UIApplication*)application
{
printf_console("-> applicationDidBecomeActive()\n");
if (_didResignActive)
{
UnityPause(false);
}
_didResignActive = NO;
// added
CS_unity_hubApplicationDidBecomeActive();
}
// added
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
if (CS_unity_hubApplicationOpenURL(url, sourceApplication, annotation))
{
return YES;
}
// 필요에 따라 추가적인 스키마 처리
// 스키마 처리 결과에 따라 YES 또는 NO 반환
}
// 상단의 openurl 함수가 iOS 9.0 이상에서 곧 deprecated 될 예정이라 하단의 함수를 따로 추가해야함. (Available in iOS 9.0 and later)
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
return [self application:app openURL:url sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
}
// ...
Unity Pause/Resume
허브 웹 다이얼로그 표시 중에는 게임쪽을 pause 하도록 권장하고 있습니다.
UnityViewController에 다음 함수들을 추가하면 게임 화면이 다른 뷰에 가려진 동안에는 게임이 pause 되고, 게임 화면이 다시 나타날 때 resume되도록 할 수 있습니다.
//
// AppController.m
//
@implementation UnityViewController
- (void)viewWillAppear:(BOOL)animated // 뷰가 표시 될 예정(?)일 때 호출 됩니다.
{
[super viewWillAppear:animated];
UnityPause(false); // Resume unity player
}
- (void)viewDidDisappear:(BOOL)animated // 뷰가 사라졌을 때(다른 창에 의해 가려지거나, 해제되는 경우) 호출됩니다.
{
UnityPause(true); // Pause unity player
[super viewDidDisappear:animated];
}
// ...
@end
// AppController.m
//
@implementation UnityViewController
- (void)viewWillAppear:(BOOL)animated // 뷰가 표시 될 예정(?)일 때 호출 됩니다.
{
[super viewWillAppear:animated];
UnityPause(false); // Resume unity player
}
- (void)viewDidDisappear:(BOOL)animated // 뷰가 사라졌을 때(다른 창에 의해 가려지거나, 해제되는 경우) 호출됩니다.
{
UnityPause(true); // Pause unity player
[super viewDidDisappear:animated];
}
// ...
@end
웹뷰 스크롤/터치 인식 문제
주의!Unity 4.0 이상 버전에서는 해당 문제가 수정되어 아래 내용을 적용하실 필요가 없습니다.
Unity 3.5.x를 사용할 경우, UIWebView 스크롤 동작 오류로 인해 터치가 인식되지 않는 문제가 있습니다. 이를 수정하기 위하여 AppController.mm 파일의 다음 부분을 수정해줍니다.
- (void) RepaintDisplayLink
{
#if USE_DISPLAY_LINK_IF_AVAILABLE
[_displayLink setPaused: YES];
// remove
//while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, kInputProcessingTime, TRUE) == kCFRunLoopRunHandledSource)
// ;
// ++ added
static const CFStringRef kTrackingRunLoopMode = CFStringRef(UITrackingRunLoopMode);
while (CFRunLoopRunInMode(kTrackingRunLoopMode, kInputProcessingTime, TRUE) == kCFRunLoopRunHandledSource)
;
// ++
[_displayLink setPaused: NO];
[self Repaint];
#endif
}
// ...
- (void) prepareRunLoop
{
// ...
// NSDefaultRunLoopMode를 NSRunLoopCommonModes로 변경합니다.
// [_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
// ...
}
{
#if USE_DISPLAY_LINK_IF_AVAILABLE
[_displayLink setPaused: YES];
// remove
//while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, kInputProcessingTime, TRUE) == kCFRunLoopRunHandledSource)
// ;
// ++ added
static const CFStringRef kTrackingRunLoopMode = CFStringRef(UITrackingRunLoopMode);
while (CFRunLoopRunInMode(kTrackingRunLoopMode, kInputProcessingTime, TRUE) == kCFRunLoopRunHandledSource)
;
// ++
[_displayLink setPaused: NO];
[self Repaint];
#endif
}
// ...
- (void) prepareRunLoop
{
// ...
// NSDefaultRunLoopMode를 NSRunLoopCommonModes로 변경합니다.
// [_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
// ...
}
- 관련 글
Unity3D 프로젝트 빌드 방법(Xcode 빌드 환경 설정 이후)
- Unity 4.1 버전 이후부터는 plist 파일을 덮어쓰지 않고 append 하기 때문에 아래 내용을 무시해도 됩니다.
- 유니티에서 최초로 빌드를 한 이후 Build & Run 을 실행하거나 Build 시 같은 경로와 이름으로 빌드를 하여 append 를 하면 Unity3D에 의해 자동 생성되는 파일만 업데이트 되며 환경설정을 다시 해주지 않아도 됩니다.
- 단, Info.plist 파일은 유니티가 새로 생성하기 때문에 Facebook 관련 정보가 있던 Info.plist 파일을 덮어쓰게 됩니다.
- 유니티에서 빌드 시마다 덮어쓰여진 Info.plist 파일을 되돌려야합니다.
- 다음과 그림과 같이 pre-build script 를 사용해서 해결할 수 있습니다 .
Hive | >> | >> |
플랫폼별 환경설정 가이드 Hive Unity3d_iOS 환경설정 |
>> |
하이브 모듈 API 레퍼런스 |
>> |
하이브 기능 활용 가이드 |