読者です 読者をやめる 読者になる 読者になる

iOSアプリを作ったことがない人が、Unity作ったアプリをiOSデバイスに実機転送する方法(無料 )

Unity iOS

最近知ったのですが、Xcode ver7以降であれば、iOSバイスへの実機転送が無料になっています。

これまで、iPhoneiPad実機にアプリをインストールするには、Apple Developer Program(年間10000円前後かかる)に登録し、証明書登録などの複雑な手続きが必要でした。

Xcode7以降は複雑な手続きが不要になっており、私が試した2009年頃よりもはるかに簡単になっていました。

しかし、若干つまづくところがあり、

・Unityを使っている

・今までiOSの実機転送をしたことがない、または以前やったことがあるけどもう忘れてしまった

・Unityでのビルドから、iOSバイスに実機転送して、起動までの方法をまとめて知りたい

という条件(私です、、)に合う情報が一発で見つからなかったので、今回整理してみました。

なお、検討時の環境は下記です。

Mac : OS X 10.11.5
Unity: 5.3.5f1
Xcode : 7.3.1

=============

[目次]

1. Xcodeをインストールする

2. Unityで何かを作る

3. Build Settingsで、PlatformをiOSにする

4. Player Settingsで、Targetデバイス、iOSバージョン、パッケージ名を指定する

5. Buildする

6. Xcodeからプロジェクトを開く

7. Xcodeでビルドを実行する

8. iPhoneの設定画面から、証明書を承認する

Tips

=============

手順

1. Xcodeをインストールする

App StoreからXcodeをインストールします。

Xcode

Xcode


2,3GBあるので少し時間がかかりますが、App Storeでインストールを選ぶだけなので特に大変なことはないです。

2. Unityで何かを作る

好きなものを作ります。

3. Build Settingsで、PlatformをiOSにする

f:id:Takyu:20160530113440p:plain

4. Player Settingsで、Targetデバイス、iOSバージョン、パッケージ名を指定する

それ以外の項目は、アプリによって設定必須の場合とそうでない場合があります。

パッケージ名については、

com.<会社名>.<アプリ名>

が一般的のようです。ただし、実際のところ、<>の中は他のアプリと被ってなければ何でも良さそうです。

ちなみに、Androidでは、

com.TestApp

のように"."が一つでも実機転送できます。

最初、上記のようにしたところ、転送はうまくいくのですが起動後の動作がおかしかったです。

ただし、試行錯誤中だったので、これが原因かは不明です。

参考までに、最近調べているStructure Sensor向けアプリの設定は下記です。

f:id:Takyu:20160530113226p:plain


5. Buildする

Development Buildは、有線によるデバッグをしたい時に設定します。

Buildボタンを押して、出力先を指定すると、Xcodeのプロジェクト一式ができます。

f:id:Takyu:20160530113615j:plain

6. Xcodeからプロジェクトを開く

Unity-iPhone.xcodeprj をダブルクリックします。

Xcodeが開いたらiPhoneを接続し、ロックを外しておきます。 (先に接続してても良いかも)

初めて接続した場合、「このコンピュータを信頼しますか?」というメッセージがiPhoneに表示されるので、「信頼する」を選びます。

その後、Xcodeの上側で進捗バーのようなものが出ます。1,2分待つと完了します。

f:id:Takyu:20160530113658p:plain

7. Xcodeでビルドを実行する

下記の画面が出たら、ビルドを開始します。

f:id:Takyu:20160530113725p:plain

開始するには、Xcode画面左上で三角のマークがある箇所をクリックします。これはビルドと実機転送を兼ねています。

f:id:Takyu:20160530113737p:plain


ところで、iPhoneにはProvisioning Fileというものがあり、これがインストールされたiPhoneにしか実機転送ができません。

上記手順に沿って三角ボタンを押すと、この時点ではProvisioning Fileがないので、下記のようなエラーが出ます。

f:id:Takyu:20160530115238j:plain

6年前だと、これをiOS Developer Programのサイトから生成し、秘密鍵を作ってから〜のように色々面倒だったのでした。

しかし、Xcode7以降では、ここで "Fix Issue"をクリックすると、Apple IDの入力画面が出ます。

ここでAppleIDとパスワードを入力すると、こういう画面が出ます。

f:id:Takyu:20160530115415j:plain

ここでChooseを選べばProvisioning Fileを作ってiPhoneに転送してくれます。(便利だ、、)

うまくいくと、こういう進捗バーが出ます。

f:id:Takyu:20160530115501p:plain

8. iPhoneの設定画面から、証明書を承認する


転送が終了すると、そのまま起動しようとします。

しかし、先ほどiPhoneに自動的に転送されたProvisioning FileをiPhoneから承認していないので、ここでエラーがでて中断します。

中断してもアプリは転送済みですので、次はiPhoneとPC間のケーブルを抜いて、iPhoneを操作します。

設定→一般→プロファイルとデバイス管理 と進むと、デベロッパAppという欄に自分のAppleIDが表示されています。

これを選択すると、証明書を信頼するかというメッセージが出るので「Yes」または「信頼する」を選びます。

これで、先ほど転送したアプリを実行することができます。


注:転送したアプリを全部削除すると、再度承認が必要になるようです。しかし、7,8の手順を実行すれば問題ありません。


ちなみに、証明書が有効であれば7の後iPhoneのアプリが起動します。しかし、転送完了時にiPhoneの画面ロックがかかっていると、下記のエラーが出て中断します。

f:id:Takyu:20160530123428j:plain

これは、「転送は完了したら起動に失敗した。なので、手動で起動してください」 という意味ですので、特に問題はありません。

Cancel Runningをクリックし、iPhone上でインストールされたアプリをタップすれば起動します。


Tips

(1) Package Nameは1日10種類までしか使えない

11個目を使おうとしたらエラーがでて転送できませんでした。

ただし、同じPackage Nameであれば何度実機転送しても大丈夫です。

(2) iPhone接続時の「写真」アプリの自動起動を無効化

ちなみに、iPhoneMacにつなぐとき、Mac上で「写真」アプリが自動的に起動しますが、iPhoneの抜き差しが多いと煩わしくなります。

下記のコマンドで無効化できます。

$ defaults -currentHost write com.apple.ImageCapture disableHotPlug -bool YES


こちらのサイトを参考にさせていただきました。ありがとうございます。

nanokamo.com


これまでiOSアプリの実機転送の手間と、Androidスマートフォンしか持ってなかったというのもあり、iOSアプリ開発はあまりやってませんでした。

ただ、今回の実機転送無償化によって、iPhoneでもやりやすくなったのはとても助かります。


なお、今回の無償化の範囲は、あくまで自分のAppleIDで紐付けたiOSバイスだけです。

ほかのAppleIDで紐付けられたiOSバイスに転送したい時は、従来通り、Apple Developer Programに登録してから手続きをする必要があるので注意が必要です。

GearVR、CardBoard、Milbox Touch対応したゲームの開発方法

Unity MilboxTouch

この投稿は、5/26 VR Tech Tokyo #1 でお話させていただいた内容の技術的な詳細です。

最近、VR向けゴーグルが多数出ており、とくにモバイル向けは数えきれないほどあります。

ゲームを作る場合、毎回それぞれのゴーグル向けに作っていると大変です。

そこで、私の独断で、3つのHMDを選び、それぞれ向けにゲームを作る時のTipsと、実際にゲームを作ったときの
手順を整理してみました。

TipsについてはSlideshareに公開予定です。



まずは作ったゲームの基本の動きです。

f:id:Takyu:20160526205939j:plain


ほんとは弾の出るタイミングを限定するとか、もう少しゲーム性を持たせようと思ってるのですが、今回の発表までには間に合いませんでした。。
この辺は今後作っていこうと思ってます。

では、開発方法です。

==================================

目次

1.GearVR、MilBox Touch、CardBoardのSDKをインポート

2. tap処理を作成

3. 弾の発射処理を作成

4. 衝撃波の発生を作成

5. 吹き飛ばす処理を作成

6. 敵にダメージを与える処理を作成

7. シーンフェードを作成

8. ビルドする

感想

==================================

1.GearVR、MilBox Touch、CardBoardのSDKをインポート

■GearVR

VR Sample アセットを使います。

インポート後、Project ViewのAssets/VRSampleScenes/Prefabs/Main Camera をHierarchy Viewにドラッグします。

Hierarchy Viewに最初から付いていたMain Cameraは右クリック→deleteで削除します。

■CardBoard


このブログの「3. CardBoard SDKとの連携方法」の3-1から3-4までを参照ください。

magicbullet.hatenablog.jp

■MilBox Touch

このブログの「2.Unitye SDKを使った動作確認」の2-1手前までを参照ください。

magicbullet.hatenablog.jp

2. tap処理を作成

■GearVR

このようなスクリプトを書いて、GameObjectにくっつけると、tapを認識できます。

using UnityEngine;
using VRStandardAssets.Utils;

namespace VRStandardAssets.Examples {
    public class TestGearVRTap : MonoBehaviour {
        [SerializeField]
        private VRInput m_VRInput;

        public GameObject BombPrefab;

        private void OnEnable() {
            m_VRInput.OnDown += HandleDown;
        }


        private void OnDisable() {
            m_VRInput.OnDown -= HandleDown;
        }

        private void HandleDown() {
             /*ここにタップしたときに実行したい処理を書きます*/
             /*下記は今回のゲームで、タップで爆弾を落とすための処理です*/
            GameObject bomb = Instantiate(BombPrefab, transform.position, Quaternion.identity) as GameObject;
            bomb.GetComponent<Rigidbody>().AddForce(transform.forward * 10.0f, ForceMode.Impulse);
        }
    }
}

■CardBoard

CardBoard SDKがインポートできていれば自動的にタップ検出ができるようになっています。

■MilBox Touch

このブログの「2.Unitye SDKを使った動作確認」の2-1から2-5までを参照ください。

magicbullet.hatenablog.jp



3. 弾の発射処理を作成

これは3つのVRゴーグルで共通です。

以下のようなスクリプトを準備し、Cameraオブジェクトの子にくっつけます。

using UnityEngine;
using System.Collections;

public class ThrowBomb : MonoBehaviour {
    public GameObject BombPrefab;
    public AudioClip bomshotClip;
    AudioSource playerAudio;

    void Awake() {
        playerAudio = GetComponent<AudioSource>();
    }

	void Update () {
#if UNITY_EDITOR
        if (Input.GetKeyDown(KeyCode.J)) {
            throwingBomb(); 
        }
#endif
    }

    public void throwingBomb() {
        GameObject bomb = Instantiate(BombPrefab, transform.position, Quaternion.identity) as GameObject;
        bomb.GetComponent<Rigidbody>().AddForce(transform.forward * 10.0f, ForceMode.Impulse);
        playerAudio.Play();
    }
}

AddForceで使われている"forward"とは、現在の視線方向について"前方”という意味です。
この処理により、Playerの向いた方向に向かって弾が飛びます。

また、BombPrefabはSphereです。RigidBodyが付いています。
RigidBodyの重力があることで、弾が水平投射します。


高校物理の解説サイトより引用させていただきました。


f:id:Takyu:20160527001722p:plain

水平投射の例


ところで、弾の発射位置ですが、Cameraと同じにすると目の前から弾が出て気持ち悪くなります。
なので、このように視線よりやや上に発射位置(MilBoxTouchController)を設定しています。

f:id:Takyu:20160527001833j:plain


ちなみに、弾の発射音は下記のサイトの効果音「コミカルなダメージ音」を使わせていただきました。

4. 衝撃波の発生を作成


このブログの手法をベースにさせていただきました。ありがとうございます。

ガンズターン 公式サイト » ゲームエフェクト勉強会のまとめ 後編その3フレア(衝撃波?)っぽいエフェクト

この手法との違いは、発生方向を地面と平行にしていることです。

この衝撃波の発生方向を地面と平行にするには、下記の箇所をHorizontal Billboardに変更します。

f:id:Takyu:20160527225152p:plain


f:id:Takyu:20160527230047g:plain

Horizontal Billboardに変更した場合


f:id:Takyu:20160527230132g:plain

通常のBillboardのままの場合


また、Play On Awakeにチェックをいれることでinstantiate時に衝撃波が発生するようにしてます。

ちょっと小さくて申し訳ありませんが、Particleの設定項目は下記をご覧ください。

f:id:Takyu:20160527102538p:plain

5. 吹き飛ばす処理を作成


2段階で行います。

(1) 吹き飛ばす対象を見つける

Collider[] targets = Physics.OverlapSphere(transform.position, explosionRadius);

Physics.Overというメソッドを使うことで、指定位置(transformposition)から指定半径(explosionRadius)に含まれるGameObjectを取得します。

(2) tagがEnemyのObjectに対してAddExplosionForceを適用する

(1)で見つけたGameObjectについて、以下の処理を実行します。

 foreach (Collider obj in targets) {
         
            if (obj.tag == "Enemy") {

                attackEnemy(obj.gameObject);
                obj.GetComponent<Rigidbody>().AddExplosionForce(explosionForce, transform.position, explosionRadius);
            }
        }

6 敵にダメージを与える処理を作成



_CompeletedAssets/Scripts/EnemyにあるEnemyHealthクラスにアクセスして、ダメージ量を伝えます。

 
   private void attackEnemy(GameObject obj) {
        CompleteProject.EnemyHealth enemyHealth = obj.GetComponent<CompleteProject.EnemyHealth>();
  
  
        if (enemyHealth != null) {
            // ... the enemy should take damage.
       //     Debug.Log("EnemyDamage:" + damagePerBombShockWave);
            enemyHealth.TakeDamage(damagePerBombShockWave,obj.transform.position);
        }else {
            Debug.Log("null!");
        }
    }


なお、サンプルプロジェクトでは、

    
    namespace CompleteProject
   


を宣言しているので、その中のメンバを呼び出すには、

    CompleteProject.EnemyHealth
  


のように宣言する必要があります。

全部まとめたExplosionForce.csは下記です。BombsPrefabにくっつけてます。

using UnityEngine;
using System.Collections;
//using CompleteProject;

public class ExplosionForce : MonoBehaviour {

    public GameObject ShockWavePrefab;
    public AudioClip windClip;
    public int explosionRadius = 10;
    public int damagePerBombShockWave = 20;
    public int explosionForce = 100;

    private SphereCollider spherecollider;
    private GameObject ShockWaveObj;

    AudioSource playerAudio;

    void Awake() {
        playerAudio = GetComponent<AudioSource>();
    }

    void OnTriggerEnter(Collider col) {
     //   Debug.Log("col.name :" + col.gameObject.name);
          if(col.gameObject.name == "Floor") {
            playerAudio.Play();
            explosion();
        }

    }

    private void explosion() {
       this.gameObject.GetComponent<Renderer>().enabled = false;
        ShockWaveObj = Instantiate(ShockWavePrefab, transform.position, Quaternion.identity) as GameObject;
        Collider[] targets = Physics.OverlapSphere(transform.position, explosionRadius);
        foreach (Collider obj in targets) {
            if (obj.tag == "Enemy") {
                attackEnemy(obj.gameObject);
                obj.GetComponent<Rigidbody>().AddExplosionForce(explosionForce, transform.position, explosionRadius);
            }
        }
        StartCoroutine("DestroyBomb");
    }

    private void attackEnemy(GameObject obj) {
        CompleteProject.EnemyHealth enemyHealth = obj.GetComponent<CompleteProject.EnemyHealth>();
        // If the EnemyHealth component exist...
  
        if (enemyHealth != null) {
            // ... the enemy should take damage.
            enemyHealth.TakeDamage(damagePerBombShockWave,obj.transform.position);
        }else {
            Debug.Log("null!");
        }
    }

    IEnumerator DestroyBomb() {
        yield return new WaitForSeconds(1);
        Destroy(ShockWaveObj);
        Destroy(this.gameObject);
    }
}


7. シーンフェードを作成

■MilBox Touchの場合

ベースとしたSurvival Shooterでは、シーンをフェードさせるためにAnimationClipとAnimatorControllerを使っています。
クリア用に作ったAnimation ClipとAnimator Controllerです。

f:id:Takyu:20160527102150j:plain


Survival Shooterのチュートリアルビデオで初めて知りましたが、AnimationClipではuGUIの制御もできます。

なので、クリップ上のタイムラインで画面全体に広げたimageのα値を0から1に変更することで、フェードアウトが実現できます。

上の画像では、ScreenFader : ImageColor:α の値を時間とともに変更する設定が書かれています。

その他、テキストの大きさとαを制御すると、このような表現もできます。

f:id:Takyu:20160527102407g:plain

■GearVRの場合

GearVRでベースにしたVRSampleには、3次元空間全体のフェードアウトを実行する機能がついています。

ですので、それをカウントダウンがゼロになったときにコルーチンの形で呼びます。

      private IEnumerator FadeAndReloadGame() {
            yield return StartCoroutine(m_CameraFade.BeginFadeOut(m_IntroOutroFadeDuration, false));
        }

8. ビルドする


下記に注意してください。

■GearVR

GearVR向けにビルドするときは、ユーザ定義変数に"GEARVR"を追加する

f:id:Takyu:20160527230822p:plain

BuildSettings / Other Settings の中にあります。

VRSupportedを有効化し、MIN API Levelを使用するAndroidのバージョンに合わせる

f:id:Takyu:20160527230941p:plain

下記の記事を参考にしてDeviceIDの取得と、Assets/Plugins/Androidフォルダへのインポートが必要です。

(VR関係の開発環境構築方法が非常に丁寧にまとまっております)

https://framesynthesis.jp/tech/2015/12/gearvr/

■ Milbox Touch

ユーザ定義変数に"MILBOX"を追加すること

追加場所はGearVRと同じです。

VRSupportedを無効化し、MIN API Levelを対象デバイスに合わせる


これで今回のようなゲームが作れます。

感想

複数のモバイルVR対応を試してみましたが、デバイスごとの制約がある中で共通の処理を作っていくのは意外と楽しいものでした。
VRはモバイルに限らずまだまだ増えていくし、どれか一つだけが残るということはあまりないと思います。
なので、複数端末向け対応ができると色々便利ですよね。

あとは最近、下記のブログのようにARというかMRも気になっていて、代表デバイスのHoloLensに興味があります。

magicbullet.hatenablog.jp



今回のゲームの作り方について、VR系のデバイス対応方法は整理できたので、ゲーム性を付ける続きの開発についてはHoloLensも視野に入れようと思っています。

(プラットフォームを変えても開発ができるのはUnityの強みですね)

HoloLensのエミュレータを起動し、Unityでアプリを作るまでの手順メモ

Unity HoloLens

先日、@kaorun55 さんのご厚意により、HoloLensを試すことができました。
(@kaorun55さん、ありがとうございました)

twitter.com


「百聞は一見に如かず」の通りでした。体験してわかることがたくさんあり、これはすごい!という一言に尽きました。


HoloLensの体験レポートは、PANORAさんやMoguraVRさんがまとめていらっしゃるので、詳細はこちらをご確認ください。私もだいたい同じ印象を持ちました。

PANORA VIRTUAL REALITY JAPAN » 日本で一般初公開!! ニコニコ超会議・JALブースのHololensはヌルヌル動作がスゴかった

【体験レポ】ニコニコ超会議2016のJALブースで「HoloLens」を体験。その実力は? | MoguraVR


HoloLensは価格やその他条件などが理由で、現状簡単には手に入りません。しかし、Microsoftからエミュレータが公開されています。

そこで、エミュレータを動かして、もう少し詳細に調べてみることにしました。


====================================
目次

1. インストール

1-1. Visual Studio Update2

1-2. HoloLens Emulator

1-3. HoloLensアプリ開発用のUnity

1-4. Unity用のUWP Tool

2. ビルド、エミュレータの起動

2-1. UnityでC#プロジェクトをビルド

2-2. Visual Studioからエミュレータを起動

3. その他Tips

3-1. 操作方法

3-2. Spatial Mappingのスキャンの雰囲気を体感する

3-3. エミュレータの中でUnityアプリを起動する

3-4. 全体的にやや不安定?

4. 感想
====================================

1. インストール

(2016/5/8時点の情報を元に書いています。今後のアップデートで、必要なものや手順が変わる可能性があるのでご了承ください)

大前提が2つあります。

(1)Windowsが10 Pro以上のエディションであること



(2)仮想化機能に対応したCPUであること

以下の手順で確認/設定ができます。

(2-1) PCの電源を切り、BIOSを立ち上げる (機種によって異なりますが、私の環境ではDELキー or F2キーの連打でいけました)

(2-2) Advanced -> CPU Configurationを選択

(2-3) Intel Virtulization Technology をDisabledからEnabledにする

(2-4) Save&Exit (機種によってはSave&Reset)を選択して再起動する


仮想化機能が有効になっているかは、

コントロールパネル→プログラムと機能→Windowsの機能の有効化または無効化

で、Hyper-Vにチェックが付いているかで判断できます。

f:id:Takyu:20160508220807p:plain


その他、64bitで4coreのCPU、8GBのRAMなど、PCの性能自体も高めである必要があります。


以下、Windows10Pro、仮想化機能が有効であることを前提に進めます。

このページのリンクから4つのツールを入手できます。

1-1. Visual Studioのアップデート

上記のリンクからVisual Studio 2015 Update 2を選択してダウンロードします。

If you choose a custom install, ensure that Tools (1.3.1) and Windows 10 SDK (10.0.10586) is enabled under Universal Windows App Development Tools node. All editions of Visual Studio 2015 Update 2 are supported, including Community.

とあるように、UWPをビルドできるようにするため、インストール時は必ず「カスタム」を選択してください。私の環境では「カスタム」を選択すれば、必要なツールは自動的に選択されていました。

1-2. HoloLens Emulator

上記のリンクからHoloLens Emulatorを選択してダウンロードします。画面の指示に従って進めるだけでインストールできます。

Virtulization is not set とかのエラーが出てインストールに失敗する場合、冒頭の仮想化機能を有効にしてから再インストールを試してください。


1-3. HoloLensアプリ開発用のUnity

上記のリンクからUnityのHPに飛びます。ここで、HoloLensアプリ開発専用のUnityをインストールします。
(なぜかMonoDevelopしか選択肢がありませんでした)

インストールに成功すると、いつも使っているUnityとは別ものとして、デスクトップにショートカットが生成されます。

f:id:Takyu:20160508151117j:plain

1-4. Unity用のUWP Tool

上記のリンクからUWP Toolを選択してダウンロードします。画面の指示に従って進めるだけでインストールできます。


周辺に書いてある指示を見ると、Unity -> UWP Toolの順番にインストールする必要があるようです。


ここまでやると、環境構築は完了です。

2. ビルド、エミュレータの起動

2-1. UnityでC#プロジェクトをビルド

再度 @yuujii さんにお世話になりました。ありがとうございます。

ここで指定されているリンクからサンプルプロジェクトをダウンロードします。

上記ページのリンクから取得できます。300MBくらいあるのでダウンロードに少し時間がかかります。

ダウンロード、解凍後にHolographicAcademy-Holograms-101というフォルダができます。今回は以下を使ってみました。


HolographicAcademy-Holograms-101\Catch up Chapters\7-SpatialMapping-Completed

これをUnityで開きます。

completeプロジェクトなのでほぼ何もしなくて大丈夫です。ビルド設定だけ調整します。

f:id:Takyu:20160508155830p:plain

Virtual Reality Supportedにチェックを付けます。普段とちがって"Windows Holographic"というリストが表示されます。


f:id:Takyu:20160508151428j:plain


Publish SettingsのSpatialPerceptionにチェックを入れます。
マニュアルを見ると、Microphoneにもチェックを入れること、とありました。音声認識を使わなければ不要な気がしますが、私の場合、念のためチェックを付けました。


次はビルドです。

f:id:Takyu:20160508151553j:plain

このように、

SDK : Universal 10
UWP Build Type : D3D

Unity C# Projects にチェック

とします。

これでBuildをクリックすれば、Visual Studio用のプロジェクトが生成されます。

2-2. Visual Studioからエミュレータを起動

f:id:Takyu:20160508151644p:plain

Visual Studioを開き、Open->Project/Solution で先ほど作ったC# Projectのslnファイルを指定します。


f:id:Takyu:20160508151718p:plain

このように、ビルド設定を
Release
x86
HoloLens Emulator
と変更します。


Build -> Clean Solutionのあとに、Build -> Build Solutionを選択します。

Output Windowにエラーが出なければビルドは無事に完了しています。


次に、エミュレータの起動、およびUnityアプリの実行です。Debug->Start without Debugging を選択します。

f:id:Takyu:20160508151816p:plain

エミュレータの起動時にこういうメッセージが出たらRetryを選択します。

f:id:Takyu:20160508152053p:plain


この後、数十秒から数分でエミュレータが起動します。

Made With Unityというロゴが出たあとでこのような画面になります。

f:id:Takyu:20160508152152j:plain


スペースキーを押すとロゴが消え、Origamiが見えます。

f:id:Takyu:20160508152845j:plain


3. その他Tips

3-1. 操作方法

キーボードかマウスを使います。

W : 対象に近づく
A/左 : 対象の左側に移動
S   : 対象から遠ざかる
D/右 : 対象の右側に移動
上  : 上方向に移動
下 : 下方向に移動
Enterキー:カーソルをアイコンに合わせたときに押せば「決定」

また、マウスドラッグで移動させることで上下左右キーを押したことと同じことができます。

f:id:Takyu:20160508154330g:plain

ちなみに、この動画の場合、HoloLensをかぶって実際に前後左右、上下に動いた時の見え方をエミュレートしています。

この白い線は、実空間をメッシュにしてスキャンした結果をエミュレートしたものです。

3-2. Spatial Mappingのスキャンの雰囲気を体感する

Unityアプリが起動していないとき(Windowsボタンを押す)に、スペースキーを押します。部屋をスキャンするアニメーションが表示されます。

f:id:Takyu:20160508155337g:plain

3-1の繰り返しになりますが、この白い線は、実空間をメッシュにしてスキャンした結果をエミュレートしたものです。
エミュレータだと背景が黒いのでわかりづらいですが、HoloLensをかぶって見ると、自分が見える実空間の風景に合わせて、このようなスキャン結果が表示されます。実際に見るととても未来的な感じがします。

これにより、Unity用の空間で実空間の構造を把握できるので、HoloLensを付けたときにこんなシーンを見ることが可能になります。

3-3. エミュレータの中でUnityアプリを起動する

2-2の手順でStart without Debuggingを使っても、Unityアプリが起動せず、スタートメニューが表示されるだけ、というのがありました。

そのときは、エミュレータを×ボタンで終了させてからStart without Debuggingで再起動します。

あるいは、以下の手順で直接起動させます。

キーボードのWindowsボタンを押し、このようなメニューが表示されたら、右キーでカーソルを移動させ、+マークが光る位置でEnterキーを押す

f:id:Takyu:20160508152548j:plain

アプリの一覧が出るので、上下左右キーでカーソルをOrigamiに移動させ、Origamiが光る位置でEnterキーを押す

f:id:Takyu:20160508152658j:plain

3-4. 全体的にやや不安定?

感覚的に、UnityもVHoloLens Emulatorも、やや不安定な印象を持ちました。

不安定であることの事例として、一度こうなったことがありました。



再起動してもBIOSしか表示されなかったのでかなり焦りました。
因果関係は不明ですが、直前の操作は、Visual Studio Codeでメモしながらエミュレータを起動してたことでした。


また、HoloLens用のUnityでユニティちゃんアセットをインポートしたら、なぜかシェーダーが認識されませんでした。

f:id:Takyu:20160508160351p:plain


しかし、Space Robot Kyleはなぜかエミュレータでもちゃんと表示されました。

f:id:Takyu:20160508160710j:plain

==========================================================

2016/5/14 追記

ユニティちゃんがピンク色になってしまうのは、Unity5.4のエディタが悪さしていることが原因のようでした。 @nyaa_toraneko さん、、@kaorun55 さん、@yuujii さん、ありがとうございました。

ユニティちゃんアセットをインポートした後、ここからダウンロードしたunitypackageをインポートすることで(=パッチを当てる)、正しく表示されるようになります。

f:id:Takyu:20160514101057p:plain

パッチ用のunitypackageをインポートすると、上書きという意味なのか、該当するしぇーだー部分に矢印を丸めたようなアイコンがついています。


f:id:Takyu:20160514100430p:plain

パッチを当てることで、いつもの表示に戻りました。


ちなみに、このパッチが効くのは、"Unity-chan Model"です。 モーション配布用のアセット"HQ Fighting Animation FREE" には効かないのでご注意ください。

==========================================================

4.感想

エミュレータの動きだけではわかりづらいですが、実際にHoloLensをかぶった後だと、個々の動きの意味がわかります。

エミュレータで色々作り込んでおけば、いざHoloLensが入手できたときに開発がスムーズに進むと思います。

個人的にはHoloLensとMeta2はとても楽しみにしており、勉強しながら色々作ってみたいです。


HoloLensはまだまだ簡単に手に入るものではないですが、ちょうどこのブログを書いている時に、以下のような案内をいただきました。

c-mitsuba.hatenablog.com


HoloMagicians | HoloLens Creator Group Japan

引用です。

この勉強会について
HoloMagiciansはHoloLensに関心のあるデベロッパー、デザイナー、クリエイター集団です。

各地で勉強会を行い、開発セッションやTouch & Try、アイデアソンやハッカソンを行っていきます。ぜひご参加ください。

次回の名古屋はさすがに難しいですが、今後なるべく参加していきたいなと思います。


最後に


下記を参考にさせていただきました。ありがとうございました。

エミュレータの概要と操作方法
www.ms-hololens.com

■インストール関係
www.atmarkit.co.jp


また、灯台下暗しで後で気づきましたが、こちらも簡潔にわかりやすく書かれております。

■Unityで使うサンプルコード
www.naturalsoftware.jp

Unityでモーションキャプチャを取れる、Cinema Mocapを試してみました

UnityAssets

(部分的にMac上で撮ったスクショでも解説していますが、このアセットはWindowsでしか使えません。あらかじめご了承ください)

これまでに、Cinema Suiteの中で、

Cinema Director

magicbullet.hatenablog.jp


Cinema Pro Cam

magicbullet.hatenablog.jp


Cinema Themes

magicbullet.hatenablog.jp


を紹介しました。

今回は、Cinema Suiteシリーズ最後の一つである、Cinema Mocapを紹介したいと思います。

Cinema Mocapとは、Kinectで取得した人の動きからAnimation Clipを生成できるアセットです。


目次

0. はじめに - Cinema SuiteとCinema Mocapの関係性 -

1. 準備

2. 代表的な機能の紹介

3. 補足 アニメーションの設定Tips

4. 感想

0. はじめに - Cinema SuiteとCinema Mocapの関係性 -


Cinema MocapをAssetStoreで探すと、Cinema Suite というアセットも見つかります。

f:id:Takyu:20160328093710j:plain

Cinema Suiteとは、制作者が作ったCinema関係のアセットを4種類パッケージにした、まとめ売りの場合の名称です。

もう少し詳しく説明すると、

Cinema Suite ($129)
- Cinema Director ($60)
- Cinema Pro Cam ($50)
- Cinema Mocap ($70 : ただし単体の場合Cinema Mocap2になっているので、一部機能が古い可能性あり(未確認))
- Cinema Themes (無料)

という構成になっています。個別で購入すると$129を超えるのでお得です。
(価格は2016/3/28時点です)

この記事では、Cinema Mocapに注目しました。

なお、アセットストアには、同じ製作元が作ったCinema Mocap2というアセットがあります。

説明文を全部は読んでないですが、Cinema Mocap2と、Cinema Suite内のCinema Mocapは同じに見えました。

Mocap2だけに独自機能を入れている可能性もあるかもしれませんが、基本的な仕組みは同一とみてよさそうです。

1. 準備

1-1. Kinect

まずはKinectを準備します。
Kinectは、2016/4現在2種類ありますが、どちらでも使えます。
初めてKinectを入手する人はXbox One Kinect センサーを購入、元々持っている方は初代のKinect for Windows センサーを使うことも可能です。

ちなみに、Xbox One Kinectセンサー(約14000円)と合わせてPC用のアダプタ(約5000円)も必要ですので、だいたい2万円ほどかかります。


www.amazon.co.jp

www.amazon.co.jp


私はXbox One Kinectセンサーを使って試しました。
以後の説明では、Xbox One Kinectセンサーを「Kinect」と呼びます。

1-2. PC

次に、Kinectが使えるPCを準備します。Kinectの場合、下記のように、そこそこ性能が高いPCが必要です。

  •  64-bit かつ3.1GHz以上のマルチコアプロセッッサ
  •  4 GB以上のメモリ(8GB推奨)
  •  USB 3.0 ポート
  •  DX11 と互換性のあるグラフィックアダプタ
  • OSはWindows7,8.1,10(Xbox One Kinectセンサの場合Windows7は対象外)


また、注意事項もあります。

  • Parallele Desktopなど、仮想環境上のWindowsではうまく動かない可能性がある
  • 第一世代のUSB3.0ポートでは、電力不足により動かない可能性がある


もちろん、OculusRiftを始めとした、VRが快適に動かせるPCであれば十分です。

1-3. Kinect SDKのインストール

MicrosoftのHPから入手し、画面の指示に従ってインストールします。

Download Kinect for Windows SDK 2.0 from Official Microsoft Download Center


インストールすると、スタートメニューにこのようなツールが追加されます。

f:id:Takyu:20160419080958p:plain

インストール後、KinectをPCと接続し、Kinect Studioを動かしてみました。

Kinect Studioの下記の赤枠で囲ったアイコンをクリックすると、

f:id:Takyu:20160419081520p:plain

f:id:Takyu:20160419081607p:plain

このように、Kinectのカメラで撮った映像が見えます。

一般的なカメラプレビューにもなりますし、このようにヒートマップのような画面もできます。


Kinect Studio自体も色々とできそうですが、今回は割愛します。

1-4. Cinema Mocapのインポート

Kinectをつないだ状態でUnityを起動し、Asset Storeから購入してimportします。importすると、「Window」からCinema Mocap の機能が使えるようになります。

f:id:Takyu:20160426153409j:plain

(注:私はCinema Mocapを含んだ統合版の"Cinema Suite"を購入しているので、Cinema Mocap単体で購入された場合、他のアセットは表示されません)


Mocapのwindowが出るので、Input SettingでKinect2を選んでOnにすると、右側の枠にKinectのカメラで撮影したプレビューが見えます。


f:id:Takyu:20160426153815j:plain


ここまでやって、ようやく準備完了です。

2. 代表的な機能の紹介

Cinema Mocapの機能は主に3つです。


2-1. 人の動きからアニメーションクリップを自動生成

2-2. ライブアニメーションプレビュー

2-3. フレーム単位でアニメーションを再生




ただし、私の環境では2-2は動きませんでした。

2-1. 人の動きからアニメーションクリップを自動生成

これは、Kinectの前で動いたモーションを元に、Humanoidモデルのアニメーションクリップを生成してくれる機能です。

1-1から1-4まで完了した状態であることを前提に進めます。

まずは設定です。

Output Settingの Save Locationに保存先を指定します。

Frame Rateは30のままとし、Animation Nameは好きな名前に変更します。

Recording は、保存内容です。Output SettingsのSessionで、フレーム単位の要素をInspector上でElementとして保存しています。


f:id:Takyu:20160428065727p:plain

Start Delayはセルフタイマーです。5秒を指定すると、"Record"をクリックしてから5秒後に録画が始まります。

これで、"Record"の後にKinectの前で動くと、Output Settingsのsaved locationにアニメーションクリップが保存されます。

レコーディングを止めるには、"Stop"ボタンを押します。

次に、生成したアニメーションクリップを使えるようにするために、いくつか設定します。


まず、Project Viewから先ほど生成したアニメーションクリップを選択します。設定を変更しなかった場合、Project ViewのAssets/Cinema Suite/Cinema Mocap/Animationsに保存されています。


f:id:Takyu:20160504175530p:plain


今回は、椅子に座って両手を振るモーション(wavehandsという名前にしました)を作ってみました。

まず"MoCapHumanoid@wavehands"オブジェクトの子の一つである、wavehandsというアニメーションクリップを選択します。

Inspector Viewで、Editをクリックします。

f:id:Takyu:20160504175700p:plain

Animationsが選択されているので、Rigをクリックします。

f:id:Takyu:20160504175801p:plain


animation typeをGenericからHumanoidに変更し、configureをクリックします。

f:id:Takyu:20160504175836p:plain



シーンを保存していない場合など、警告が出ることがあります。そのときはyesを選択します。


人体モデルのようなマッピングが出ます。全部緑色になっていることを確認したら、一番下にあるDoneをクリックします。
もし赤い色になっているパーツがある場合、具体的に指定する必要があります。

f:id:Takyu:20160504175921p:plain

Doneをクリックすると、Rigの設定画面に戻ります。Configureの左側にチェックマークがつきます。

f:id:Takyu:20160504175945p:plain


これでアニメーションクリップが使えるようになりました。
Project Viewにあるwavehandsを選択すると、アニメーションが出ます。

もし出ていない場合、ここをドラッグして引っ張るとアニメーションが出ます。

f:id:Takyu:20160504180115p:plain

f:id:Takyu:20160504180148j:plain

アニメーションプレビューの右下のAvatorマークをクリックし、OtherからUnity-chanを選ぶと、プレビューをユニティちゃんに変更できます。

f:id:Takyu:20160504180242j:plain

ちなみに、Unity Modelを選ぶと、ユニティおじさん?になります。

f:id:Takyu:20160504180252j:plain


あとはAnimator Controllerをユニティちゃんに割り当ててシーン実行すれば、このようになります。

f:id:Takyu:20160504212738g:plain



2-2.ライブアニメーションプレビュー

2-1では、カメラプレビューが映っている状態で動くだけなので、自身の動きがどのようにCGモデルに反映されるかは、後で試すまでわかりません。

一方、2-2の機能を使うと、PCにモデルを出現させ、自分の動きに合わせてモデルをその場で動かすことができます。

私の環境では動きませんでしたが、参考までに手順を記載します。


1-1から1-4まで完了したことを前提に進めます。

Output SettingsのSkeletonを25 joint daeに設定したまま、「GEN」ボタンをクリックします。

すると、このように、黒い人形が出てきます。
(ここでは、人形のRotation.y=180に変更し、Main Cameraを人形に近づけてます)

f:id:Takyu:20160427081520j:plain

次に、Hierarchy View上の人形のオブジェクトをマウスで選択してから、"Record"をクリックします。
この状態でKinectのキャプチャーエリアに入ると、自分の動きに合わせて人形も動く、のようです。

2-3. フレーム単位でアニメーションを再生

この機能を使うには、Mocap Windowの表示を、"Record"から"Review"に変更します。

f:id:Takyu:20160427082139p:plain


続いて、Input SettingsのSessionに、2-1.のOutput Settingsで作ったSessionを指定します。

すると、Render Raw Skeletonのボタンが押せるようになるので押します。

f:id:Takyu:20160504180353j:plain

押すと、ピンク色の棒人間がScene Viewに出現します。

f:id:Takyu:20160504180527j:plain

Frame の "<"や">"を押すと、フレーム単位でアニメーションが再生されます。

あるいは、Unityの標準機能により、Frameという赤枠で囲った辺りを左右にドラッグすると、高速にフレームの数値を変更できます。

f:id:Takyu:20160504213017g:plain
(マウスカーソルが消えてしまってますが、実際は「Frame」付近をドラッグしています)


ちなみに、現時点では作成したアニメーションクリップを編集・統合する機能はありません。

マニュアルによると、将来的に作る予定だそうです。

そのため、現時点では、作成したアニメーションクリップの不要部分を削るには、Unity標準の機能を使います。


まず、2-1と同じように、wavehandsのアニメーションクリップを選択してEditをクリックします。

すると、このようにアニメーションクリップのタイムラインが出てきますので、赤枠で囲ったstartとendを調整してから、下にあるApplyをクリックすればOKです。

f:id:Takyu:20160504215955j:plain

ただし、最初と最後しか削れません。

将来的な機能として、アニメーションクリップの分割や結合ができたらいいですね。


3. 補足 アニメーションの設定Tips

Cinema Mocapとは無関係ですが、ユニティちゃんの表情を変化させるところで少し詰まったので、対応方法を書いておきます。


ユニティちゃんアセットには体全体のモーションサンプルと、表情のモーションサンプルがついています。

Unityの標準機能として、一つのモデルに複数のアニメーション再生の状態を割り当てるには、Animator Controllerの中でLayerという機能を使います。

f:id:Takyu:20160504220119j:plain

赤枠で囲った箇所がそれぞれレイヤーです。


今回は表情変化用にfaceというレイヤーを追加しました。

次に、faceの右側にある歯車をクリックすると、いくつか設定項目が出てきます。

f:id:Takyu:20160504220214j:plain

ここでMaskという項目でface only maskを選択します。
(これはユニティちゃんアセットの中に最初から付いているものです)

この状態で、状態遷移の中で表情系のモーションを指定します。

こうすれば、表情と身体のモーションを別々に再生させることができます。


4. 感想

アニメーションクリップを0から作るのは大変なので、自分の動きをそのまま取り込めるというのは非常に便利だと思います。

初期準備さえ済ませれば使い方もシンプルです。

一方、私の環境で作ったアニメーションクリップは、手足の先が時々変な動きをしてしまうことがありました。

これはKinectの誤検知の可能性があるので、もう少し散らかってない部屋(何も置いてない部屋)で試せば改善される気がします。


また、これでCinema Suiteシリーズを全て調べきることができました。
4種類はなかなか量が多かったですが、それぞれ実際に使うこともあるので、わりと役に立っています。

あと、アセットを調べて整理すること自体で、Unityの勉強にもなりました。

引き続き、アセットを調べつつ、VR/AR系コンテンツ開発を進めていこうと思います。


ユニティちゃんライセンス

この作品はユニティちゃんライセンス条項の元に提供されています

段ボール製VR HMD「Milbox Touch」の準備から使い方までをまとめてみました

Unity MilboxTouch

CardBoardのような段ボールを使ったVRゴーグルは、気軽に使える一方で操作方法が限られてしまうという課題があります。

先日発売された「Milbox Touch」は、そんな課題を克服するために、ゴーグルの外側に導電性のフィルムを取り付け、フィルムを通じてスマートフォンのタッチパネルを触ることで、タップ以外に、スクロール、スワイプ操作を可能にしています。

これまでの段ボールタイプのVRゴーグルとは違ったものなので、早速注文してみました。

4/26時点ではAmazonでのみ注文が可能で、2700円でした。かなり早く届きました。


色々調べてみたので順番に解説していきます。

目次

1. 組み立て手順

2.Unity SDKを使った動作確認

3. CardBoard SDKとの連携方法

4. アクションゲームへの適用方法

5. アクションゲーム "Survival Shooter"をMilbox Touch対応にする

6. 感想

1. 組み立て手順

f:id:Takyu:20160429001523j:plain
こんな感じで届きます。

f:id:Takyu:20160502103407j:plain
中身です。

f:id:Takyu:20160502103440j:plain
説明書に従って組み立てます。まずは、ゴーグル部分を折ります。

f:id:Takyu:20160502103555j:plain
側面のパーツに導電性フィルムを貼ります。

f:id:Takyu:20160502103724j:plain
側面のパーツを折って、本体に取り付けます。フィルムが剥がれやすいので、フィルムを押さえながら取り付けました。

f:id:Takyu:20160502104019j:plain
スマートフォンをセットします。赤枠の部分がタッチパネルに触れるようにします。

f:id:Takyu:20160502104030j:plain
折りたためば完成です。

2.Unity SDKを使った動作確認

Milbox Touch にはタッチ入力を制御するためのSDKが用意されています。

いくつか準備する予定のようですが、5/2時点ではUnity用のSDKのみが提供されていました。

Unity用のSDKはここから入手します。

milbox.tokyo

unitypackageを展開すると、2つのスクリプトがあります。

  • MBTHelper.cs

導電性フィルムを通したスクロール、スワイプ、タップの3つの入力を、タッチパネル入力に変換するための処理が書かれています。

uGUIのCanvasオブジェクトにくっつけます。

  • ControlScript.cs

3つの入力を検出するサンプル動作が書かれています。

手順です。

2-1. uGUIのCanvasオブジェクトを新規作成し、ここにMBTHelper.csをくっつける

2-2. uGUIにTextオブジェクトを追加する (タッチ入力結果を表示させるため。使用は任意)

2-3. 空オブジェクトを生成する(ここではMilboxControllerとしました)

2-4. MilboxControllerにControlScript.csをくっつける

2-5. Inspector Viewから、ControlScriptコンポーネントにText(ここでは名前をDebugMessageとしました)、Cube、Sphereをくっつける

f:id:Takyu:20160502233218j:plain

2-6. Android(またはiOS)向けにビルドする。

まず、スマホだけで動作を確認します。

このようにスマホを横にしたとき、横方向になぞるとスクロール、縦方向になぞるとスワイプ、として認識します。

f:id:Takyu:20160503075216g:plain
(動画には入ってませんが、1回軽く叩くとタップとして認識します)

あとは、このサンプルを起動させてからMilbox Touchに装着すると、右側面の導電性フィルム部分を触ることで、スクロール、スワイプ、タップを認識します。

それぞれの操作方法は下記の通りです。

f:id:Takyu:20160503075536j:plain

しかし、なぜか私のMilbox Touchでは、スワイプをほとんど認識できませんでした。フィルムがうまくタッチパネルに接地できていないのか、、

3. CardBoard SDKとの連携方法

現時点で提供されているUnity SDKには、以下の機能は入っていません。

・360度のヘッドトラッキング

・両眼立体視するために画面を2分割する

そこで、Mibox Touchで見られるようにするために、CardBoard SDKを導入します。

3-1. CardBoard のSDKを入手

ここから、”CardboardSDKForUnity.unitypackage"と"CardboardDemoForUnity.unitypackage"を入手します。

該当するunitypackageをクリックした後、View Rawをクリックするとダウンロードが始まります。


======
2016/5/21 追記

CardboardのSDKが変更されています。

ブログ執筆時はv0.6を元に説明しましたが、v0.7よりTap検出がデフォルトで有効になり、設定画面から消えました。

ただし、v0.7のCardboardSDKを適用した状態でMilBox TouchのTap検出はできたので、今後はv0.7以降を使うのがよいと思います。

もし、v0.6を使いたい場合、ここから取得できます。

======

3-2. Unity上でSDKを展開

”CardboardSDKForUnity.unitypackage"、"CardboardDemoForUnity.unitypackage"の順番にimportします。

3-3. CardBoardMain PrefabをHierarchy Viewに展開

元々Main Cameraがある場合は削除し、Cardboard/Prefabsフォルダから、CardBoardMainのPrefabをHierarchy Viewに置きます。

3-4. CardBoardMainの設定を変更

CardBoardMainのInspector Viewを開き、CardBoard Settings のTap is Trigger のチェックを外します。

f:id:Takyu:20160503143253p:plain

これはCardBoardアプリでタッチ操作を検出するためのオプションです。デフォルトで有効になっていますが、今回はMilbox Touchのタッチ操作検出の仕組みを使うため、こちらを無効にしておきます。


======
2016/5/21 追記

上記の追記に記載の通り、v0.7以降ではTap is Triggerの設定が消えているため、v0.7以降を使う場合は3-4の手順は不要です。

f:id:Takyu:20160521195701p:plain

======


以上の設定まで実施してからAndroid用にビルドすれば、Milbox Touchのタッチ機能が付いて、かつ360度のヘッドトラッキングがついたアプリを作ることができます。

4. アクションゲームへの適用方法

Milbox Touchを開発したWHITE Inc.からは、パックマンアプリが販売されています。

play.google.com


試してみたところ、Milbox Touchのスクロール機能を使ってパックマン前進/後退させ、方向転換はヘッドトラッキングで行っていました。


ただし、3で解説したMilbox TouchのUnity SDKではスクロールの検出処理のみが書いており、オブジェクトを自由に動かすことはできません。

そこで、MBTHelper.csの内、以下をこのように変更します。

case TouchPhase.Stationary:
     tapTime += Time.deltaTime;
     Vector3 vv = Input.GetTouch(0).position;
     Vector3 vp = currentPos - vv;
				
     if (isScroll && vp.sqrMagnitude > tapDetectLengthSqrt) {
	 if (vp.x*vp.x > vp.y*vp.y){
	    //OnScroll(Input.mousePosition.x, 0); /*オリジナル*/
	       OnScroll(vp.x, 0);                             /*変更*/
	       isTap = false;
	} else {
	    //OnSwipe(0, Input.mousePosition.y); /*オリジナル*/
	       OnSwipe(0, vp.y);                             /*変更*/
	       isTap = false;
	}
    }
    currentPos = vv;
break;


オリジナルの処理だと、タッチした場所(正確には導電性フィルムが触れた場所)の座標をそのままOnScrollメソッドに渡しているため、私が使ったXperiaZ3(1920×1080)のスマートフォンでは、1400〜1500付近の値を繰り返し渡していました。

そこで、vp.xを渡すことで、前回と今回の差分値を渡し、それをTransform.translateが受け取ることで、オブジェクトが移動できるようにします。スワイプも同様です。


スクロールとスワイプで、それぞれオブジェクトを動かしてみます。ControlScript.csの一部をこのように修正します。

private void MBTOnSwipe (float xx, float yy) {
                /*add */
		float x = xx/100;
		float y = yy/100;
		hako.transform.Translate (x, y, 0);
                /**/
	//	hako.transform.Translate (xx, yy, 0);
}

private void MBTOnScroll (float xx, float yy) {
		/*add*/
		float x = xx/100;
		float y = yy/100;
		maru.transform.Translate (x, y, 0);
		/**/
		//maru.transform.Translate (xx, yy, 0);
}

今回はMain CameraのFOV内で動きを見たかったので、MBTHelper.csから受け取る値を1/100にしました。
この値はアプリの作り次第と思います。

ビルドして動作を確認してみます。

f:id:Takyu:20160503150345g:plain
スクロールです。(すいません、gifの設定をミスって解像度が小さくなってしまいました)

f:id:Takyu:20160503150553g:plain
こっちはスワイプです。


この仕組みを使えば、Milbox TouchのSDKでキャラクタを動かすことができると思います。


5. アクションゲーム "Survival Shooter"をMilbox Touch対応にする

Unity Asset Storeには、Survival Shooterというチュートリアル系のアセットがあります。

f:id:Takyu:20160503151314j:plain

これは、主人公を操作しながら、持っている銃でお化けをやっつけるゲームです。

せっかくなので、これをMilbox Touch対応にしてみます。

Asset StoreからSurvival Shooterのパッケージを入手し、Unity内で展開済みとして進めます。

5-1. 新規プロジェクトを開き、Survival Shooter、CardboardSDKForUnity、CardboardDemoForUnity、Milbox TouchのUnitySDKの順番にインポートする

5-2. Survival Shooterの完成版シーンを開き、別名で保存する

具体的には、Assets/_CompletedAssets/Level 01 5.x を開き、別名で保存します。

(注)Survival Shooterのプロジェクトはチュートリアルを兼ねているので、_CompletedAssetsフォルダではないところにあるスクリプトは未完成です。

5-3. Cardboard関係で必要なオブジェクトを調整する

  • Assets/CardBoard/Prefabs/CardboardMain をHierarchy Viewに追加
  • CardboardMain のInspector Viewで、Tap is Triggerのチェックを外す
  • Hierarchy Viewの Main CameraのTransform付近のチェックを外す

f:id:Takyu:20160503152830j:plain

  • Hierarchy View のCardboardMain/Head/Main CameraのInspector Viewを開き、Camera Follow スクリプトを追加。

f:id:Takyu:20160503164304j:plain

  • Camera Follow のInspector Viewを開き、Hierarchy View上のPlayerオブジェクトをTargetとして指定する

5-4. Milbox Touch関係で必要なオブジェクトを調整する

  • Canvas オブジェクトを新規作成し、その中に、MBTHelper.csスクリプトをくっつける
  • _CompletedAssets/Scripts/Player/PlayerMovement.csを開き、以下を修正する
/*PlayerMovement.cs*/

/*冒頭で以下の宣言を追加*/
 float scrollMove;
 float swipeMove;

/*Awake()とFixedUpdate()の間に以下を追加*/

        void Start(){
            MBTHelper.OnScroll += (x, y) => {
                MBTOnScroll(x,y);
            };
            MBTHelper.OnSwipe += (x, y) => {
			MBTOnSwipe (x, y);
	 };
        }
        private void MBTOnScroll (float xx, float yy) {
            scrollMove = xx;
        }
        
        private void MBTOnSwipe (float xx, float yy) {
            swipeMove=yy;
        }
/**/
/*PlayerMovement.cs*/

void FixedUpdate ()
{
/*コメントアウト*/
    // Store the input axes.
   //   float h = CrossPlatformInputManager.GetAxisRaw("Horizontal");
   //   float v = CrossPlatformInputManager.GetAxisRaw("Vertical");

//   Move (h, v);
      Move(scrollMove,swipeMove); /*追加*/

//  Animating (h, v);
     Animating(scrollMove,0);
}
  • _CompletedAssets/Scripts/Player/PlayerShooting.csを開き、以下を修正する
/*PlayerShooting.cs*/

/*Awake()とUpdare()の間に以下を追加*/

       void Start(){
            MBTHelper.OnTap += () => {
                MBTOnTap ();
            };
        }
        
         private void MBTOnTap () {
               Shoot();
        }

/*Update()内の処理をコメントアウト*/
     voie Update()
{

/*省略*/

#else
/*
            // If there is input on the shoot direction stick and it's time to fire...
            if ((CrossPlatformInputManager.GetAxisRaw("Mouse X") != 0 || CrossPlatformInputManager.GetAxisRaw("Mouse Y") != 0) && timer >= timeBetweenBullets)
            {
                // ... shoot the gun
                Shoot();
            }
            */
            
#endif

/*省略*/

5-5. Android用にビルドする

ここまで済ませると、Android用にビルドするとSurvival ShooterがCardboard & Milbox Touch対応します。

f:id:Takyu:20160503155731j:plain


ただし、前述のように、私の環境ではスワイプがほとんど効かないので、現状では実質1次元方向にしか進めていません。

また、ここまでの実装では、キャラクタの方向転換ができていません。この辺は後日考えてみようと思っています。

参考:Survival Shooterの設定

Survival Shooterは、

・3種類の敵が3秒置きに出てくる

・銃で撃っても5,6回撃たないと倒せない

・プレーヤは5,6回お化けに触れると死ぬ

という、なかなかシビアな設定になっています。

そのため、動作確認をしようとしてもお化けに囲まれてうまくできないことがあります。

そこで、以下の設定を変えると、便利に変更できます。

プレーヤのライフを大幅上昇

f:id:Takyu:20160503160117j:plain

Player オブジェクトのInspectorにある、PlayerHealthにて、Starting Healthを10000のように変更します (初期値は100)

敵の出現開始時間を遅らせる

Hieararchy Viewの Enemy MangerのInspectorから、三種類のSpawn Timeを全て300のように変更します (初期値は3。すなわち3秒置きに敵が出現)

f:id:Takyu:20160503160354j:plain

参考2:Survival ShooterとAngry Botsの関係性 (予想)

ちなみに、Survival Shooterは、主人公の動き方とか、銃を撃つところとかが、Angry Botsとよく似ています。

f:id:Takyu:20160503151522j:plain

Angry BotsはUnity4系までしか使えないようなので、Unity5から出てきた新しいチュートリアルアセットなのかもしれないですね。

6. 感想

個人的には、Cardboardのような段ボール製VRゴーグルは気軽な反面、ゲーム体験は難しい気がしていたので、タッチ操作も可能になったMilbox Touchは非常によい試みだと思います。

あと、試してみないとわかりづらいですが、Milbox Touchは導電性フィルムをタッチパネル部分に接地させることで外部からのタッチ操作を可能にします。

そのため、ゴーグルをのぞいたときにフィルムの電極部分が見えます。

f:id:Takyu:20160502110240j:plain
うまく写真が撮れなかったのでぼやけてしまってますが、、


これについては賛否両論ありそうな気がします。ちなみに、背景が黒いパックマンだと、このようにあまり気になりませんでした。

f:id:Takyu:20160502110418j:plain
赤枠がフィルムです。

まずはスワイプを効かせる方法を調べて、それができればMilbox Touch向けに何かゲームを作ってみるかもしれません。

Visual Studio 2015の自動改行設定を変更する

Visual Studio

今日はコード補完の設定方法に関するTipsです。


Visual Studio

if(Input.GetMouseButton(0))

まで入力すると、

if(Input.GetMouseButton(0))
{

}


という補完が入ります。

これは好みの問題なのですが、私は普段"{"で改行しないので、そうならない設定を探してみました。


1. Tools → Optionsを選択

2. Options ウインドウが出たら、Text Editor→C#→Formatting→New Linesを選択

3. New line options for expressions 以外のチェックマークを外し、OKをクリック

これで完了です。

設定前

f:id:Takyu:20160425221133j:plain


設定後

f:id:Takyu:20160425221145j:plain


このように、"{"が改行しなくなりました。

ここでチェックマークが多数あるのは、if、for、switch、classなど、"{"を必要とする記述方法について個別に設定できるためです。


ちなみに、先ほどチェックをつけたままにしたNew line options for expressionsの設定は、それぞれ下記の通りです。

こちらも好みですね(^_^;

/*Place members in object initializers on new line*/

/*チェックマークあり*/
var z = new B()
{
  A=3,
  B=4
};

/*チェックマークなし*/
var z = new B()
{
  A=3,  B=4
};
/*Place members in anonymous types on new line*/
/*チェックマークあり*/
var z = new 
{
  A=3,
  B=4
};

/*チェックマークなし*/
var z = new B()
{
  A=3,  B=4
};
/*Place query expression clauser on new line*/
/*チェックマークあり*/
var q = from a in e
            from b in e
            select a * b;

/*チェックマークなし*/
var q = from a in e
            from b in e
            select a * b;

以上です。

Windows10PCのHDDをSSDにしてみました

1年半ほどHDDで頑張ってみました。

しかし、

・OS起動に5分

・アプリケーションの起動にたまに失敗するor時間がかかる

が頻発しており、開発がしづらい状態でした。

また、普段の開発ではMacを使っていますが、最近Macでできないことが増えているので、思い切ってSSDに変えてみました。


今回購入したSSDはこれの512GBです。

jp.transcend-info.com


また、環境はWindow10 Pro 64bitです。

1.準備

現在のWindows10PCのバックアップをする。
失敗するとOSが起動しなくなる可能性もあるので、バックアップしておきます。

2.SSDにクローンするソフトをインストールする

今回はTranscendSSDを使ったので、同社製のソフト「SSD Scope」を入れました。下記です。

jp.transcend-info.com

3.SSDを接続する

HDDもSSDも、PCのボードとはSATAケーブルで接続しています。またSSD自体に電力を供給するため、電源ケーブルも接続する必要があります。

今回SSDを入れたPCはデスクトップでGTX980を積んでいます。ただ、筐体が小型なので一つずつ外しながら取り付けました。

まず、電源を切ります。


ふたを開けたところです。

f:id:Takyu:20160423210052j:plain

PCI Expressの端子に取り付けているGTX980を外します。

このとき、下記の黄色の部分でロックされていて、これをピンセットで上に引き上げることで外せました。

f:id:Takyu:20160423102453j:plain

クローン用にSSDを取り付けたところです。SSDマザーボードの空きSATA端子と接続します。

この後

4.HDDの内容をSSDにクローンする。

PCの電源を入れ、先ほどインストールした、SSD Scopeを開きます。

SATAで接続したSSDは、Windows10のエクスプローラからは見えませんが、SSD Scopeの中では認識されていました。

SSD Scopeを開くと、使用言語を選択する画面がでます。日本語もありますが、あちこちで "??"となっていたので、英語の方がよいかもしれません。

ツールの中の「システムクローン (System Clone)」を選択すると、現在のHDDが左側に、先ほど接続したSSDが右側に表示されます。

f:id:Takyu:20160423211334p:plain

画像では一つ目が消えてますが、オプションは二つあります。どちらもチェックを入れます。

一つ目の「Clone OS Partition Only」は、HDDの中にあるOS領域(通常はCドライブ)のみをクローンします。

それ以外のことはしないので、HDDのCドライブ容量 < SSDの容量の場合、SSDにアクセスできない空き領域が残ってしまいます。

二つ目の「Extend Disk」は、上記の「アクセスできない空き領域」をアクセスできるようにしてくれるオプションです。

(HDDの容量 > SSDの容量だと使えません)


上記2つのオプションを付けたら、あとは開始をクリックするだけです。

私の環境では、HDDの使用領域が280GBくらいだったためか、クローンは2時間程度で終わりました。

ちなみに、SSD Scopeを使うと、HDDの内容はクローン後に消去されるようです。

5.HDDを取り外し、SSDを取り付ける。

まずは電源を切ります。筐体が小さいとやりづらいですが、HDDを取り外し、SSDを取り付けます。

もう一度電源を入れると、Windowsが起動します。

SSDにして変わったこと

起動時間が大幅に短縮されました!

電源を入れてから安定的にWindows10が使えるまでの時間については、これまでは約5分でした。

それが20秒以内になったのは、非常に大きいと思います。

また、UnityやPhotoshopなども数秒で起動してくれるようになりました。

これでWindowsでの開発も進めやすくなりそうです。