2013年8月30日金曜日

Unity Tips #26 Frustum AABB 衝突

前回に引き続いて Unify Community から Frustum AABB 衝突に関する Tips の翻訳を紹介する:



http://wiki.unity3d.com/index.php/Tip_of_the_day

Aug 2012

Frustum AABB 衝突


Tip #26 - Frustum AABB collisions
Frustum および AABB 衝突判定は次のようなコードで実行できます。
public object[] GetObjects(Vector3 position, float distance, float fov, Vector3 direction)
{
    var results = new List();

    // 全てのゲームオブジェクトを検索
    var objects = UnityEngine.Object.FindObjectsOfType(typeof(GameObject));

    if (this.camera == null)
    {
        this.cameraGameObject = new GameObject();
        this.camera = this.cameraGameObject.AddComponent();
    }

    this.cameraGameObject.transform.position = position;
    this.cameraGameObject.transform.forward = direction;
    this.camera.fov = fov;
    this.camera.far = distance;

    var planes = GeometryUtility.CalculateFrustumPlanes(this.camera);

    foreach (GameObject obj in objects)
    {
        if (obj == this.cameraGameObject)
        {
            continue;
        }

        // Collider がなければ無視する
        if (obj.collider == null)
        {
            continue;
        }

        if (GeometryUtility.TestPlanesAABB(planes, obj.collider.bounds))
        {
            results.Add(obj);
        }
    }

    return results.ToArray();
}
----------

AABB衝突判定でGoogle検索するとこういうサイトで解説してくれてるなぁ~
結果だけでなく過程も見てください:実践的な衝突判定(AABB編)
http://d.hatena.ne.jp/taiyakisun/20120205/1328410006
ん~、Unityの通常の判定で不十分なケースで使えるかな??もうちっと考えてみることにするかぁ~(おい)

Unity Tips #39 RequireComponent 属性

前回に引き続いて Unify Community からRequireComponent 属性に関する Tips の翻訳を紹介する:



http://wiki.unity3d.com/index.php/Tip_of_the_day

Nov 2012

RequireComponent 属性


Tip #39 - RequireComponent attribute


MonoBehavior から継承したクラスの RequireComponent 属性を指定すると Unity は指定されたコンポーネントがすでに存在しなければ、ゲームオブジェクトにスクリプトをアタッチしたタイミングでそのコンポーネントを追加します。
 [RequireComponent(typeof(RigidBody))] public class SomeBehaviorScript : MonoBehaviour { }
----

細かいスクリプトのテクニックを積み重ねていこうぜ!

2013年8月25日日曜日

【開発者必見!!】Amazon「本日限定無料アプリ」伸るか?反るか?


ヒャッホー!!すっかりレッドオーシャンになったスマホアプリ市場。

開発者としては何か販売のヒントが欲しくてたまらないよね~。それで、今回はAmazon「本日限定無料アプリ」ってどーなのっ?!ってことで海外開発者の声を届けてみることにした。

いっとくけど、この海外開発者はタダのシロートではない。2012年度にUnity3Dアセットストア市場で売り上げがトップだったNGUIというソフトウェアの作者で、1000ドル(約80万円)以上を1日で稼ぐ日もあるほどの稼ぎ頭。まあ、一定のマニア開発者の間では有名人ってやつだな。

---------

原文


(自分で開発したリアルタイム侵略ゲームの)Starlink で Amazon アプリストアの 「本日限定無料アプリ」キャンペーンに参加した。キャンペーンに参加する前に自分で調査してたときは、賛否両論飛び交っていることは知ってたけど、賭けてみることにした。結論からいうと、自信を持って結果を共有できる状況になったぜ!



Starlink は数ヶ月前に宣伝を全てやらずにリリースした、一風変わった戦略ゲームであり、ユーザ層はずっと少なかった。キャンペーン前は2500ユーザぐらい居たけど、八割方は海賊版を入手した野郎ども。一日あたりのユーザ数は100ぐらいで、それでもまあ高い方だったね~。売り上げはリリース直後に急落してた。一番良かった日でせいぜい一日65ドル(約6500円)で、平均してみると10ドル(約1000円)ぐらいで涙なしには語れない状況。それでも初めてモバイルゲーム向けにリリースしたんだし、初めてリリースしたゲームの生涯収入が500ドル(約5万円)ぐらいだと考えると、1400ドル(約14万円)は平均より上だったんだよねぇ~。

そこでAmazon アプリストアの 「本日限定無料アプリ」に突入!Amazon から連絡で「やるか?」って聞かれたから「当ったり前だろうがよ!!」って返したよぉ。何回かやりとりしているうちに、キャンペーン日が7月19日の金曜日って確定。(週末に暇な野郎が)ゲームをダウンロードしてくれるのに丁度いいんじゃね?とおもったさ。

キャンペーン当日は10万2000ユーザがゲームをダウンロード。北米のレーティングは5点満点中の3.5、で大半は「理解できねーっ」って文句たれてて、初心者向けの難度にしても難しすぎるってことにしてやがった。面白ぇことに、日本のユーザは5点満点中の4.5で7500件のダウンロード。どうやら英語で書かれたこのゲームを日本人のほうが英語のネイティブスピーカーより理解してもらえたってこと。何てこった!!

キャンペーンの後、2週間待ってみて、iPhoneとか全部のプラットフォームでの売り上げがどうなるか比べることにした。言っとくけど、オイラはこの間に放ったらかしにしてて、「キャンペーン期間だぜ!!」とかしなかったし、動画やら新着ニュースやら何もなし。「は?もしかしておバカ?」と思ったかもしんないけど、オイラにとって Starlinkはずっと実験場。Angry Bird 目指さずに、ひたすら iPhone とか全部のプラットフォームでどうやってマネタイズすりゃいいの?ってとにかく実験あるのみ!!

待ち遠しいだろうから、そろそろキャンペーンの純粋な効果を教えてやるな。7月29日より前のダウンロードはこんな感じ:

Amazon ダウンロード数: 3 ダウンロード / 週
Google ダウンロード数: 5 ダウンロード / 日
iOS ダウンロード数: 1 ダウンロード / 日
日次ユーザ数: 最大 100 ユーザ

2週間後に、大幅に数字は改善:

Amazon ダウンロード数: 34.5 ダウンロード / 日 (8000% 増加)
Google ダウンロード数: 22 ダウンロード / 日 (340% 増加)
iOS ダウンロード数: 10.2 ダウンロード / 日 (920% 増加)
日次ユーザ数: 最大 2041 ユーザ(キャンペーンのぴったり2週間後に2000% 増加

キャンペーンの2週間の収入は1385ドル(約13万8500円)、キャンペーンより前の3ヶ月分を見事に稼いでくれたもんだ。

646ドル(約6万4600円)を Amazon から
464ドル(約4万4600円)を Google から
186ドル(約1万8600円)を iOS から
69ドル(約6900円)を Desura から
20ドル(約2000円)を PayPal から

「で、キャンペーンはやる価値あり?伸るか?反るか?」について結論を語らせてもらうんけど、

「良いに決まってるだろうがよ!」ってこった。ひとつもし開発者のアンタにアドバイスを言わせてもらうなら: Amazon「本日限定無料アプリ」で無料でゲームをダウンロードする野郎どものことは心配すんな!!そんかわりに、後で追随してきてくれるユーザやクチコミを真剣に考えろ!!

まとめると、無料マーケティングも成功することは出来るってことさ。

Amazonさん、とにかく有難う!!
-------

日本人のユーザがレーティング高いの嬉しいけど、もしかして北米市場ってユーザコメントが荒れやすいのかぁ??もっとも海外製アプリに日本語で文句つける度胸ないだけって気もするが。。。

ちなみに、タブクルさんでアプリ紹介があった:
関連リンク
タブクル:価格不明、リアルタイム戦略ゲーム「Starlink」の試用レビュー / Androidアプリ 
この記事を信じるかどうかは自分の判断だろうだけど、どうしても売り上げ伸びないなら、Amazon「本日限定無料アプリ」も手を出してみる価値ありか??

2013年8月24日土曜日

Unity Tips #30 ソーシャル プラットフォーム

前回に引き続いて Unify Community からソーシャルプラットフォームに関する Tips の翻訳を紹介する:



http://wiki.unity3d.com/index.php/Tip_of_the_day

Sep 2012

ソーシャル プラットフォーム

Tip #30 - Social Platforms

Unity は様々なソーシャル プラットフォームをビルトインでサポートするために、Social クラスを使用したカスタム実装が可能です。
----------

iPhone 向けなら Prime31 プラグインが有名だが、自身で一から組むなら選択肢としてはある。どんどんチャレンジしようぜ!

2013年8月18日日曜日

Unity Tips #31 位置情報の認識

前回に引き続いて Unify Community から位置情報の認識に関する Tips の翻訳を紹介する:



http://wiki.unity3d.com/index.php/Tip_of_the_day

Sep 2012

位置情報の認識

Tip #31  Location awareness

Unity で位置情報を緯度、経度、標高といった情報を LocationService クラスで提供します。
-------

いわゆる位置ゲー、Unity 製のゲームでもっと登場を見たいものだぜ!

2013年8月16日金曜日

TNet 1.8.0

TNetバージョンアップ情報です:

http://www.tasharen.com/forum/index.php?topic=2650.0
August 15, 2013, 12:38:26 PM



1.8.0:
- 新規: オブジェクト生成コードを再設計。完全に拡張可能
- 新規: Resourcesフォルダのオブジェクトの文字列名で TNManager.Create の実行となるよう機能追加
- 修正: TNBehaviour の有効化により TNObject が強制的に RFC一覧の再構築するように修正
---------

つねに最新版のTNetを入れておこうぜ!

TNet 1.7.3

TNetバージョンアップ情報です:

http://www.tasharen.com/forum/index.php?topic=2650.0
August 02, 2013, 09:49:58 PM





1.7.3:
- 新規: プレイヤータイムアウトをプレイヤーごとに指定できる機能を新規追加
- 修正: SyncRigidbody がタイムリーでなかった不具合を修正
- 修正: サーバー実行ファイルを修正
-------

TNetも徐々に更新が増えてきたなぁ~

2013年8月12日月曜日

Unity Tips #34 エディタのPlayモード状態を検知

前回に引き続いて Unify Community からエディタのPlayモード状態を検知に関する Tips の翻訳を紹介する:



http://wiki.unity3d.com/index.php/Tip_of_the_day

Oct 2012

エディタのPlayモード状態を検知

Tip #34 - Detect when editor changes play mode state

UnityエディタがPlayモード状態の変更タイミングを知る必要がある場合は、EditorApplication.playmodeStateChanged コールバックをフックすれば良い。
--------

おっ!これは使えるかも。Unityプログラミングそのものをデモに出来そうだなぁ!

Unity Tips #33 スクリプトによるエディタ上でのゲーム再生、ポーズ

前回に引き続いて Unify Community からスクリプトによるエディタ上でのゲーム再生、ポーズに関する Tips の翻訳を紹介する:



http://wiki.unity3d.com/index.php/Tip_of_the_day

Oct 2012

スクリプトによるエディタ上でのゲーム再生、ポーズ

Tip #33 - Play & Pause your game in the editor with scripting

EditorApplication.isPlaying および EditorApplication.isPaused  を使用して Unity エディタ上で好きなタイミングで再生またはポーズのスクリプトによる制御が出来ます。
-----

再生、ポーズの関数があるんだなぁ~。Unity プログラミングそのものをデモに出来そうだけど、誰かすでに作成してるんだろうか?

NGUI 2.6.4

NGUI バージョンアップ情報です:

http://www.tasharen.com/forum/index.php?topic=11.30
August 02, 2013, 09:48:41 PM

2.6.4:
- 新機能: UIStretch に UIAnchor 同様の一回のみ実行するオプション Run Once を機能追加
- 修正: Sticky でない押下の不具合を修正
- 修正: Transform インスペクタのコード記述をやり直した。過去の40%のコードに減らして、かつ複数オブジェクト選択での不具合に対応
- 修正: パネルのインスペクタから Depth Pass オプションを外した。(99.9%のユーザが正しく使用してなかった)
- 修正: いつからか問題のあった UIButtonKeys.startsSelected の不具合を修正
- 修正: UIPopupList がAtlas のピクセルサイズを反映するように修正して、メニュースタイルのポップアップでしく動作するように修正
- 修正: UIPanel を無効化したときにマテリアル参照を維持する不具合を修正
- 修正: その他、軽微な修正
------

NGUI作者も久しぶりのアップデート!ところで新GUIはUnity4.2には搭載されなかったが、いつのリリースなのやら・・・

2013年8月11日日曜日

Unity Tips #35 Unityエディタのドラッグ&ドロップ対応

前回に引き続いて Unify Community からUnityエディタのドラッグ&ドロップ対応に関する Tips の翻訳を紹介する:



http://wiki.unity3d.com/index.php/Tip_of_the_day

Oct 2012

Unityエディタのドラッグ&ドロップ対応

Tip #35 - Unity editor Drag & Drop support

もしエディタスクリプトでドラッグ&ドロップ対応したい場合、DragAndDropクラスのメソッドを使用することが出来ます。
--

使おうとおもったことなかったが、Unityエディタで使えるのは意外だぜ!!

2013年8月2日金曜日

Oculus Rift ドキュメント(非公式翻訳)

このドキュメントは有志により翻訳されたもので、オフィシャルではありません。オリジナルのページはユーザ登録のうえhttps://developer.oculusvr.com/?action=docを参照して下さい。
This document is unofficially translated by users. Please refer to the original document here as a registered user: https://developer.oculusvr.com/?action=doc.
Copyright © 2013 Oculus VR, Inc. All Rights Reserved.


Oculus VR
Oculus Rift Development Kit
Version 1.1


■ Oculus Rift Development Kit

同梱物
- ヘッドセットおよびコントロールボックス
- 3種類のレンズ
- 頭上部ストラップ
- 6フィートHDMIケーブル
- 3フィートUSBケーブル
- 電源ケーブルおよび電源アダプター
- DVI/HDMIアダプター

■ Oculus Rift Development Kit

Oculus Rift Development Kit には Oculus Rift のためのバーチャルリアリティコンテンツを作成し始めるために必要なものが全て含まれてます。
・ヘッドセットおよびコントロールボックス
・電源ケーブルおよび電源アダプター
・DVI/HDMIアダプター
・6フィートHDMIケーブル
・3フィートUSBケーブル
・3種類の視覚レンズ
・頭上部ストラップ

■ 始める前に

ケースの部品を慎重に外して下さい。

もし部品の一部が欠落・損傷している場合は Oculus カスタマーサポートに連絡して下さい。
セットアップに関する詳細およびトラブルシューティングについては次のサイトで確認できます:

Oculus VR, Inc.
support@oculusvr.com

■ ヘッドセットのセットアップ

1. ヘッドセットおよびコントロールボックスをケースから慎重に外して下さい。ヘッドセットの電源ケーブルはコントロールボックスに固定されています。このコードが大きく曲がることは避けてください。

2. ヘッドストラップを調整して快適に頭の周りに合わせて下さい。

3. 頭上部ストラップが含まれてます。もし使用する場合は、ストラップを正面から後ろに向けて巻いて、頭の上で快適な位置となるように調整して下さい。ストラップで好きに長さの調整を行って下さい。

4. 眼鏡を着用をした場合、レンズと画面の距離を調整するためにヘッドセットの左右についているアジャスターをコインで回すことが出来ます。変更後に両側の調整設定が揃っていることを確認して下さい。

注意:ヘッドセットを使用しているときに眼鏡をつけると視界が狭まります。また眼鏡が傷つくおそれもあります。近視の方の場合、同梱されている視覚キャップを使用いただくか、コンタクトレンズを使用することを推奨します。

5. 開発キットには3種類のレンズが含まれています。もっとも高さのあるレンズ(A)は両目2.0または遠視の方向けです。中間の高さのレンズ(B)はやや近視の方向けに設計されています。低い高さのレンズ(C)は強い近視の方向けです。レンズは交換する際、その場にはめて固定する仕組みになっています。もし、Oculus Riftを使用する際に修正用のレンズを着用した場合、高さのあるレンズセットA、を使用して、左右のアジャスターを調整して頭に合わせて下さい。

注意:埃がヘッドセット内に入ることを避けるためレンズ交換の際は下向きにすることを推奨します。

■ Oculus Rift コントロールボックスのセットアップ
1. コントロールボックスの背面には4つの端子があります。それらの端子は:
- HDMI
- DVI
- USB
- 電源

2. ビデオケーブルの片側(DVI または HDMI)を自身のコンピュータに接続して、もう片側をコントロールボックスに接続して下さい。コントロールボックスに接続するビデオ入力は一つのみにするべきです。DVI アダプターはHDMIケーブルと合わせて使用できます。

3. USBケーブルの片側を自身のコンピュータに接続して、もう片側をコントロールボックスに接続して下さい。

4. 電源アダプターをコンセントに差し込んだうえで、コントロールボックスにも接続します。

5. コントロールボックスの上のボタンは、ヘッドセットのディスプレイの明るさおよびコントラストの調整に使用されます。
- 一番左の二つのボタンによりディスプレイのコントラストが調整できます。
- 次に左にある二つのボタンディスプレイの明るさを調整できます。
- 一番右のボタンにより電源を入れたり、切ったりすることができます。

6. 電源ボタンを押して、コントロールボックスおよびヘッドセットの電源を入れます。コントロールボックスの上の青い LED によりデバイスがオン/オフのどちらであるか示します。

Oculus SDK は developer.oculusvr.com で入手できます。


Oculus VR, Inc
Oculus Unity 統合ガイド
SDK バージョン 0.2.3
作者:
Peter Giokaris
日付:
July 1, 2013

1 はじめに


Oculus Unity 3D 統合をご覧いただき有難うございます!


このドキュメントにより Oculus Rift を Unity で立ち上げるためのステップを眺望します。次に統合の詳細をみていき、裏側でどういう処理が行われているのか理解が進みます。

Oculus Rift を Unity 環境に統合するプロセスが楽しく簡単になることを切に願います。

1.1 要件

Oculus SDK ドキュメントの要件を確認して Rift とインタフェースをとれる準備が完了していることを確認して下さい。

Unity Pro 4.0.1 以上がマシンにインストールされていないと Unity デモをビルドできません。

同梱されてるデモシーンにより互換ゲームパッドコントローラ(Windows 上の XBox, Mac 上のHID 互換機)があると動き回ることが容易になるのでひとつは利用可能なものを準備すると便利です。一方で、動作はキーボードで代替可能であるため、必須ではありません。

・Oculus SDK ドキュメントを初めに読んで頂き、同梱されてるデモを先に実行していただくことを推奨します。

1.2 モニターのセットアップ

Unity 上で Oculus Rift がメインディスプレイとして設定されているか確かめる必要があり、最低でもメインディスプレイとして設定されているモニターを複製できているか確認します。

Windows 7 および  8 では 設定は画面を右クリックした際の画面解像度ダイアログの中で見つけることが出来ます。

マルチディスプレイの Mac 上で、システム設定を開いて、ハードウェア / ディスプレイへ遷移して下さい。そこから Arrangement タブを選択したうえで  Mirror Displays のチェックボックスをチェックします。

ディスプレイを複製するとき、解像度を 1280 x 800 にセットすることを推奨します(Oculus Rift の解像度)。オプションとして、二つめのモニタにより Unity エディタをより高解像度の画面で開くことが出来ます。

2 初めの手順

2.1 パッケージのコンテンツ

zip ファイルを好みのディレクトリに展開します。(例えば C:\OculusUnity) 次のファイルを OculusUnityIntegration で見つけることが出来ます。

 ・OculusUnityIntegrationGuide.pdf - この文書。

 ・ReleaseNotes.txt - このファイルには現在と前のリリース情報が含まれています。

 ・OculusUnityIntegration.unitypackage - このパッケージにより Oculus Rift 統合に必要な最小限の必要ファイルを Unity にインストールします。

 ・OculusUnityIntegrationTuscanyDemo.unitypackage - このパッケージは Oculus Rift 統合に必要なファイルを Unity にインストールして、デモシーンおよび全てのデモシーンのアセットとともにインストールします。

2.1.1 Oculus Config Utill

OculusConfigUtil と呼ばれるディレクトリがあります。これには コンフィグのユーティリティが含まれ、任意のユーザの様々な属性(例えば IPD および プレイヤーの視点の高さ)をパーソナライズするのに使用できます。

2 ビルド済みの Unity デモを実行する

図1: Unity エディタ内のTuscany デモのスクリーンショット

事前ビルドされたデモ実行するには、見たいプラットフォームでの適切なデモ Zip ファイルをダウンロードします。

PC では、*demoWin.zip ファイルをダウンロードします。

Mac では、*demoMac.zip ファイルをダウンロードします。

OculusUnityDemoScene.exe (Windows) または OculusUnityDemoScene.app (MacOS) を実行します。もしディスプレイ解像度のダイアログが出来ますプロンプト表示された場合は Play ボタンを押下します。デモはフルスクリーンのモードで起動されます。(注意:モニターを複製している場合、2D ディスプレイ上でステレオイメージ参照できます。)

2.3 制御の種類

2.3.1 キーボードの制御

表 1 でのショートカットを使用して環境上を移動していくつかの Oculus Rift 設定を変更します。

キー名称
使用方法
W または 上矢印
プレイヤーを前方に移動
A または左矢印
プレイヤーを左に移動(Strafe)
S または下矢印
プレイヤーを後ろに移動
D または右矢印
プレイヤーを右に移動(Strafe)
左 Shift
押し続けるとプレイヤーが走る
Q および E
左右にプレイヤーが回転
右 Shift
シーン選択をトグル(上下の矢印でシーンの一覧からスクロール)
Return
シーン選択がオンのとき、現在選択されたシーンをロード
Z
手動の磁気カリブレーションを有効化
X
自動の磁気カリブレーションを有効化
C
マウスカーソルをオン/オフ切替
P
予測(Prediction)モードをオン/オフ切替
B
トラッカーの向きをリセット
スペース
コンフィグ メニューをトグル
, および .
予測(prediction) の値の減算/加算(ミリ秒単位)
[ および ]
垂直方向の視界 (FOV) の減算/加算(角度単位)
- および =
瞳孔間距離 (IPD) の減算/加算(ミリメートル単位)
1 および 2
歪み定数 1 (K1) の減算/加算
3 および 4
歪み定数 2 (K2) の減算/加算
5 および 6
プレイヤーの高さの減算/加算(メートル単位)の減算/加算
7 および 8
プレイヤーの移動速度係数の減算/加算
9 および 0
プレイヤーの回転速度係数の減算/加算
Tab
Tabを押し続けて F3 -F5を押下することで現在のコンフィグのスナップショットを保存
F2
デフォルトのコンフィグにリセット
F3 F4 F5
保存されたコンフィグのスナップショットを再呼出
F6
もし磁気参照の向きがセットされていれば磁気コンパスのオン/オフ切替
F11
全画面表示およびウィンドウ表示のモード切替
Esc
アプリケーションの終了

表1:デモのキーボードマッピング

2.3.2 マウスの制御

マウスを使用することでプレイヤーが左右に回転します。もしカーソルが有効化されていれば、マウスはカーソルが画面外になるまで、プレイヤーを回転させずに、カーソルをトラックします。

2.3.3 ゲームパッドの制御

 ・もしプラットフォームの互換コントローラがある場合、プレイヤーコントローラの動作を制御できます。

 ・左アナログスティックは WASD キーを使用するのと同様にプレイヤーを動作させることが出来ます。

 ・右アナログスティックはプレイヤーを左右に Q および E キーを使用するかのように回転させます。

 ・左のトリガーにより、もっと速く移動するか、シーン上を走ることができます。

 ・スタートボタンにより画面選択をトグルできます。D-パッドの上下を押すことで、利用可能なシーンをスクロールします。A ボタンを押すことで現在選択されたシーンを開始します。

 ・もしシーン選択がトグルされない場合、D-パッドの下を押すことでトラッカーの向きをリセットします。

3 Oculus Unity 統合を使用する

使用いただける Unity パッケージを 二つ用意しました。OculusUnityIntegration は Oculus Rift を統合するプロジェクトにインポートするのに使用する最小限のパッケージです。しかし、Tuscany デモを歩き回っていただき、統合の動作を実感していただくことを推奨します。

次に再生したばかりのデモをビルドします。このために、OculusUnityIntegrationTuscanyDemo の Unity パッケージを新しい Unity プロジェクトにインポートします。

3.1 インストール

Unity をすでに開いている場合、最初に作業を保存します。

新規の空プロジェクトを作成して、Oculus アセットをインポートする先として使用します。標準または Pro 版の Unity アセットパッケージをインポートする必要はまったくなく、Oculus Unity 統合は完全に自己完結しています。

OculusUnityIntegrationTuscanyDemo.unitypackage ファイルをダブルクリックします。これにより空のプロジェクトにアセットをインポートします。インポートのプロセスが完了するのに数分かかるかもしれません。

3.2 Unity 統合で作業をする

project browser タブ(通常は左下の隅)をクリックして、Tuscany/Scenes へ遷移します。VRDemo Tuscany シーンをクリックして現在のシーンとしてロードします。(もし現在のシーンを保存するようにプロンプト表示される場合、Don't save を選択します。)

エディタの上部にある PLAY ボタンを押下します。シーンは開始され Oculus Rift はカメラのビューを制御します。ゲームウィンドウはメインのエディタアプリケーションでタブつきビューとして開始されます。
図2:Tuscany デモ Game タブ

エディタの Game ビューをドラッグして Oculus Rift ディスプレイ上でドロップします。ゲームウィンドウの右上にある最大化ボタン(閉じるボタンの左)をクリックして全画面にします。これによりゲームの再生が全画面となり、その上で Unity エディタを別のモニタで開いたままにします。さらにタスクバーおよびスタートメニューからプロパティ→タスクバーにある「タスクバーを自動的に隠す」 を有効化することを推奨します。


3.2.1 スタンドアローンビルドのためのコンフィグ

次にスタンドアローン全画面のアプリケーションをビルドします。いくつかの設定の変更をすることでデモの忠実さを最大化します。

File - Build Settings をクリックします。Windows ではTarget Platformを Windows にセットして、Architectureを x86 または x86-64にセットします。Mac ではターゲットプラットフォームを Mac OS X にセットします。

Build Settings ポップアップの中で、Player Settings をクリックします。Resolution and Presentation の下で、次のとおりに値をセットします。
図3:Resolution and Presentation オプション

Build Settings ポップアップの中で、Build and Run を押下して、聞かれた場合はビルドのためのロケーションおよび名前を指定します。

正しい OS を使用していれば、ゲームは全画面モードでスタンドアローン アプリケーションとして実行されるはずです。

3.2.2 Quality Settings の設定

映像の再現性はが最初から用意されているデモほど高くないと、気がつくかもしれません。Project Settings を少し変更してシーンの見栄えを改善します。

Edit - Project Settings - Quality に遷移します。メニューの値を次のとおりにセットします。
図4:Oculus デモの Quality settings

最も顕著な Quality settings の値は Anti-aliasing にセットされてます。ステレオ レンダリングに合わせてアンチエイリアシングの大きさを増加させる必要があり、これで水平解像度を 50% 減少させてます。4X (4倍)以上の値が理想的です。

ソフト パーティクルはオフにしますが、これは Deferred Lighting mode でレンダリングしないためです(Forward-Lighting のみ)。

これで再ビルドをすれば画質は最初から用意されているデモと同じレベルのはずです。

4 Unity 統合の詳細

統合の詳細を見ていきます。初めに統合のディレクトリ構造を見ていきます。次にプレハブをみて、いくつかの重要なC# スクリプトを見ていきます。


4.1 ディレクトリ構造

図5:Oculus Unity 統合のディレクトリ構造

4.1.1 OVR

OVR は Oculus Unity 統合の最上位のフォルダです。OVR の配下にある全ては最小限の統合パッケージを新規のプロジェクトにインポートするときに名前に問題ないようにすべきです。(OculusUni-tyIntegration.unitypackage を使用して)


OVR ディレクトリは次のディレクトリ含みます:

Editor: Unity エディタに機能を足すスクリプトや、 C# コンポーネントスクリプトをエンハンスするスクリプトが含まれます。

Materials: 統合の中でグラフィカル コンポーネントで使用されるマテリアルを含み、例えば磁気コンパスやメインの GUI ディスプレイです。

OVRImageEffects: Oculus Rift ディスプレイ内で画像をワープさせるのに必要なスクリプトおよびレンズ補正シェーダが含まれます。

Prefabs: Oculus Rift を Unity シーンにバインドするためのメインのプレハブを含みます:
OVRCameraControler および OVRPlayerController

Resources: いくつかの OVR スクリプトにより必要とされ、インスタンス化されるプレハブ および別のオブジェクト、例えば磁気コンパスのオブジェクトが含まれます。

Scripts: Oculust Rift と Unity コンポーネントを結ぶ C# ファイルが含まれます。これら多くのスクリプトは Prefabs フォルダで連携します。

Shaders: Oculust Rift と Unity コンポーネントを結ぶ C# ファイルが含まれます。これら多くのスクリプトは Prefabs フォルダで連携します。

Textures: いくつかのスクリプトコンポーネントが必要とする画像アセットが含まれます。

4.1.2 Plugins
Plugins ディレクトリには OculusPlugin.dll が含まれます。これにより Windows 上(32 および 64 ビット版)で Oculus Rift が Unity と通信できます。
このフォルダには他のプラットフォーム(すなわち MacOS 向けの OculusPlugin.bundle) が含まれます。

4.1.3 Tuscany
Tuscany にはデモに必要な全ての Tuscany アセットを含みます。

4.2 Prefabs
現在の Oculus Rift の Unity 統合はシーンに追加される二つのプレハブから成り立ってます:

図6:プレハブ: OVRCameraController および OVRPlayerController

シーン上にプレハブをドラッグ&ドロップするのみで使用できます。
同様に Oculus - Prefabs メニューから、これらプレハブをシーンに追加できます。

4.2.1 OVRCameraController
OVRCameraController の目的はシーン内のひとつの Unity カメラのステレオ カメラの代替物の役割です。シーン上に OVRCameraController をドラッグして(忘れずにシーン上の他のカメラを全てオフにして、使用されているカメラが OVRCameraController だけとなるようにします)、シーンを Oculus Rift で表示できるようになります。
 OVRCameraController には 2 つの Unity カメラが含まれていて、それぞれ片方の目に対応しています。旧来のカメラの代替物として、移動オブジェクトアタッチすべきです(例えば歩き回るキャラクター、車、砲台、等)。

二つのスクリプト(コンポーネント)が OVRCameraController プレハブ: OVRCameraController.cs および OVRDevice にアタッチされてます。

図7: プレハブ: OVRCameraController をインスペクタ上で展開

4.2.2 OVRPlayerController
OVRPlayerController はバーチャル環境上でナビゲーションをするための最も基本的な方法です。基本的にシンプルなキャラクターコントローラにアタッチされた OVRCameraController プレハブであり、物理挙動の Capsule、動作ロジック、シンプルなメニューシステム(ステレオ レンダリングされたテキストのフィールドおよびCrosshair(=照準用の十字線) のコンポーネント)から構成されてます。
  使用するためには、プレイヤーコントローラを環境上にドラッグして、ゲームパッドおよび/またはキーボードおよびマウスを使用して動きまわることが出来るようになります(環境上にコリジョンを忘れずに配置して下さい)。

4 つのスクリプト(コンポーネント)が OVRPlayerController プレハブにアタッチされてます: OVRPlayerController.cs, OVRGamepadController.cs, OVRMainMenu.cs および OVRCrosshair.cs

注意: OVRMainMenu.cs および OVRCrosshair.cs はヘルパークラスであり、OVRPlayerController が動作するうえで必須ではありません。これらは粗いメニューと画面上の 照準カーソルを画面上に表示するために利用可能です。

図8 : プレハブ: OVRPlayerController をインスペクタ上で展開

4.3 C# スクリプト
次のセクションにより Scripts フォルダの各々のスクリプトに関する一般的な概要を確認できます。

4.3.1 OVRDevice
OVRDevice は Oculus Rift ハードウェアに対する基本的なインタフェースです。全てのエクスポートされた C++ 関数のラッパー関数に加えて、格納された Oculus 変数を使用してカメラのビヘイビアをセットアップするヘルパー関数を含んでいます。

このコンポーネントはOVRCameraControllerプレハブに追加されてます。任意のゲームオブジェクトにアタッチできます。しかし宣言は一回のみとすべきであり、理由として特定のOculus Riftの値をUnityインスペクタで調整できるパブリック変数が含まれるためです。

OVRDevice.cs には次のパブリックメンバーを含みます:

Prediction Time:このフィールドにより、トラッカーがプレイヤーの頭部の位置がある場所を予想する時間をどれぐらい先にするかを調整できます。入力からビデオ遅延(Latency)をカバーするのに有力です。デフォルトの値は50ミリ秒ですが、適切に調整できます。

Accel Gain:任意のスケール変数により、重力ベクトルを使用してプレイヤーの向きを補正する強度をセットします。小さい値であるほど補正がより遅くなり、大きい値であるほど補正が早くなります。期待する動きとなるまで、値を調整します。

4.3.2 OVRComponent
OVRComponent は多くのOVRクラスのベースクラスとなります。この派生クラスに基本的な機能を提供するのに使用されます。

4.3.3 OVRCamera
OVRCamera はUnity カメラクラスにレンダリングするために使用されます。
このコンポーネントは Rift トラッカーを読み取り、カメラ位置および回転を配置するハンドリングをします。これは正しく最終アウトプットをレンダリングする役割であり、さらに最終レンズ補正のパスも行われます。

4.3.4 OVRCameraController
OVRCameraController は低レベルのカメラのハンドリングを容易にするコンポーネントです。これはUnity およびカメラのメインのインタフェースとなります。これはプレハブにアタッチされており、シーンに Oculus Rift を追加することを容易にします。

注意:全てのカメラのコントロールはこのコンポーネントを通して行うべきです。

自身のコントロールのタイプにカメラを統合するとき、このスクリプトを理解することが重要です。

OVRCameraController.cs は次のパブリックメンバを含みます:

Camera Root Position: このフィールドはカメラが配置される場所をアタッチされているオブジェクトに対して相対的にセットアップします。OVRPlayerController ではこの値は1.0f、すなわちデフォルトでコリジョンのカプセルの中心である 2.0 メートルにセットされています。

Neck Position: このフィールドはスクリプトがアタッチされているゲームオブジェクトに対して
相対的にセットアップされています。このフィールドは頭部がアニメーションする場合に修正されます(上下の動作のようなプロシージャルのとき、またはゲームオブジェクトにアタッチされたとき)。

Use Player Eye Height: このフィールドは Oculus Config ツールから実際のプレイヤーの目の高さをセットするために使用します。オンのとき、首のポジション(Neck Position)はカメラのルートポジション(Camera Root Position) および目の中心ポジション(Eye Center Position)に対して相対的に配置され、3 つの合計がプレイヤーの目のポジション(Player Eye Height)と一致します。注意として、オンのときは Set Neck Position を通して首のポジションに書き込みは許可されません。実装の詳細については OVRCameraController.cs スクリプトを確認して下さい。

Eye Center Position: このフィールドは頭部のモデリングにおいて目の中心が配置される場所をセットするのに使用します。左右の目を分離するための瞳孔間距離(IPD)は自動的にセットされますが、この値は Set/GetIPD 関数を通してセットすることも出来ます。

Follow Orientation: これがセットされたとき、カメラはつねに rotation コンポーネントを追跡して、ヘッドトラッキングはこれに対するオフセットとなります。固体のオブジェクト(車またはボディ)にカメラを載せるときに便利です。

Tracker Rotates Y: これがセットされたとき、カメラの実際の Y軸回転にもとづいて、それがアタッチされている親の Transform のY軸 rotation の値をセットします。これを拡張して X および Z 軸の値も対応させることができます。カメラの実際の向きにもとづいて、他のコンポーネントまたは他のゲームオブジェクトへフィードバックを反映させるのに便利です。現時点ではヘッドトラッキングを実現してコントローラの Forward 方向に反映させる際に、OVRPlayerController によって使用されます。このコンポーネントの親 Transformの Follow Orientation をセットしたうえで Tracker Rotates Y を true とすることで方向(orientation)に対してフィードバックを反映します。

PredictionOn: オンのとき、トラッカーの予測(predition)補正がセットされます。予測(prediction)時間の大きさはOVRCameraController 配下にある OVRDevice コンポーネントを通して調整できます。

CallInPreRender: オンのとき、 OVRCamera.cs スクリプトの中でOnPreRender 関数でレンダリングが行われます。トラッカーをレンダリングに近づける(すなわち結果的に実際のラテンシーを低下させる)という効果があります。しかし、この設定による発生する問題の説明については「既知の問題」を参照して下さい。

WireMode:セットするとシーンのレンダリングがワイヤフレームとなります。

LensCorrection:セットすると、レンズ補正のパスが有効となります。

Chromatic:セットすると、色収差(Chromatic Abberation) を修正するシェーダが使用されます。
色収差はレンズにより引き起こされ、画像の色が放射状に広がり、レンダリングされた画像の特定の場所で縞模様の色(Color Fringe)が発生する原因となります。

Background Color:OVRCameraController プレハブにアタッチされた両方のカメラの背景色を設定します。

Near Clip Plane:両方のカメラのニアクリップ平面の値をセットします。

Far Clip Plane:両方のカメラのファークリップ平面の値をセットします。

4.3.5 OVRPlayerController
OVRPlayerController により Oculus Rift を使用した基本的な First Person Controllerを実装します。OVRCameraController がアタッチされた OVRPlayerController プレハブにアタッチされます。

コントローラは、シーンにコリジョンが割り当てられていれば、 Unity シーンと正しく相互作用します。

OVRPlayerController プレハブはForwardDirectionと呼ばれる空のゲームオブジェクトがアタッチされています。このゲームオブジェクトにはどのモーター紺とr-るがその方向をベースとするかのマトリクスを含みます。ゲームオブジェクトはプレイヤーにより見られるボディ形状を格納します。

4.3.6 OVRMainMenu
OVRMainMenu は異なるシーンのロードを制御するために使用されます。さらにユーザが様々なOculus Rift 設定を修正できるメニューをレンダリングして、これらの設定を後で再度呼び出しできるように格納します。

このコンポーネントのユーザはアクセスしたいシーンをいくつかでも足すことが出来ます。

OVRMainMenu は現在、利便性を考えてOVRPlayerController にアタッチされてますが、安全に取り外して一般的なUnity ロジックで使用されている別のゲームオブジェクトに追加できます。。

4.3.7 OVRGamepadController
OVRGamepadController はゲームパッドコントローラに対するインタフェースクラスです。
Windows マシン上で、ゲームパッドはXInput互換である必要があります。

現在ネイティブXInput互換のゲームパッドはMacOSでサポートされていません。ゲームパッドの入力には従前のUnity Input の手法を使用してください。

4.3.8 OVRPresetManager
OVRPresetManager 変数セットの保存および Unity PlayerPrefs クラスを使用して再度コールすることを許容するヘルパークラスです。

OVRPresetManager は現在 OVRMainMenu により使用されています。

4.3.9 OVRCrosshair
OVRCrosshair ステレオスコープを通した照準を追加するコンポーネントです。照準は現在ビューがレンダリングされた後に描画されるため、歪み補正は全くありません。

4.3.10 OVRGUI
OVRGUI は2D または 3D で基本的なテキストのレンダリングを隠蔽するヘルパークラスです。コードの2Dバージョンでは廃止予定であり、3D 要素のレンダリングに移行予定です(現在 OVRMainMenuで使用されます。)

4.4 カリブレーション手順
次のセクションでは、開発者がアプリケーションに含めたいかもしれない基本的なカリブレーション手順の概要を示します。主にUnity統合でセットアップされたカリブレーション手順を表現します。特定のカリブレーションにおける、より詳細な理解については Oculus SDK ドキュメントを参照して下さい。

4.4.1 磁気 Yaw-Drift 補正
Yaw-Drift 補正を始めるためには、 Tuscany シーンを見て下さい。スペースを押下して視覚的なメニューを表示させて下さい。
最初、磁気 Yaw 補正はオフとなっています。カリブレーションを始めるには、手動カリブレーションの場合は Z 、自動カリブレーションの場合は X を押下して下さい。
 
もしマニュアルモードが選択されている場合、カリブレーションはRiftを向けるべき方向(正面、上、左、右)をガイドしてくれます。始めるには、希望する Forward 方向をみて、もう一回 Z を押してカリブレーションのプロセスを始めます。もし、何らかの理由でカリブレーションが失敗した場合、Z を再び押下して再度プロセスを再起動します。カリブレーションをスキップするにはカリブレーションの最中に Z を押下します。 Auto モードでは Oculus Rift が動的に Rift を動かして回るときに自動的に正しい点を選択します。Oculus Rift は十分なサンプル数が集まったとき、カリブレーションされます。マニュアルのカリブレーションと同様に手順をスキップするにはカリブレーションの最中に X を押下します。カリブレーションが成功であった場合、 F6 を押下することで視覚的なコンパスをトグルできて、センサーがどれくらい遠くまでドリフトしたかを示します。コンパス上の赤いダイヤモンド状の記号が緑色に変化することでドリフト補正が行われていて、その最中はコンパスのラインが回転することが確認できます。

4.5 既知の問題
次のセクションにより Unity および Oculus Rift で既知の問題を共有しますが、これらは Unity または Oculus Rift 統合パッケージの今後のパージョンで解消されます。

いくつかの問題では現時点で、回避策が利用できます。

4.5.1 ディスプレイをターゲットにする
ディスプレイを全画面モードでターゲットにすることは将来の Unity リリースで含まれる予定です。

4.5.2 Skyboxes
Unity Skybox はカメラで行われるパース マトリクス計算には影響されません。このため Skybox が必要である場合、カスタムの Skybox を提供する必要があります。

例えばカスタムの Skybox を実装する例については、Tuscany デモのレベルに含まれる Skybox を参照して下さい。

4.5.3 Tracker クエリの場所
方向のトラッカーをコールするときは OVRCamera で二つの方法があります。

これを OnPreCull 関数の中でコールすることで、カメラの向きがカメラのカリングが行われる前に、多くの Unity サブシステムの完全性を保証します。

しかし、追加の遅延(ラテンシー)が追加されていて、ここで呼出することにより追加のラテンシーが発生します。トラッカーを OnPreRender 関数の中でクエリすることにより遅延(Latency)は減少しますが、特定のシステムの完全性は保証できません。どのロケーションがアプリケーションに合うかユーザ次第です。

4.5.4 MSAA レンダリング ターゲット
Unity では現在レンダリングターゲットでアンチエイリアスをセットすることがサポートされていません。これによりレンズ補正パスが画像を引き伸ばされ、最初は大きなバッファでもレンダリングをします。最終バッファに補正中で全体的なレンダリングの解像度に影響して、レンダリング補正により画像の乱れが発生します。

アンリエイリアス レンダリング バッファは将来の Unity リリースでサポートされます。

5 最後の注意
Unity 使って VR 世界を作成する体験が、私たちが皆様にOculus Rift を提供するのと同様の、楽しみ・刺激を受けるものとなることを期待します。

驚くべき新しい世界を創造して下さい!!

質問はありますか?

開発者サポートフォーム
https://developer.oculusvr.com

に投稿、または support@oculusvr.com にメール送信下さい。



ブックマークに追加

このエントリーをはてなブックマークに追加

自己紹介

自分の写真
Unity3D公式マニュアル翻訳やってる人がスマホ(iPhone, Android)のゲーム開発しています。気軽に面白く初心者が遊べる内容がモットー。Blogでは開発情報をひたすら、Twitterではゲーム作成の過程で参考にしている情報を中心につぶやきます

ページビューの合計

過去7日間の人気投稿