Skip to content

Everyplay integration to Unity3d game_ko

FGAGM edited this page Feb 6, 2014 · 3 revisions
<iframe width="853" height="480" src="https://www.youtube.com/embed/79bw5JFo1zg?rel=0" frameborder="0" allowfullscreen></iframe>

Everyplay는 플레이어가 게임 리플레이를 간단히 녹화하고 Everyplay 네트워크 및 기타 소셜네트워크에서 녹화한 비디오를 공유할 수 있게 해주는 도구입니다. 이 문서는 귀사의 Unity3D 게임에 Everyplay 녹화 기능을 통합하는 방법을 설명합니다.

Everyplay를 통합하려면 다음 절차를 완료해야 합니다.

  1. Everyplay Unity3D 패키지를 Unity 프로젝트에 포함하기
  2. Everyplay 패키지에 필요한 정보(귀사 게임의 클라이언트 ID 및 시크릿 등) 설정
  3. Everyplay 패키지에 후크를 추가하여 게임 내의 올바른 위치에서 녹화를 시작하고 정지
  4. 게임으로의 통합 지점을 설계 및 구현하여 사용자가 생성한 비디오를 공유하도록 유도

Everyplay SDK 취득 및 압축 풀기

아직 Everyplay SDK가 없다면 여기에서 다운로드하십시오. 이 패키지에는 다음 세 가지가 포함되어 있습니다.

  • The Everyplay .unitypackage
  • The Everyplay SDK .framework 파일
  • The Everyplay SDK .bundle 파일

마지막 두 파일은 Xcode로 프로세스를 빌드하는 데 필요합니다. 일반적인 환경에서는 이러한 파일이 컴퓨터 내 임의의 위치에 있으면 특별한 문제가 없지만, Everyplay로 Unity3D 프로젝트를 빌드할 수 없을 때는 '프로젝트 빌드 문제' 섹션을 참조하십시오.

Everyplay Unity3D 패키지 포함 및 설정하기

Everyplay 패키지를 사용하려면 먼저 패키지를 프로젝트로 가져와야 합니다. 이것을 완료하려면 다음을 따르십시오.

  1. Unity3D 메뉴에서 'Assets'(에셋) 메뉴를 클릭합니다.
  2. 'Import Package'(패키지 가져오기) > 'Custom package…'(사용자 정의 패키지…) 순으로 선택합니다.
  3. 탐색하여 Everyplay Unity3D 패키지를 찾은 다음, 선택하고 'Open'(열기)를 클릭합니다.
  4. Unity3D 패키지의 내용을 보여주는 'Importing Package'(패키지 가져오기) 대화 상자가 나타납니다. 모든 파일을 선택한 다음 대화 상자의 오른쪽 아래 모서리에 있는 'Import'(가져오기) 단추를 클릭합니다.

패키지 가져오기가 완료되면, 프로젝트에서 Everyplay 프리팹을 사용할 수 있게 됩니다.

장면 계층에 Everyplay 프리팹 추가

프로젝트에 Unity3D의 추가가 완료되면, 프로젝트 창의 Plugins/Everyplay 폴더에서 Everyplay 프리팹을 찾을 수 있습니다.

해당 폴더에서 Everyplay 프리팹을 끌어다 장면 계층의 루트에 놓습니다.

첫 번째 장면 이외에는 프로젝트의 다른 장면에 프리팹을 추가할 필요가 없습니다. Everyplay 프리팹은 프로젝트 내의 사용 가능한 모든 장면에서 자동으로 유지될 것입니다.

Everyplay 프리팹 설정

올바른 장면에 프리팹을 추가한 다음에는 설정해야 합니다. Hierarchy(계층) 창에서 프리팹 이름(Everyplay)을 클릭하여 인스펙터를 불러옵니다. 인스펙터에서는 다음 값을 설정할 수 있습니다.

  • Client Id(클라이언트 ID) - 게임을 등록 시 Everyplay 관리 패널에서 취득한 클라이언트 ID
  • Client Secret(클라이언트 시크릿) - 해당 게임의 클라이언트 시크릿(Everyplay 관리 패널에서 취득 가능)
  • Redirect URI(리다이렉트 URI) - 게임 내부의 Everyplay로 사용자를 인증하는 데 사용하는 OAuth2 리다이렉트 URI 여기에 무엇을 입력해야 할지 불확실하거나 Everyplay의 API 기능을 전혀 사용하지 않을 때는 https://m.everyplay.com/auth에서 입력해도 됩니다.

Everyplay 프리팹의 설정이 완료되면, 이제 코드에서 프리팹을 사용하여 플레이 세션을 녹화할 수 있습니다! 이 작업을 완료하는 방법은 다음 섹션에서 다룹니다.

Everyplay 간이 테스트

프리팹을 올바르게 추가하고 설정한 다음에는 게임 내에서 Everyplay의 간이 테스트를 수행하고 화면 녹화를 가능하게 할 수 있습니다. 이 작업을 완료하려면 프리팹 인스펙터에서 *Everyplay test (script) 섹션을 확인하십시오. 이렇게 하면 게임에 관련 단추가 자동으로 추가되어, Everyplay의 녹화 기능을 시작 및 중단하고 마지막으로 녹화한 비디오를 검토할 수 있습니다.

Everyplay로 게임 플레이 녹화

Everyplay를 올바르게 포함하고 설정한 다음에는 Everyplay.SharedInstance 객체를 사용하여 C# 스크립트에서 녹화 기능에 액세스할 수 있습니다. 비디오 녹화에 대한 모든 제어는 이 객체가 제공하는 메서드를 사용하여 수행하며, 이 메서드는 게임 플레이 세션의 녹화 제어(및 감시), 이전에 녹화한 게임 플레이 세션 표시 및 Everyday 서비스와의 상호작용과 같은 기능을 제공합니다.

또, Everyplay는 코드 내의 특정한 키 동작에 대해 코드가 받을 수 있는 이벤트를 제공합니다.

세션 녹화 제어

게임 플레이 녹화는 Everyplay.SharedInstance.StartRecording() 메서드를 호출하여 시작하며, Everyplay.SharedInstance.EndRecording() 메서드로 중단할 수 있습니다. 녹화를 일시 중지(및 다시 시작)할 수 있으며, 또는 녹화가 진행 중인지 일시 중지 중인지 확인할 수도 있습니다. 현재 장치가 Everyplay 녹화를 지원하는지 확인하려면 Everyplay.SharedInstance.IsSupported()를 사용해야 합니다. 모든 메서드는 아래에 기술되어 있습니다.

메서드 설명 매개 변수 반환값
StartRecording() 게임에서 녹화 과정을 시작합니다. 없음 없음
StopRecording() 현재 진행 중인 세션 녹화를 중단합니다. 없음 없음
PauseRecording() 현재 진행 중인 게임 내 녹화 세션을 일시 중지합니다. 없음 없음
ResumeRecording() 일시 중지한 게임 내 녹화 세션을 다시 시작합니다. 없음 없음
TakeThumbnail() 현재 프레임에서 축소판 그림을 생성합니다. 축소판 그림은 텍스처나 파일로 렌더링할 수 있지만, 녹화 중에만 가능합니다. 없음 없음
IsRecording() Everyplay가 현재 녹화를 진행 중인지 확인합니다. 없음 bool - 현재 세션이 녹화 중이면 true, 그렇지 않으면 false를 반환합니다.
IsPaused() Everyplay에 현재 일시 중지 상태인 녹화 과정이 있는지 확인합니다. 없음 bool - 일시 중지 중인 녹화 세션이 있으면 true, 그렇지 않으면 false를 반환합니다.
IsSupported() 현재 장치/iOS 버전에서 Everyplay를 지원하는지 확인합니다. iOS 4.3 이전 버전에서는 Everyplay를 사용할 수 없으므로, Everyplay의 특정 UI 기능을 감추는 데 이 메서드를 사용할 수 있습니다. 없음 bool - 현재 장치에서 Everyplay를 지원하면 true, 그렇지 않으면 false를 반환합니다.
IsRecordingSupported() 현재 장치/iOS 버전에서 실제 녹화 기능을 지원하는지 확인합니다. 사용자가 SetDisableSingleCoreDevices(true)를 호출했는지도 고려하여 반환값이 결정됩니다. 없음 bool - 현재 장치에서 녹화를 지원하면 true, 그렇지 않으면 false를 반환합니다.
SetDisableSingleCoreDevices(bool) 싱글 코어 장치에서 녹화 기능을 사용할 수 없게 합니다. 게임 및 장치에 따라서 CPU/남은 메모리 자원으로 게임 플레이 녹화를 원활히 수행하기가 어려울 수도 있습니다. bool - 싱글 코어 장치에서 녹화 기능을 사용하지 말아야 할 때는 true, 그렇지 않으면 false를 반환합니다. 없음
SetLowMemoryDevice(bool) 메모리가 낮은 장치를 위해 최적화합니다. 기본적으로는 사용하지 않습니다. bool - 현재 장치에서 최적화를 허용해야 할 때는 true, 그렇지 않으면 false를 반환합니다. 없음

녹화한 세션 처리

게임 플레이 세션의 녹화가 완료되면 Everyplay.SharedInstance.PlayLastRecording() 메서드로 Everyplay 프리팹에 지시하여 사용자를 위해 녹화한 비디오를 재생하게 할 수 있습니다. Everyplay.SharedInstance.LoadThumbnailFromFilePath 메서드를 호출하여, 녹화한 비디오의 축소판 그림을 취득할 수 있습니다. 취득한 축소판 그림은 출력하여 해당 비디오에 관한 정보를 전달하는 데 사용합니다. 메서드는 아래에 기술되어 있습니다.

메서드 설명 매개 변수 반환값
PlayLastRecording() 이전에 녹화한 게임 플레이 세션의 재생을 시작합니다. 없음 없음
ShowSharingModal() 이전에 녹화한 게임 플레이 세션의 Everyplay 공유 모달을 출력합니다. 없음 없음
LoadThumbnailFromFilePath(string, ThumbnailLoadReadyDelegate, ThumbnailLoadFailedDelegate) 일정한 파일 경로에 있는 Texture2D 객체에 축소판 그림을 비동기적으로 불러옵니다. 해당 파일 경로는 ThumbnailReadyAtFilePath 이벤트를 통해 액세스할 수 있습니다(자세한 내용은 'Everyplay에서 이벤트 받기' 참조). string - 축소판 그림을 읽어들여야 하는 파일 경로
delegate - ThumbnailLoadReadyDelegate(Texture2D)
delegate - ThumbnailLoadFailedDelegate(string)
없음

Everyplay는 언제나 비디오의 임의 지점에서 파일 기반의 축소판 그림 하나를 생성합니다. Everyplay가 장면을 캡처하기 전에 TakeThumbnail 메서드를 트리거하면 무작위 캡처가 취소됩니다.

파일에서 비디오 축소판 그림 불러오기

비디오 축소판 그림을 불러오려면 Everyplay.SharedInstance.LoadThumbnailFromFilePath(string path, ThumbnailLoadReadyDelegate, ThumbnailLoadFailedDelegate) 메서드를 사용해야 합니다. 이 메서드는 비동기적으로 동작하며, 축소판 그림을 불러올 때 작동하는 두 개의 델리게이트 함수를 가집니다. 또, 해당 경로를 문자열 매개 변수로 가집니다.

ThumbnailLoadReadyDelegate 함수는 Texture2D 객체를 매개 변수로 가지는데, 이 객체는 비디오에서 생성한 축소판 그림을 제공합니다. 오류가 발생하면 ThumbnailLoadFailedDelegate가 호출되며, 오류 메시지는 문자열로 전달됩니다. 텍스처가 더 이상 필요 없으면 Destroy로 텍스처를 해제해야 합니다.

예:

// 축소판 그림 이벤트에서 취득하는 파일 경로
string thumbnailPath;

/* 이벤트의 델리게이트(이벤트 취득에 관한 섹션 참조) */
public void ThumbnailReadyAtFilePathDelegate(string filePath) {
  this.thumbnailPath = filePath;
}

/* 델리게이트 메서드 정의 */
// 성공 델리게이트
public void ThumbnailSuccess(Texture2D texture) {
  // 비디오 축소판 그림 취득 성공. 이제 사용자에게 표시
}

// 오류 델리게이트
public void ThumbnailError(string error) {
  // 알 수 없는 오류 발생 시
  Debug.Log("Thumbnail loading failed: " + error);
}

// 게임이 축소판 그림을 불러오고 출력하기 위한 올바른 세션에 있을 때 사용되는 자체 메서드
public void ShowThumbnailToTheUserInTheUI() {
  // 델리게이트를 매개 변수로 사용하여 축소판 그림 불러오기
  Everyplay.SharedInstance.LoadThumbnailFromFilePath(this.thumbnailPath, ThumbnailSuccess, ThumbnailError);
}

녹화를 시작하기 전에 SetThumbnailWidth 메서드로 파일 기반의 축소판 그림 크기를 변경할 수 있습니다.

메서드 설명 매개 변수 반환값
SetThumbnailWidth(int) 파일 기반 축소판 그림의 최대 측면 넓이를 설정합니다. int - 텍스처의 최대 측면 넓이 없음

비디오 축소판 그림을 텍스처로 렌더링

축소판 그림을 위한 파일 기반 타깃을 사용하지 않고 곧바로 축소판 그림을 OpenGL 텍스처로 렌더링할 수 있습니다. 텍스처를 사용하는 것이 성능 면에서 훨씬 좋으며, 이렇게 하면 심지어 녹화 중에도 심각한 성능 저하 없이 축소판 그림을 출력할 수 있습니다. 축소판 그림을 텍스처로 렌더링하면 Everyplay는 자동으로 축소판 그림을 생성하지 않습니다. 하지만 TakeThumbnail 메서드를 호출하여 녹화 중 언제라도 축소판 그림의 생성을 요청할 수 있습니다. 여러 방향(가로 및 세로)를 지원하는 게임의 메모리 관리를 더 쉽게 하기 위해서 축소판 그림은 항상 가로로 렌더링됩니다.

메서드 설명 매개 변수 반환값
SetThumbnailTargetTextureId(int) 축소판 그림 타깃 텍스처를 설정합니다. int - OpenGL 텍스처 핸들 ID 없음
SetThumbnailTargetTextureWidth(int) 타깃 텍스처의 넓이를 설정합니다. int - 텍스처의 넓이 없음
SetThumbnailTargetTextureHeight(int) 타깃 텍스처의 높이를 설정합니다. int - 타깃 텍스처의 높이 없음

녹화한 비디오에서 가장 인상적인 지점을 선택하여(또는 임의의 지점에서) 생성한 축소판 그림들을 복수의 텍스처로 렌더링하여 간단하게 애니메이션 처리된 축소판 그림을 생성할 수 있습니다. Everyplay Unity3D 패키지에는 이 작업을 더 쉽게 수행할 수 있게 해주는 헬퍼 파일 두 개가 포함되어 있습니다. 더 자세한 정보는 다음 문서를 참조하십시오.

Everyplay 서비스와의 상호작용

Everyplay.SharedInstance.Show()를 호출하여 코드에서 Everyplay 서비스를 시작할 수 있습니다.

메서드 설명 매개 변수 반환값
Show() Everyplay 서비스를 보여줍니다. 없음 없음
ShowWithPath(string) Everyplay 서비스를 특정한 경로로 보여줍니다. 현재는 매개 변수가 없는 기본값 이외에 다음 경로를 지원합니다.
/feed/game - 현재 게임의 최신 피드를 불러옵니다.
string - 경로 키 없음

Everyplay에서 이벤트 받기

Everyplay는 녹화 과정 중에 키 동작의 통지를 받기 위해 코드에서 받을 수 있는 다음 이벤트를 제공합니다.

이벤트 필수 델리게이트 설명
RecordingStarted RecordingStartedDelegate() RecordingStarted 이벤트는 Everyplay 녹화 서비스가 게임 플레이의 녹화를 시작할 때 모든 수령 델리게이트로 전달됩니다.
RecordingStopped RecordingStoppedDelegate() RecordingStopped 이벤트는 Everyplay 녹화 서비스가 게임 플레이의 녹화를 중단할 때 모든 수령 델리게이트로 전달됩니다.
UploadDidStart UploadDidStartDelegate(int videoId) UploadDidStart 이벤트는 업로드가 시작될 때 모든 수령 델리게이트로 전달됩니다.
UploadDidProgress UploadDidProgressDelegate(int videoId, float progress) UploadDidProgress 이벤트는 업로드 과정 중에 일정한 간격으로 모든 수령 델리게이트에 전달됩니다.
UploadDidComplete UploadDidCompleteDelegate(int videoId) UploadDidComplete 이벤트는 업로드가 완료될 때 모든 수령 델리게이트로 전달됩니다.
ThumbnailReadyAtFilePath ThumbnailReadyAtFilePathDelegate(string filePath) ThumbnailReadyAtFilePath 이벤트는 Everyplay 녹화가 이전 또는 현재 녹화에서 취득한 비디오 축소판 그림을 파일로 생성할 때 모든 수령 델리게이트로 전달됩니다. 이 이벤트는 녹화가 아직 진행 중일 때 전달될 수 있음을 알아두십시오. 축소판 그림을 불러오면 게임의 성능이 저하될 수 있으므로, 게임 세션이 아직 진행 중일 때는 코드에서 축소판 그림 불러오기를 시도하지 않고 일정한 파일 경로에 보관하도록 하는 것이 좋습니다.
ThumbnailReadyAtTextureId ThumbnailReadyAtTextureIdDelegate(int textureId, bool portrait) ThumbnailReadyAtTextureId 이벤트는 Everyplay 녹화가 이전 또는 현재 녹화에서 취득한 비디오 축소판 그림을 텍스처로 렌더링할 때 모든 수령 델리게이트로 전달됩니다.
WasClosed WasClosedDelegate() WasClosed 이벤트는 Everyply 서비스/비디오 편집기가 닫힐 때 모든 수령 델리게이트로 전달됩니다.

객체가 파괴될 때 리스너를 반드시 제거하십시오.

이벤트 사용 예제:

/* Everyplay 처리를 위한 헬퍼 클래스 */
public class MyEveryplayHelperClass : MonoBehaviour {
  string thumbnailPath;

  void Awake() {
    /* Everyplay에서 이벤트 취득 */
    Everyplay.SharedInstance.RecordingStarted += RecordingStartedDelegate;
    Everyplay.SharedInstance.RecordingStopped += RecordingStoppedDelegate;
    Everyplay.SharedInstance.ThumbnailReadyAtFilePath += ThumbnailReadyAtFilePathDelegate;
  }

  void OnDestroy() {
    /* 이벤트 리시버 제거 */
    if (Everyplay.SharedInstance) { // 앱이 닫힐 때 이미 null일 수 있음
      Everyplay.SharedInstance.ThumbnailReadyAtFilePath -= ThumbnailReadyAtFilePathDelegate;
      Everyplay.SharedInstance.RecordingStarted -= RecordingStartedDelegate;
      Everyplay.SharedInstance.RecordingStopped -= RecordingStoppedDelegate;
    }
  }

  public void RecordingStartedDelegate() {
    Debug.Log("Recording was started");
    /* 이제 녹화가 시작됨. 화면 위쪽 모서리에 붉은색 'REC(녹화)' 단추 출력 */
    MyGameEngine.ShowRecordingIndicator();
  }

  public void RecordingStoppedDelegate() {
    Debug.Log("Recording ended");
    /* 사용자로부터 시각적 표시기 제거 */
    MyGameEngine.RemoveRecordingIndicator();
  }

  public void ThumbnailReadyAtFilePathDelegate(string path) {
    Debug.Log("Thumbnail ready: "   path);
    this.thumbnailPath = path;
  }
}

메타 데이터 추가

업로드한 비디오에 메타데이터를 추가하여 사용자가 달성한 점수, 플레이했던 레벨 등 해당 비디오에 관한 추가 정보를 제공할 수 있습니다. 메타데이터는 Everplay.SharedInstance.SetMetadata() 메서드를 사용하여 설정합니다.

메서드 설명 매개 변수 반환값
SetMetadata(string,object) 일정한 키와 일정한 값으로 비디오에 단일 메타데이터 항목을 추가합니다. string - 메타데이터 키
object - 메타데이터 값
없음
SetMetadata(Dictionary<string,object> values) 제공된 Dictionary(사전)에서 얻은 복수의 메타데이터 값을 추가합니다. Dictionary<string,object> - 해당 비디오에 추가할 메타데이터의 키 값 짝입니다. 없음

메타데이터 추가 예제:

Everyplay.SharedInstance.SetMetadata("level", levelNumber);
Everyplay.SharedInstance.SetMetadata("level_name", levelName);
Everyplay.SharedInstance.SetMetadata("score", score)

HUD 없는 녹화

  1. HUD 게임 객체를 올릴 새 레이어를 추가하고 해당 레이어의 이름을 EveryplayHudCamera(가칭)로 설정합니다.

  1. Main Camera(주 카메라)의 컬링 마스크에서 EveryplayHudCamera 레이어를 제거합니다. 보유 중인 다른 카메라에 대해서도 같은 작업을 수행합니다.

  1. EveryplayHudCamera 프리팹을 계층 루트로 끌어다 놓습니다(position(위치) 0, 0, 0, rotation(회전) 0, 0, 0).

  2. 비디오로 녹화하지 않을 게임 객체에 대해 layer(레이어)를 EveryplayHudCamera로 설정합니다.

  1. 설정이 완료되었습니다!

프로젝트 빌드 문제

참고 처음으로 Everyplay로 프로젝트를 빌드할 때는 File(파일) > Build Settings(빌드 설정) > Build and Run(빌드 및 실행) 순으로 선택하여 반드시 클린 빌드를 수행하십시오.

대체로 Everyplay를 허용하는 Unity3D 프로젝트의 빌드는 Xcode 프로젝트에서 필수적으로 수행해야 하는 설정 변경 없이도 성공합니다. 하지만 다음과 같은 경우에는 일부를 수동으로 설정해야 할 수 있습니다.

  • 컴퓨터에 여러 버전의 Everyplay SDK가 설치되어 있음
  • 컴퓨터에 스포트라이트가 비활성화되어 있음

Everyplay로 인해 발생한 빌드 과정 문제를 수정하기 위한 대안이 몇 가지 있습니다.

  1. 컴퓨터에 스포트라이트가 비활성화되어 있다면 스포트라이트를 사용하도록 하는 것이 가장 간단한 방법입니다.

  2. 컴퓨터에 여러 버전의 Everyplay SDK가 설치되어 있다면, 사용할 Everyplay SDK 버전(.framework 및 .bundle 파일이 포함된 것)의 디렉터리에 ACTIVE_EVERYPLAY_SDK_DIR이라는 이름의 빈 파일을 만들어 두면 됩니다.

  3. 스포트라이트를 가지고 있지 않으며 사용하도록 하고 싶지 않다면, .framework 및 .bundle 파일이 포함된 디렉터리를 지정하는 바로 가기 링크 .active_everyplay_sdk_dir을 만들면 됩니다. 바로 가기 링크는 홈 디렉터리에 있어야 합니다. 바로 가기 링크 생성 예제:

    ln -sf /home/dev/downloads/everyplay-ios-sdk-1.x/ ~/.active_everyplay_sdk_dir
    
  4. 스포트라이트 또는 바로 가기 링크 사용에 의지하는 대신, Unity3D 프로젝트 디렉터리에 Everyplay.framework와 Everyplay.bundle을 추가해도 됩니다. Assets(에셋) 디렉터리 바깥에 두는 것이 가장 좋습니다.

Everyplay 관련 빌드 오류가 계속해서 발생한다면 이메일(support@everyplay.com)로 직접 연결하거나 https://github.com/Everyplay/everyplay-ios-sdk/issues 에서 Github Issues를 이용하십시오. 감사합니다!

더 읽어보기

Clone this wiki locally