Repository navigation
Everyplay integration to Unity3d game_ja
Everyplayはプレイヤーがゲームの中で簡単にリプレイを録画し、Everyplayネットワークや他のソーシャルメディアで共有することができるツールです。このドキュメントではあなたのUnity3DゲームにEveryplayの録画機能を組み込む方法を説明します。
Everyplayを組み込むには、次の手順に従って下さい:
- Everyplay Unity3DパッケージをあなたのUnityプロジェクトに追加する
- Everyplayパッケージに必要な情報(ゲームのclient idとclient secretなど)を設定する
- Everyplayパッケージに録画の開始・停止ポジションを正しく設定するフックを追加する
- 録画した動画の共有をユーザーに促すため、組み込みポイントを設計し、ゲームに実装する
注意:EveryplayをインテグレートしたiOSビルドはUnity version 3.5以上で動作しますが、Androidビルドの場合は、Unity version 4.2以上が必要となり、4.3以上を推薦します。
まだ済んでいなかったら、Everyplay SDKのダウンロードを行ってください。目的のプラットフォームによって、違ったファイルを選択する事になります。
Androidプラットフォーム用にビルドする際には、以下から、Everyplay.unitypackageを入手してください:
https://github.com/Everyplay/everyplay-android-sdk
iOSプラットフォーム用にビルドする際には、以下から、Everyplay.unitypackageを入手してください:
https://github.com/Everyplay/everyplay-ios-sdk
また、このレポジトリーから以下のファイルも入手してください:
- Everyplay SDK .framework file
- Everyplay SDK .bundle file
これら2つのファイルはXcodeによるビルドプロセスで必要になります。通常の環境ならこれらのファイルがご使用のコンピューター上のどこかにあれば問題ないはずですが、Everyplayを組み込んだUnity3Dプロジェクトを構築できない場合は"プロジェクトビルドの問題"をご参照下さい。
Everyplayパッケージを使用するには、まずあなたのプロジェクトにパッケージをインポートする必要があります。そのためには、次の手順に従って下さい:
- Unity3Dメニューの中の"アセット"メニューをクリックする
- "パッケージのインポート">"カスタムパッケージ..."を選択する
- ブラウズしてEveryplay Unity3Dパッケージを選択し、"開く"をクリックする
- "パッケージのインポート"というダイアログが現れ、Unityパッケージの内容物が表示される。すべてのファイルが選択されていることを確認し、ダイアログ右下の角にある"インポート"ボタンをクリックする
パッケージのインポートが完了すれば、あなたのプロジェクトにEveryplayのプレハブを使用できるようになります。
Unityパッケージが正常にプロジェクトへ追加されれば、プロジェクトウィンドウ内のプラグイン/EveryplayフォルダにEveryplayのプレハブが現れます。
そのフォルダからプレハブをシーン階層のルートへドラッグします。
このプレハブは、プロジェクトの他のシーンに追加する必要はありません。必要なのは最初のひとつです。Everyplayのプレハブはプロジェクト内の可能なシーンならどこでも自動的に効果を維持します。
プレハブを適切なシーンに追加したら、次は設定が必要です。階層ウィンドウ内のプレハブの名前(Everyplay)をクリックし、インスペクタを起動して下さい。このインスペクタにより、次の値を設定できます:
- Client Id ―ゲームを登録した際にEveryplay Adminから受けとったEveryplayのClient ID
- Client Secret ―同じくEveryplay Adminから受け取ったゲームのClient Secret
- リダイレクトURI ―ゲーム内のEveryplayに対してユーザーを認証するために使用するOAuth2のリダイレクトURI。何を入力するか不確かな場合やEveryplayのAPIフィーチャーを使用しない場合は、https://m.everyplay.com/authと入力して下さい
Everyplayのプレハブの設定が完了し、プレイセッションを録画するコードを使えるようになりました!コードの使い方は次項で説明します。
プレハブを追加し、適切に設定したら、ゲームに組み込んだEveryplayの簡単なテストを行い、録画を有効化できます。そのためには、プレハブインスペクタ内の*Everyplay test (script)*をチェックして下さい。すると自動的にEveryplayによる録画の開始ボタン・停止ボタン・直近の録画をレビューするボタンがゲームに追加されます。
Everyplayを適切に組み込み、設定が完了したら、Everyplay.SharedInstanceオブジェクトを使用することでC#スクリプト内で録画機能にアクセスできるようになります。録画機能の制御はすべて、このオブジェクトが提供するメソッドで行えます。これらのメソッドは次の機能を提供します: ゲームプレイセッションの録画の制御(およびモニタリング)・直近に録画されたゲームプレイセッションの表示・Everyplayサービスとの連携。
またEveryplayは、コード内のあるキー動作に関してコードが受け取れるイベントも提供します。
ゲームプレイの録画はEveryplay.SharedInstance.StartRecording()メソッドを呼び出すことで開始し、Everyplay.SharedInstance.StopRecording().メソッドで停止できます。録画の一時中断(および再開)、録画中かどうかの確認もできます。現在のデバイスが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 - 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.SharedInstance.ShowSharingModal()メソッドを使って、ユーザーに動画のシェアを促す事が可能となります。Everyplay.SharedInstance.LoadThumbnailFromFilePathメソッドを呼び出して録画した動画のサムネイルを表示する事も可能です。以下はメソッドの解説です:
| メソッド | 内容 | パラメータ | 戻り値 |
|---|---|---|---|
| ShowSharingModal() | 直近に録画したプレイセッションをEveryplayで共有するためのモダルを表示する。 | なし | なし |
| PlayLastRecording() | 直近に録画したプレイセッションのプレイバックまたは編集を開始する。 | なし | なし |
| LoadThumbnailFromFilePath(string, ThumbnailLoadReadyDelegate, ThumbnailLoadFailedDelegate) | 与えられたファイルパスのTexture2Dオブジェクトにサムネイルを非同期的にロードする。ファイルパスは ThumbnailReadyAtFilePathイベントからアクセスできる(詳しくは"Everyplayからイベントを受け取る")。 |
string - サムネイルを読み込むためのファイルパス delegate - ThumbnailLoadReadyDelegate(Texture2D) delegate - ThumbnailLoadFailedDelegate(string) |
なし |
Everyplayは常に動画内の無作為なポイントからファイルに基づいたサムネイルを1つ生成します。Everyplayがサムネイルを取得する前にユーザーがTakeThumbnailメソッドをトリガーした場合、無作為なサムネイル生成はキャンセルされます。
動画サムネイルをロードするには、Everyplay.SharedInstance.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.SharedInstance.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.SharedInstance.Show()を呼び出すことで、コード内でEveryplayサービスを開始できます。
| メソッド | 内容 | パラメータ | 戻り値 |
|---|---|---|---|
| Show() | Everyplayサービスを表示する。 | なし | なし |
| ShowWithPath(string) | Everyplayサービスを特定のパスに表示する。現時点では、パラメータを指定しないデフォルト状態で次のパスをサポート。: /feed/game - そのゲームの直近のフィードをロードする。 |
string - パスキー | なし |
Everyplayでは次のeventsを提供しています。録画プロセス内のキー動作を検知するために、コードはこれらを受け取ることができます。以下をご参照下さい:
| Event | 要求されるデリゲート | 内容 |
|---|---|---|
| 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使用の例:
/* Everyplayを取り扱うためのヘルパークラス */
public class MyEveryplayHelperClass :MonoBehaviour {
string thumbnailPath;
void Awake() {
/* Everyplayからeventsを取得 */
Everyplay.SharedInstance.RecordingStarted += RecordingStartedDelegate;
Everyplay.SharedInstance.RecordingStopped += RecordingStoppedDelegate;
Everyplay.SharedInstance.ThumbnailReadyAtFilePath += ThumbnailReadyAtFilePathDelegate;
}
void OnDestroy() {
/* eventの受け取り手を取り除く */
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) | 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.SharedInstance.SetMetadata("level", levelNumber);
Everyplay.SharedInstance.SetMetadata("level_name", levelName);
Everyplay.SharedInstance.SetMetadata("score", score)-
HUDゲームオブジェクトに新しいレイヤーを追加し、例えばこのレイヤーをEveryplayHudCamera(例)と名付けます。
-
EveryplayHudCameraレイヤーをメインカメラのculling maskから取り除きます。他にカメラがあれば同様にして下さい
-
EveryplayHudCameraプレハブを階層のルートにドラッグします(position 0, 0, 0, rotation 0, 0, 0)
-
録画したくないゲームオブジェクトに向いたEveryplayHudCameraにレイヤーを設定します
-
完了です!^_^
注意 初めてEveryplayでプロジェクトビルドする際は必ず ファイル > Build Settings > Build and Runを選択することでクリーンなビルドを行って下さい。
注意 Unity version 4.2を使用してAndroidビルドを行う際には、バージョンコントロールサポートを無効化する必要があります。Edit > Project Settings -> Editor から無効化を行ってください。
多くの場合、Everyplayを有効にしたUnity3DプロジェクトのビルドはXcodeプロジェクトで必要とされる設定変更なしでも成功するはずです。しかし、時には手動設定が要求されることもあります。それは次のような場合です:
- コンピューター上に異なるバージョンのEveryplay SDKがある
- ご使用のコンピューターでSpotlightが無効になっている
Everyplayが引き起こすビルドプロセスの問題を解決するにはいくつかの方法があります:
-
ご使用のコンピューターでSpotlightが無効になっているならSpotlightを有効にするのが一番簡単です
-
コンピューター上に異なるバージョンのEveryplay SDKが存在する場合、.frameworkと.bundleを含む使用したいバージョンのEveryplay SDKディレクトリ内に
ACTIVE_EVERYPLAY_SDK_DIRという名前の空のファイルを作成します。 -
Spotlightを持っていない場合と有効にしたくない場合は、.frameworkと.bundleファイルを含むディレクトリを指定した
.active_everyplay_sdk_dirという名前のシンボリックリンクを作成します。シンボリックリンクはあなたのホームディレクトリに置いて下さい。シンボリックリンク作成の例:ln -sf /home/dev/downloads/everyplay-ios-sdk-1.x/ ~/.active_everyplay_sdk_dir -
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)をサポートしています。これらの言語サポートを行うためには、以下のステップを踏んでください。
-
Everyplay.unitypackageをインテグレートした後、UnityプロジェクトをiOSプロジェクトとしてエキスポートしてください。 -
iOSプロジェクトのルートディレクトリにおいて、以下の様に言語サポートディレクトリ及びファイルを作成してください。
mkdir {en,ja,ko,zh-CN}.lproj touch {en,ja,ko,zh-CN}.lproj/Localizable.strings -
Xcodeにおいて、全てのLocalizable.stringsファイルをプロジェクトに追加してください(プロジェクト上で右クリックし、"Add Files to YOUR_PROJECT"を選択してください)。
- Live FaceCamをUnity3dゲームに組み込む(現在、この機能はiOSでのみサポートされています)







