Skip to content

Integrating Everyplay in Unity3D_ja

Makoto Sugano edited this page Jul 14, 2014 · 23 revisions
2014年5月14日以前にダウンロードしたSDKを利用してUnityゲームのインテグレーションを行う場合はこちらのドキュメントを参照ください。

EveryplayをUnityゲームにインテグレートする事は非常に簡単です。このドキュメントでは、インテグレートに必要な作業を説明します。もしまだでしたら、Everyplay SDKをUnityアセットストアからダウンロードしてください。

Everyplayの設定

まず、Everyplayデベロッパーサイトで、アカウントを作成し、ゲームの詳細を登録してください。このプロセスで、client ID、client secretおよびredirect URIを入手する事になります。これらの値をUnityエディタ上のEdit > Everyplay Settingsにおいて入力してください。

また、このEveryplay Settingsパネル上では、Everyplayを稼働させるプラットフォームを選択するする事ができます。ここでの入力作業が終了次第、ゲームでの録画に取りかかる事ができます!

Everyplayで録画する

録画のサポートチェック

ターゲットプラットフォームをEveryplay Settingsにおいて正しく設定したならば、Everyplayは自動的に初期化を行います。Everyplay内部では、初期化は非同期で行われますので、アプリケーションを早いタイミングでロードする際等には、Everyplay.ReadyForRecording eventを利用するのが賢明かと思われます。

Android端末のドライバー、ハードウェアコーデック、GPU、バージョン等は多種多様であり、このサポートを効率よく行うため、Everyplayはオンラインのリモートサーバーから、デバイス用の設定を入手する仕様となっています。

設定の入手に成功するまでは、録画サポートは自動的に無効化されます。設定がサーバーより入手されますと、録画サポートは有効化されるか、またはサポート外という事で、明示的に無効化される事になります。このゲームが次に起動される際には、これらの設定はネットワークのアクセスを介してでは無くキャッシュより再利用される事となります。

現状では、EveryPlay.IsRecordingSupported()メソッドは、ReadyForRecording(true) eventより前に呼ばれると、invalid statusを返しうまく機能しない可能性があります。

このeventですが、ゲームのライフサイクルで、以下の機会に複数回呼ばれる事となります:

  • オリエンテーションの変更(Android/iOS)
  • Activityの変更(Android)
  • UIView/UIViewController activityの変更(iOS)

これらのケースでは、まずeventがfalse値で、その直後にtrue値でトリガーされる事があります。ですから、最初のReadyForRecording eventのみに頼った初期化ロジックは避ける様にしてください。

Android端末の場合、サポート外のシナリオでは、ReadyForRecording(false) eventがトリガーされる事になります。iOS端末ですが、基本的には、iOS 5以上である全てのiOS端末で録画はサポートされています(iOS 5未満の端末ではEveryplayは機能しません)。

例:

public void OnReadyForRecording(bool enabled) {
   if(enabled) {
      // The recording is supported
      myGameObject.SetUpRecording();
   } 
}

void Start() {
  // Other init code
  // ...

  // Register for the Everyplay ReadyForRecording event
  Everyplay.ReadyForRecording += OnReadyForRecording;
}

セッション録画の制御

ゲームプレイの録画はEveryplay.StartRecording()メソッドを呼び出すことで開始し、Everyplay.StopRecording().メソッドで停止できます。録画の一時中断(および再開)、録画中かどうかの確認もできます。現在のデバイスがEveryplayによる録画をサポートしているか検証するためには、Everyplay.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 - true ならデバイスはEveryplayをサポートしていて、 false ならしていない。
IsRecordingSupported() デバイスとiOSのバージョンがその時点の録画機能をサポートしているか確認する。戻り値は、ユーザーがSetDisableSingleCoreDevices(true)を呼び出しているかどうかも反映する。 なし bool - true ならデバイスは録画機能をサポートしていて、 false ならしていない。
SetDisableSingleCoreDevices(bool) シングルコアのデバイスで録画機能を無効にする。ゲームとデバイスによっては、ゲームプレイの録画はCPU・メモリの残リソースに対して重すぎることがある。 bool - true ならシングルコアのデバイスで録画機能を無効にし、 false ならしない。 なし
SetLowMemoryDevice(bool) メモリの少ないデバイスに最適化する。デフォルトでは無効。 bool - true ならそのデバイスで最適化を行い、 falseなら行わない。 なし
SetMaxRecordingMinutesLength(int) 録画する最大時間の設定。 int - 録画する最大時間(分) なし

録画されたビデオを扱う

ゲームプレイセッションが録画できたら、EveryplayのプレハブにEveryplay.ShowSharingModal()メソッドを使って、ユーザーに動画のシェアを促す事が可能となります。Everyplay.LoadThumbnailFromFilePathメソッドを呼び出して録画した動画のサムネイルを表示する事も可能です。以下はメソッドの解説です:

メソッド 内容 パラメータ 戻り値
ShowSharingModal() 直近に録画したプレイセッションをEveryplayで共有するためのモダルを表示する。 なし なし
PlayLastRecording() 直近に録画したプレイセッションのプレイバックまたは編集を開始する。 なし なし
LoadThumbnailFromFilePath(string, ThumbnailLoadReadyDelegate, ThumbnailLoadFailedDelegate) 与えられたファイルパスのTexture2Dオブジェクトにサムネイルを非同期的にロードする。ファイルパスは ThumbnailReadyAtFilePathイベントからアクセスできる(詳しくは"Everyplayからイベントを受け取る")。 string - サムネイルを読み込むためのファイルパス
delegate - ThumbnailLoadReadyDelegate(Texture2D)
delegate - ThumbnailLoadFailedDelegate(string)
なし

Everyplayは常に動画内の無作為なポイントからファイルに基づいたサムネイルを1つ生成します。Everyplayがサムネイルを取得する前にユーザーがTakeThumbnailメソッドをトリガーした場合、無作為なサムネイル生成はキャンセルされます。

ファイルから動画サムネイルをロードする

動画サムネイルをロードするには、Everyplay.LoadThumbnailFromFilePath(string path, ThumbnailLoadReadyDelegate, ThumbnailLoadFailedDelegate)メソッドを使用する必要があります。このメソッドは非同期的に動作し、パスはストリングパラメータとして取得します。またサムネイルがロードされると、2つのデリゲート機能をもたらします。

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.LoadThumbnailFromFilePath(this.thumbnailPath, ThumbnailSuccess, ThumbnailError);
}

ファイルに基づいたサムネイルのサイズは、録画を開始する前にSetThumbnailWidthメソッドで変えることができます。

メソッド 内容 パラメータ 戻り値
SetThumbnailWidth(int) ファイルに基づいたサムネイルの横幅の最大値を設定する int - テクスチャの横幅の最大値 なし

動画サムネイルをテクスチャに変換する

ファイルに基づいたターゲットをサムネイルに使う替わりに、サムネイルをOpenGLテクスチャに直接変換することもできます。テクスチャの使用はパフォーマンスを格段に向上させます。また、録画中にパフォーマンスをほとんど落とさずサムネイルを表示できます。サムネイルをテクスチャに変換している時、Everyplayは自動的にはサムネイルを取得しません。しかし、録画中いつでもTakeThumbnailメソッドを呼び出すことで、サムネイルを要求することができます。画面の向き(縦長と横長)を変更できるゲームでも、メモリ管理にあまり負担をかけないよう、サムネイルは常に横長になります。

メソッド 内容 パラメータ 戻り値
SetThumbnailTargetTextureId(int) サムネイルターゲットのテクスチャを設定する int - OpenGLテクスチャのhandle id なし
SetThumbnailTargetTextureWidth(int) テクスチャの横幅を設定する int - テクスチャの横幅 なし
SetThumbnailTargetTextureHeight(int) ターゲットのテクスチャの高さを設定する int - テクスチャの高さ なし

選択ハイライトしたポイント(あるいは無作為のポイント)から複数のサムネイルを用いて複数のテクスチャへ変換すれば、録画から簡単にアニメーション型サムネイルを生成できます。より容易にするため、Everyplay Unityパッケージにはこの工程を助けるファイルが同梱されています。詳細については次の資料をご覧下さい:

Everyplayサービスとの連携

Everyplay.Show()を呼び出すことで、コード内でEveryplayサービスを開始できます。

メソッド 内容 パラメータ 戻り値
Show() Everyplayサービスを表示する。 なし なし
ShowWithPath(string) Everyplayサービスを特定のパスに表示する。現時点では、パラメータを指定しないデフォルト状態で次のパスをサポート。:
/feed/game - そのゲームの直近のフィードをロードする。
string - パスキー なし

EveryplayのEventsを受け取る

Everyplayでは次のeventsを提供しています。録画プロセス内のキー動作を検知するために、コードはこれらを受け取ることができます。以下をご参照下さい:

Event 要求されるデリゲート 内容
ReadyForRecording ReadyForRecordingDelegate(bool isSupported) The ReadyForRecording event is dispatched when the Everyplay initialisation has been completed and the recording support of the current device has been analysed
RecordingStarted RecordingStartedDelegate() RecordingStarted eventはEveryplayの録画サービスがゲームプレイの録画を開始した時に、受け取り可能なデリゲートに対して配布される。
RecordingStopped RecordingStoppedDelegate() RecordingStopped eventはEveryplayの録画サービスがゲームプレイの録画を停止した時に、受け取り可能なデリゲートに対して配布される。
UploadDidStart UploadDidStartDelegate(int videoId) UploadDidStart eventはアップロードが開始した時に受け取り可能なデリゲートに対して配布される。
UploadDidProgress UploadDidProgressDelegate(int videoId, float progress) UploadDidProgress eventはアップロードプロセス進行中に規定の間隔で受け取り可能なデリゲートに対して配布される。
UploadDidComplete UploadDidCompleteDelegate(int videoId) UploadDidComplete eventはアップロードが完了した時に受け取り可能なデリゲートに対して配布される。
ThumbnailReadyAtFilePath ThumbnailReadyAtFilePathDelegate(string filePath) ThumbnailReadyAtFilePath eventは、Everyplayの録画機能が前のもしくは現在のファイルへ動画サムネイルを生成した時に、受け取り可能なデリゲートに対して配布される。このeventはまだ録画の最中でも配布されるので注意。ゲームセッションの進行中にサムネイルのロードを試みることは非推奨。ファイルパスの用意だけに留めたほうがよい。サムネイルのロードはゲームのパフォーマンス低下を引き起こしかねない。
ThumbnailReadyAtTextureId ThumbnailReadyAtTextureIdDelegate(int textureId, bool portrait) ThumbnailReadyAtTextureId eventは、Everyplayの録画機能が前のもしくは現在の録画で動画サムネイルをテクスチャに変換した時に、受け取り可能なデリゲートに対して配布される。
WasClosed WasClosedDelegate() WasClosed event はEveryplayサービス/動画エディタが閉じられた時に、受け取り可能なデリゲートに配布される。

オブジェクトをdestroyする際にlistenerを取り除くのを忘れないようにしましょう。

Events使用の例:

/* Helper class for handling Everyplay */
public class MyEveryplayHelperClass : MonoBehaviour {
  string thumbnailPath;

  void Awake() {
    /* Get events from Everyplay */
    Everyplay.RecordingStarted += RecordingStartedDelegate;
    Everyplay.RecordingStopped += RecordingStoppedDelegate;
    Everyplay.ThumbnailReadyAtFilePath += ThumbnailReadyAtFilePathDelegate;
  }

  void OnDestroy() {
    /* Remove event receivers */
    if (Everyplay) { // might already be null if app is closing
      Everyplay.ThumbnailReadyAtFilePath -= ThumbnailReadyAtFilePathDelegate;
      Everyplay.RecordingStarted -= RecordingStartedDelegate;
      Everyplay.RecordingStopped -= RecordingStoppedDelegate;
    }
  }

  public void RecordingStartedDelegate() {
    Debug.Log("Recording was started");
    /* The recording is now started, show the red "REC" in the upper hand corner */
    MyGameEngine.ShowRecordingIndicator();
  }

  public void RecordingStoppedDelegate() {
    Debug.Log("Recording ended");
    /* Remove visual indicator from the user */
    MyGameEngine.RemoveRecordingIndicator();
  }

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

メタデータの追加

アップロードした動画にメタデータを追加し、動画に関する補足情報を提供することもできます。達成したスコア、プレイしたレベルなど。メタデータはEverplay.SetMetadata()メソッドを使用して設定します。このメソッドは、録画中または録画後に呼ぶ事ができます(直近のセッションに対し有効です)。

メソッド 内容 パラメータ 戻り値
SetMetadata(string,object) Adds a single metadata item to the video with the given key, and the given value.与えられたキーと値によって動画に1つのメタデータアイテムを追加する。 string - メタデータキー
object - メタデータ値
なし
SetMetadata(Dictionary<string,object> values) 提供されたDictionaryから複数のメタデータ値を追加する。 Dictionary<string,object> - 対応するキーと値を動画に追加する なし

メタデータ追加の例

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

HUDレス録画

  1. HUDゲームオブジェクトに新しいレイヤーを追加し、このレイヤーをEveryplayHudCamera(例)と名付けます。

  2. EveryplayHudCameraレイヤーをメインカメラのculling maskから取り除きます。他にカメラがあれば同様にして下さい

  3. EveryplayHudCameraプレハブを階層のルートにドラッグします(position 0, 0, 0, rotation 0, 0, 0)

  4. 録画したくないゲームオブジェクトに向いたEveryplayHudCameraにレイヤーを設定します

  5. 完了です!^_^

プロジェクトビルドの問題

注意 初めてEveryplayでプロジェクトビルドする際は必ず ファイル > Build Settings > Build and Runを選択することでクリーンなビルドを行って下さい。

注意 Unity version 4.2を使用してAndroidビルドを行う際には、バージョンコントロールサポートを無効化する必要があります。Edit > Project Settings -> Editor から無効化を行ってください。

多くの場合、Everyplayを有効にしたUnity3DプロジェクトのビルドはXcodeプロジェクトで必要とされる設定変更なしでも成功するはずです。しかし、時には手動設定が要求されることもあります。それは次のような場合です:

  • コンピューター上に異なるバージョンのEveryplay SDKがある
  • ご使用のコンピューターでSpotlightが無効になっている

Everyplayが引き起こすビルドプロセスの問題を解決するにはいくつかの方法があります:

  1. ご使用のコンピューターでSpotlightが無効になっているならSpotlightを有効にするのが一番簡単です

  2. コンピューター上に異なるバージョンのEveryplay SDKが存在する場合、.frameworkと.bundleを含む使用したいバージョンのEveryplay SDKディレクトリ内にACTIVE_EVERYPLAY_SDK_DIRという名前の空のファイルを作成します。

  3. Spotlightを持っていない場合と有効にしたくない場合は、.frameworkと.bundleファイルを含むディレクトリを指定した .active_everyplay_sdk_dirという名前のシンボリックリンクを作成します。シンボリックリンクはあなたのホームディレクトリに置いて下さい。シンボリックリンク作成の例:

     ln -sf /home/dev/downloads/everyplay-ios-sdk-1.x/ ~/.active_everyplay_sdk_dir
    
  4. Spotlightやシンボリックリンクに依存せずに、Unity projectディレクトリへEveryplay.frameworkとEveryplay.bundleを追加する方法もあります。Assetsディレクトリの外が最適です。

それでもEveryplay関係のビルドエラーが残るようなら、直接Eメール(support@everyplay.com)で私共に連絡するか、https://github.com/Everyplay/everyplay-ios-sdk/issuesのGithub Issuesをお使い下さい。

ローカライゼーションについて

Everyplay SDKは英語の他、日本語、韓国語、中国語(zh-CN)をサポートしています。これらの言語サポートを行うためには、以下のステップを踏んでください。

  1. Everyplay.unitypackageをインテグレートした後、UnityプロジェクトをiOSプロジェクトとしてエキスポートしてください。

  2. iOSプロジェクトのルートディレクトリにおいて、以下の様に言語サポートディレクトリ及びファイルを作成してください。

     mkdir {en,ja,ko,zh-CN}.lproj
     touch {en,ja,ko,zh-CN}.lproj/Localizable.strings
    
  3. Xcodeにおいて、全てのLocalizable.stringsファイルをプロジェクトに追加してください(プロジェクト上で右クリックし、"Add Files to YOUR_PROJECT"を選択してください)。

もっと読む

Clone this wiki locally