UnityのAppleTV対応つまづいたメモ

音が鳴らない

Unity tvos AudioClipとかでググっても情報なし。
散々いろいろやった末にBuild&settingsのPlayer Settings…で、「Prepare iOS for Recording」のチェックを外したら鳴った。
Build_Settings_と_opening_unity_-_FPSTV_-_Apple_TV__Personal___OpenGL_4_1_
iOS版で、EveryPlayを導入したときにチェックが入っていたやつみたいで、EveryPlay対応してないんやろーと思って消したけどこの設定は残ったままだった。融通効かないUnityちゃん…。

uGUIをSiri Remoteに対応させる

http://forum.unity3d.com/threads/official-unity-for-apple-tv-open-beta.371324/
ここの情報にいろいろと助けられた。
[Edit]-[Project Settings]-[Input]で右側に出てくるinspectorの中で、Submitという項目があって、Positive Buttonがreturnキーになっているやつを見つける。
これの「Alt Positive Button」ってつやつを「joystick button 14」に変えるとSiri Remoteのタッチパッドを押し込んだときに反応するらしい。まずはそれを設定。
opening_unity_-_FPSTV_-_Apple_TV__Personal___OpenGL_4_1_

uGuiのCanvasだけど、「Canvas Scaler」の「Reference Resolution」を640×1136で作っていた、縦画面。
これを960×540にしてみてそれぞれのUIの配置をいぢってみた。
「Game」の画面のアスペクトは16:9にして、こんな感じに配置。
platform_unity_-_FPSTV_-_Apple_TV__Personal___OpenGL_4_1_

そんで、ゲームオーバーになったら[リトライ][Rate(App Storeに飛べないので結局無くす予定)][Game Center(Leader Board)]とボタンを
gameOverRetry.gameObject.SetActive(true);
gameOverRate.gameObject.SetActive(true);
gameOverRanking.gameObject.SetActive(true);
みたいに表示しているのだけど、Siri Remoteではじめからどれかボタンが選択されている状態にするため、
gameOverRetry.GetComponent().Select();
というのを追加。ButtonがImageなので、選ばれていてもまったく変わらないし、しゃーないのでこうする。
platform_unity_-_FPSTV_-_Apple_TV__Personal___OpenGL_4_1_ 2
ButtonのUIを選んで、inspectorの「Button(Script)」のTransitionを「Color Tint」のまま、選ばれているときの「Highlighted Color」を”FF8080FF”にした。Rを全開で、GとBを半分ずつ。こうすると選ばれているやつが赤っぽくなる。汚らしいけど。時間があればTransitionを「Sprite Swap」なんかにして選ばれてる時用のボタン画像とかにすり替えたりしたい。Animationもあるのだけど、Button自体にAnimatorを付けていたらWarningが出まくって、ButtonにImageぶら下げて、そこにAnimator付けてた。
Unity5からか、
Parameter ‘Normal’ does not exist.
Parameter ‘Pressed’ does not exist.
Parameter ‘Highlighted’ does not exist.

みたいに怒られるやつの対策。
http://forum.unity3d.com/threads/weird-button-warning.298673/

で、それぞれのボタンのTint ColorのHighlightedを設定。これでどれが選ばれてるか強調表示される。

もうひとつ、「Navigation」を「Explicit」にして、Select On Left/Select On Rightで移動する先のボタンをそれぞれ隣接するButtonオブジェクトを流し込む。
これでSiri Remoteを左右にスワイプするとボタンの移動ができるようになった。Automaticもあったけど、ほかにもいろいろUIが同居してたのでいちいち設定することにした。そしたらうまくいった。
なんかでもSiri Remoteでスワイプしたあと、右端とかで指を止めると延々と右が押しっぱなしになるのがなんかすごくイヤンなんだけど、Inputの項目とかで抑制できるのかしらんわからん。

platform_unity_-_FPSTV_-_Apple_TV__Personal___OpenGL_4_1_ 3

もひとつ、http://forum.unity3d.com/threads/official-unity-for-apple-tv-open-beta.371324/に、
EventSystemの設定をしろと。「First Selected」で一番はじめに選ばれてるUIを流し込んでおく。
んだけど、どのUIもはじめ非表示にしてるんで意味なかったから、
gameOverRetry.GetComponent().Select();
をスクリプトに書いたのであった。シーン切り替えして、はじからuGUIが出てるならここの設定だけでオケ。

もうひとつ、「Standalone Input Module」の「Force input module」をチェックしろとあったのだけど、5.3.1f1にそんな設定項目ないんだなこれが。いちおう似たような「Force Module Active」をチェックしてみて、動作したけどForceしたら逆に動かなくなるようなきがするのだけどさっぱりよかんない。やんなくてもいいかもしんない。

Input系をSiri Remoteに対応する

今まではiPhoneで画面タッチされたらRaycastを飛ばして動かしたいオブジェクトにコライダーがぶつかるか見て、ぶつかったらタッチ開始にして、ドラッグとかタッチ終了を見ていた。

if(Input.GetMouseButtonDown(0)) {
Ray ray = Camera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit = new RaycastHit();
if (Physics.Raycast(ray, out hit)){
GameObject obj = hit.collider.gameObject;
if (obj == objCollider) {
OnMouseDown();
}
}
}
if(Input.GetMouseButton(0)){
OnMouseDrag();
}
if(Input.GetMouseButtonUp(0)){
OnMouseUp();
}

Siri Remoteはオブジェクトをタッチするという雰囲気ではないので、Siri Remoteのタッチパッドがタッチされたらタッチ開始、そしてドラッグ、離されたらタッチ終了というイベントを呼ぶ

こんな感じ。

foreach(Touch touch in Input.touches) {

if (touch.phase == TouchPhase.Began) {
OnMouseDown();
}

if (touch.phase == TouchPhase.Moved) {
OnMouseDrag();
}
if (touch.phase == TouchPhase.Ended) {
OnMouseUp();
}

}

それぞれのイベント内では、

float dx = Input.GetAxis ("Horizontal");
float dy = Input.GetAxis ("Vertical");

という感じで、タッチパッドのタッチ位置-1〜dx〜+1、-1〜dy〜+1を取得してやる。

ドラッグしてなんか動かしたいときは、タッチ開始でその位置を起点にして記憶して、

void OnMouseDown() {
screenPosition = Camera.main.WorldToScreenPoint(touchObj.position);
mouse.x = screenPosition.x;
mouse.y = screenPosition.y;
isClicked = true;
}

ドラッグされたら差分を動かす、動かす量はてきとーに100.0倍とかにしてみた。

void OnMouseDrag() {
if (!isClicked) {
return;
}
float dx = Input.GetAxis ("Horizontal");
float dy = Input.GetAxis ("Vertical");

Vector3 dragPos = Camera.main.ScreenToWorldPoint(
new Vector3(mouse.x+(dx*100.0f), mouse.y+(dy*100.0f), screenPosition.z));
touchObj.MovePosition(dragPos);
}

タッチ終了で、移動完了

void OnMouseUp() {
if (!isClicked) {
return;
}
isClicked = false;
}

こまごましたもの

アプリの起動中にホームボタンを押したときにホームに戻らすかをスクリプトで指定しとくみたい。
はじめのシーンのAwake()の中に
UnityEngine.Apple.TV.Remote.allowExitToHome = true;
というのをぶちこんでおいた。

GameCenterの対応で#if UNITY_IPHONEで処理してたのだけれど、これだとAppleTVは呼ばれないような…。

プラットフォーム依存コンパイル
http://docs.unity3d.com/ja/current/Manual/PlatformDependentCompilation.html
のところにUNITY_TVOSとかUNITY_APPLETVが追加されてないので、UNITY_IOSに変えたら呼ばれるんじゃないかなーと試しているところ。

と思ったらあったわ、ドキュメント更新されてないのね、シクシク。

#if UNITY_IOS || UNITY_EDITOR || UNITY_TVOS

というわけで続く。。。

UnityのAppleTV対応つまづいたメモ
トップへ戻る