2019年12月25日水曜日

[OculusQuest][Unity] Oculus Unity Integration-v12.0が出ました!

完全に見逃していましたが、Oculus Unity Integration-v12.0 がリリースされました!

https://forums.oculusvr.com/developer/discussion/83851/oculus-unity-integration-v12-0-12-19-2019

新機能

  • Oculus Questにハンドトラッキングサポートを追加
    開発者プレビューの免責事項:このリリースでは、ハンドトラッキングが開発者プレビュー機能として提供されます。現在、この機能を使用するアプリは、機能が将来のリリースで開発者プレビューフェーズを終了するまで、Oculusリリースチャネルへの提出を受け付けません。
  • MRCにデフォルトの第三者カメラのサポートが追加されました

統合の変更

  • 以下を含むOculus Unity Integrationをv12.0に更新しました。
    • Audio Spatializerを12.0に更新しました
    • LipSync統合を1.43に更新しました
    • プラットフォーム統合を12.0に更新しました
    • アバター統合を1.42に更新しました

サンプルの変更


まだUnityでの開発は行っていませんが、実際にハンドトラッキングを使った感じだと、かなりの精度で手が認識されていてスゲー!ってなりました。
また、手を使った新しい操作も(親指と人差し指でわっかを作るとクリックみたいな)、なんか未来感があっていい感じです。

冬休みは、これでちょっと遊んでみようかなと思います。
手始めに、ゴールキーパーのハンドトラッキング版がいいかなぁと考えてはいます。


2019年12月14日土曜日

[OculusQuest] ハンドトラッキングリリース!!

久しぶりに、朗報です。
来年リリース予定だったハンドトラッキングが、前倒しでリリースとなりました。

Thumbs Up: Hand Tracking on Oculus Quest This Week
休日にちょうど間に合うように、今週からQuestの初期の消費者向け機能として、また開発者向けのSDKとしてハンドトラッキングをリリースします来週。Questソフトウェアがロールアウトされたらv12にアップデートしてから、Experimental Featuresメニューでハンドトラッキングをオンにして、最初に試してみてください。この最初のリリースでは、ライブラリやストアなどのQuestのホームインターフェイス内で操作し、Oculus BrowserやOculus TVなどの一部のファーストパーティアプリで操作することができます。コントローラーを使用せずに、手を使用して固定ガーディアン境界の床の高さを設定することもできます。手とタッチコントローラーを切り替えるには、Oculusホームメニューの新しいトグルスイッチを使用します。そして、これはほんの始まりに過ぎません。2020年のQuestでの手追跡のエクスペリエンスを改善するために、新しい機能を追加し続けます。
現在のところは、「Oculus Browser」と「Oculus TV」のみが対応しているようです。


そして・・・
さらに、来週公開される新しいSDKにより、開発者とクリエーターは、Questアプリでコントローラーなしのハンドインタラクションを初めてロック解除できるようになりました。ソーシャルアプリでの表現力豊かなジェスチャーから、ビジネストレーニングモジュールでのより効率的なワークフローなど、手で新しいエクスペリエンスを構築する際に、彼らがどのような種類のコンテンツを夢見て出荷するのかを楽しみにしています。ハンドトラッキングにより、コントローラーの機能を習得する必要がなくなるため、新規参入者がVRをより使いやすいものにできることを願っています。また、クエストを所有している人は、ハードウェアが溶けてしまうと、VRの魔法に完全に没頭し、他のユーザーとシームレスで直感的な方法で接続できます。
だいぶ早いタイミングでSDKが公開されるようです!!

明確な日程は明言されていませんが、間もなくですね。
コントローラがないことでフィードバックがないことがデメリットとして挙げられますが、手が使えることでよりデジタルへの没入度が増すような気がしています。

SDKのリリースが待ち遠しいですね。リリースしたら何を作ってみようか・・・


2019年9月25日水曜日

[Unity][Android][OculusQuest] 形態素解析MeCabを使ってみる

業務多忙につき更新が滞っていますが、おかげでネタが溜まってきました・・・

さて、本題です。

形態素解析といえば、MeCabが有名です。
OculusQuest(Android)で動かせないかなあと試行錯誤していたらようやく動いたので、
手順を紹介しておきます。

手順は以下の通りです。

■試した環境
・Unity 2018.4.1f1
・Oculus Quest

■実施手順
1. NMecabをダウンロードする
 NMeCabは、MeCabのエンジン処理を.NETで書き直してくれてたオープンソースです。
 Windows用にDLLが格納されていますが、今回はソースを使います。
 最新バージョンはNMecab0.07となります。(2019/9/25現在)
 https://ja.osdn.net/projects/nmecab/

2.プロジェクト設定を行う
 NMeCabのソースを使う為に以下の設定を行います。
 ①.NET4 を使用するように設定する
 ② Allow unsafe Code にチェックする

3.ソースと辞書ファイルを配置する
 ① UnityのAssetsフォルダに以下のフォルダを作成します。
  ・ Assets/NMecab
  ・ Assets/StreamingAssets/NMecab

 ②1.でダウンロードした圧縮ファイルの中にあるファイルを格納していきます。
  ・NMeCab0.07\src\LibNMeCab を Assets/NMecab 下にコピーします。
   

  ・NMeCab0.07\dic\ipadicの直下にあるすべての辞書ファイルを Assets/StreamingAssets/NMecab下にコピーします。
  

4.プログラムから呼び出す
 Androidの場合、StreamingAssetsに配置したファイルを読み込み場合、WWWを使って読み込む必要があります。そうなるとNMeCabのソースを変更しないといけなくなるので辞書ファイルは一旦Android端末へコピーしてからそのファイルを読み込むようにします。

 以下のスクリプトを作成して実行してみましょう。
  

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using NMeCab;
using System.IO;


public class MecabTest : MonoBehaviour
{

	void Update()
	{
	}

	void Start ()
	{

	    //端末へMecabの辞書ファイルをコピー
	    CopyFile(Application.streamingAssetsPath + "/NMeCab", Application.persistentDataPath, "char.bin");
	    CopyFile(Application.streamingAssetsPath + "/NMeCab", Application.persistentDataPath, "dicrc");
	    CopyFile(Application.streamingAssetsPath + "/NMeCab", Application.persistentDataPath, "matrix.bin");
	    CopyFile(Application.streamingAssetsPath + "/NMeCab", Application.persistentDataPath, "unk.dic");
	    CopyFile(Application.streamingAssetsPath + "/NMeCab", Application.persistentDataPath, "sys.dic");

	    //Mecabの読み込み
	    param = new MeCabParam();
	    param.DicDir = Application.persistentDataPath;


	    //テスト
	    SetKeyWord("今日はとても良い天気ですね。");

	}

	/// 
	/// copy dictionary file.
	/// 
	/// void
	/// from path
	/// to path
	/// copy file name
	void CopyFile(string from, string to, string fileName) {
	    string path = from + "/" + fileName;
	    string toPath = to + "/" + fileName;

	#if UNITY_EDITOR || UNITY_IPHONE
	    FileInfo file = new FileInfo(path);
	    file.CopyTo(toPath, true);

	#elif UNITY_ANDROID
	    WWW www = new WWW (path);
	    while (!www.isDone) {
		}

	    File.WriteAllBytes (toPath, www.bytes);
	#endif
	}



	/// 
	/// Shows the key word.
	/// 
	/// The key word.
	/// Sentence.
	public void SetKeyWord(string sentence) {
	    MeCabTagger tagger = MeCabTagger.Create(param);
	    MeCabNode node = tagger.ParseToNode(sentence);

	    while (node != null)
	    {
	        if (node.CharType > 0)
	        {
				//名詞のみ抽出
	            if (node.Feature.IndexOf ("名詞") >= 0) {
	                Debug.Log ("名詞:" + node.Surface);
	            }
	        }
	        node = node.Next;
	    }
	}
}



具体的な使い方は、本家のソースを参考にしてください。








2019年9月9日月曜日

[OculusQuest][App] バスルーム ver1.0 リリース

人形の間2が時間かかりそうなので、ちょっとしたホラーを作ってみました。

ストーリー的には、人形の間へ遊びに行ったその日の夜こと。深夜2時にシャワーを浴びていると家のチャイムが・・・



■遊び方
・手の操作はなく、視点のみです。
・プレイ時間は3分前後のショートストーリです。
・音量は少し大きめにしてプレイしてください。

■ダウンロード
https://drive.google.com/open?id=1rllwx36__DzlORZXC46EBdgF_ZvsYiqe
※Sideloadなどでインストールしてください

感想などコメントいただけると、次への活力となりますので是非



2019年9月5日木曜日

[OculusQuest][Unity] 人形の間2開発中その1

「人形の間」が意外と好評のようでしたので、次へと繋げるためにみなさんの声をメモっておこうと思います。

・めちゃくちゃ怖かった、、途中何度か飛び上がった
・片手間に作ったレベルじゃない完成度だろw
 センスあるなー
 途中叫んじまったよw
 マジで投げ銭するからもっといろいろ作ってくれ!
・めっちゃ怖すぎた 俺もこういうお化け屋敷系作るわ
 人形の顔を覗き込めるところがさすが6DoFって感じだった
・すでにリアルなお化け屋敷レベルだよ
 VR体験型アトラクションにしてもお金が取れるんじゃない? と思う
 こういうのが家で手軽に楽しめるって素晴らしい
 欲を言えば、タッチコンで手に燭台を持っていて照らした方向が明るくなる(四隅が暗い方が怖そう)とか、人形の顔を覗き込むとニーッと笑うギミックとかほしいかな
・無理無理無理
 なんなん?この不気味なBGM?
 最初の場所からほんの少し動くだけでギブだったわ。。。
 男のくせにVRゲーセンの脱出病棟で甲高い悲鳴を上げたのはこの俺です
・いやいやいや、お化け屋敷よりビビるわw
 12時間で作ったってやべーな、クオリティ高い!
・まじで12hなの?
 ヤバいヤバい
 気力あるならお化け屋敷verまってるわ
・ホラーとVRの相性がえぐいなーw
 ガチで進めない怖さ
・やってみたけど最初の襖出たところから動けなかった
 他の人にやらせる前にやっときたいけど真昼間でも怖すぎたわ
・最初のふすまを開けたときに
 バイブレーションがきてビビって進めなくなった…チキンすぎる
・ホラーゲーはまあ余裕だけどお化け屋敷は無理な
 腰抜けなんだが、もう最初のふすま開けたところから
 暗闇が本能的に怖くて足がすくんで動けなくなったわ
 鼻の下の隙間意識したり音量下げたりこすいことやって
 何とか最後までみたけど、Rift初期に話題になった井戸の奴とか
 Face your Fears、Wilson’s heartなんか話にならんレベルで怖い
 暗さ、照明、通路のみせかたとかオーソドックスなお化け屋敷の
 構成要素抑えてるから、これ苦手な人は本気で無理な人居ると思う
・日本人形やってみた
 一度に表示できるオブジェクトの制限とかあるのかな?
 近距離で人形見てると横の湯呑や銅鏡?や雛あられなんかが
 見えたり消えたりする事があるね
 あと、人形の着物のスソを覗いてガッカリした
・お化け屋敷のやつ、riftにある「citysape vr」に似た恐怖感があった。
・お化け屋敷、怖すぎて自分では動けないから
 遊園地のトロッコ式みたいに自動で進むバージョンも欲しい
・うちの家族にお化け屋敷やらせてみたら、特に驚くこともなく進んですぐ戻ってきたわ
 DVDレンタルしてホラー映画一人でほぼ全部見てるし、ホラー耐性ありすぎたわ
 自分もビビったけどなんとかクリアできたわ
・もっと怖いモードも実装してくれw
・ネタバレ増えてきたので慌ててプレイしたけど怖かったー!
 開発スキルより構成のうまさがすごい。
 実はこれ系のプロでしょ??
・人形の間をプレイしていた時
 鼻の隙間から何か動く物が見えた気がして全身が総毛立った
 慌ててQuest外したけど部屋の中には何もいない
 気のせいだということにして忘れようとしたのだが・・・
 それ以来だ
 Questをかぶると決まって嫌な視線を感じるようになったのは
・人形の間、老眼のせいか夜目が利かなくて
 暗すぎて道がわからなくなる
 順路の矢印みたいなのを付けてもらえると助かります

やっぱりもっと怖さを増そうかなと、建物をリフォーム&人形のクオリティーをアップ中です。

お人形さんの恐怖度も増していきますが、やっぱり手を使った仕掛けを入れていきたいなと思います。

粛々と作成中!!


2019年9月3日火曜日

[OculusQuest][Unity] Oculus Integration for Unity-1.40が出ました!

Oculus Integration 1.39がバグだらけでどうしようもなく困っていたのですが、ようやく1.4がリリースされました。
https://developer.oculus.com/downloads/package/unity-integration/

新機能

  • Oculus Quest Mixed Reality Toolsパッケージの更新
  • OVRManagerに遅延コントローラーの更新追加しました現実世界と仮想コントローラーの動きの間の待ち時間を短縮するために、レンダリングの直前にコントローラーのポーズを更新します。
  • OVRManagerのUse Recommended MSAA Levelの動作を更新しました現在、この設定はデフォルトで有効になっています。
  • OVRDisplay.RecenteredPose:クエストでサポートされるようになりました。イベントは、ユーザーが再登録するたびに送信されます。
  • Oculus Questサポートのヘッドトラッキングマニフェストフラグを使用してAndroidManifest.xmlファイルを手動で生成する要件を削除しました。OVRManagerのターゲットデバイスのリストに「Oculus Quest」を追加するだけで、マニフェストファイルが更新されます。

統合の変更

  • 以下を含むOculus Unity Integrationを1.40に更新しました。
    • Audio Spatializerを1.40に更新しました
    • Lipsync統合を1.40に更新しました
    • プラットフォーム統合を1.40に更新しました

バージョン固有の既知の問題

このセクションでは、サポートされているUnityバージョンの既知の問題について詳しく説明します。
Unityバージョン
既知の問題点
2018.2
Unity 2018.2のすべてのバージョン
  • (モバイル)AndroidBuildSystemを内部に切り替えるか、Gradleプロジェクトをエクスポートし、build.gradleファイルのSigningConfigを変更してv1SigningEnabled = true、v2SigningEnabled = falseを含める必要があります。
2018.2.20f1
  • (モバイル)2018.2.20f1でロードすると、一部のゲームオブジェクトが暗く表示される場合があります。この問題を回避するには、2018.2.19などのUnityの別のバージョンでプロジェクトをロードします。


Unityの一般的な既知の問題

このセクションでは、特定のバージョンに関連付けられていないUnityの既知の問題について詳しく説明します。問題は、最も密接に関連する主題ごとにグループ化されています。
件名
既知の問題点
団結
  • Vulkan APIは現在、UnityでのOculus開発ではサポートされていません。Unityエディターでビルドエラーを受け取った場合プレーヤー設定の「グラフィックAPI」リストから「Vulkan」を削除する必要がある場合があります
  • Unityには、あるVRカメラを別のVRカメラにペアレント化するとトラッキングが2回繰り返されるという既知の問題があります。回避策として、それらをGameObject階層の兄弟にします。
ウィンドウズ10
  • Windows 10でRiftをターゲットにしているときに、Unity Editorで長いUIストールまたはパフォーマンスの低下が発生する場合は、Windows Updateを実行して、Windows 10の最新バージョンを使用してください。
  • Oculusランタイム1.17+およびWindows 10 + Creators Updateを使用したすべてのUnityバージョン:この組み合わせにより、非VRプロジェクトであっても、エディターで誤ったWM_DEVICECHANGEレポートが生成されます。多くのユーザーは影響を感じませんが、特定のUSBデバイスに接続しているユーザーは、エディターが応答しなくなり、タスクマネージャーから終了する必要がある場合があります。軽減するには、公開テストチャネルで利用可能なベータ版ランタイムに更新してください。現在、UnityおよびMicrosoftと永続的なソリューションに取り組んでいます。
リフト
  • Guardian System API:ovr_SetBoundaryLookAndFeelは現在、呼び出しが行われたときにHMDが装着されていない場合(たとえば、開始時)に有効になりません。
  • 透明なVRコンポジターレイヤーは現在、複数レイヤーのオクルージョンをサポートしていません。
  • Mixed Reality Captureの場合、ZED CameraユーザーはSDKバージョンを2.3.1以降にアップグレードする必要があります。以前のバージョンには互換性がありません。
モバイル
  • Unityの既知のバグにより、戻るボタンを使用してユニバーサルメニューを入力し、アプリケーションに戻ると、モバイルアプリケーションのパフォーマンスが低下します。特に、マルチスレッドを使用するアプリケーションやCPU使用率が高いアプリケーション、およびS7(ヨーロッパ)およびS8(グローバル)電話に影響します。このバグは、Unityバージョン2017.3.0b9、2017.2.0p3、2017.1.2p4、および5.6.4p2で修正されています。
  • ユニバーサルメニューからフォーカスに戻るとき、またはホームダイアログに戻るときにクラッシュするため、ユーティリティ1.11.0を使用しないでください。
  • シングルパスステレオレンダリングが有効になっていると、特定の場合にプロジェクトのビルドが失敗し、「「モバイル/バンプ詳細ディフューズ」のシェーダーエラー」というエラーメッセージが表示されます。詳細については、高度なレンダリング機能のシングルパスステレオレンダリングセクションの「既知の問題」を参照してください
  • (Gear VR)サムスンの携帯電話(Gear VR HMDで使用)などのMali GPUで入力属性値をピクセルシェーダーに直接渡すと、ちらつきや左目/右目の不一致が発生する可能性があります。これは、ARMドライバーがそのような「揮発性」データを明確に対象とし、そのデータを最適化しようとするため、意図せずに問題が発生するためです。回避策は、元の値の修正バージョンを何らかの方法で使用しようとすることです。たとえば、入力値aをシェーダー値bに直接渡す代わりに、b = a + 0.0001を設定します。これにより、ドライバーがbを異なる方法で処理できなくなります。
とりあえず、いろいろと修正されているようなので使ってみようと思います。
LoadSceneができるようになっているといいな・・・


2019年8月29日木曜日

[Unity] アニメーションキャラを吹っ飛ばす(ラグドール)

UnityでRagdollという機能がありますが、使ったことが無かったので使い方をメモしておきます。
Ragdollを使うと、人形のように吹っ飛ばすことができるようになります。


今回使用したUnityのバージョンは 2018.4.1f1です。

1.必要なアセットをインストール
 キャラクターの当たり判定(Collider)をメッシュやボーンに沿って自動的に設定してくれる便利なアセットです。
 ・SAColliderBuilder
 https://assetstore.unity.com/packages/tools/sacolliderbuilder-15058
  
 


2.キャラクターを画面に配置
 ボーン入りのキャラクターを画面に配置します。
 配置する際は、ルート(どのオブジェクトの子供ではない場所)に配置してください。理由としてはAnimatorの設定をスクリプトで操作する際に面倒だからです。
 ついでにアニメーションなども設定しておきます。
 
 今回は別途購入したゾンビキャラで実験です。

3.Colliderを設定
 先ほどのアセットを使って、Colliderを設定します。
 ①Animatorが設定されているキャラクターを選択し、右下の「Add Component」をクリックします。
 ②一覧から、「SA Bone Collider Builder」を選択します。
 
 ③ SA Bone Collider Builderの設定を次のようにします。
  Shape Type : Capsule
  Optimize Rotation :チェックを外す
  is Kinematic:チェックを外す
  user Gravity:チェックを付ける
  Collision Dectection Mode : Continuous Dynamic
  設定したら、「Process」をクリックします。
 


 以上で、Boneに沿ってColliderが自動生成されます。

4.Ragdollを作成
 ①Hiearchyから先ほど追加したキャラクタを選択し、Hierarchyの左下にある「Create」をクリックし、「3D Object > Ragdoll」をクリックします。

 ②Ragdollの設定画面が開くので、ボーンをひとつずつ設定してあげます。大体名前が一緒のはずですが、違う場合はめんどうですが位置を確認しながら設定していきましょう。最後に「create」をクリックします。
 
 そうすると、設定したボーンのところに「Character Joint」が追加されているのがわかります。これがRagdollの正体です。


5.実験
 とりあえず、適当な球を当てたときに動作するか実験してみます。
 ①ルートに空のゲームオブジェクトを作成します。今回は「tama」にしてみました。


 ②次に球体を作成します。「tama」を右クリックして、「3D Object > Sphere」を選択します。
 
「tama」の方向や大きさなどは適宜修正します。
 
 ③ つぎに球を発射するスクリプトを作成します。
 Hierarchyから「tama」をクリックし、「Add Component」で「GenerateTama」と入力して「New script」をクリックします。

 ④以下のスクリプトを貼り付けます。
GenerateTama.cs

    
void Update()
{
    if (Input.GetMouseButtonDown(0)) {
        GameObject tama = Instantiate(transform.Find("Sphere").gameObject , transform.position, Quaternion.identity);
        tama.SetActive(true);
        Rigidbody rigid = tama.GetComponent<rigidbody>(); 
        rigid.AddForce(transform.forward * 10, ForceMode.Impulse);
        Destroy(tama, 3.0f);
    }
}

⑤SphereにRigidbodyを追加します。
 HierarchyからSphereをクリックして、「Add Component」から「Rigidbody」を選択します。
 

⑥Sphereにもスクリプトを追加します。
  HierarchyからSphereをクリックして、先ほどと同様にスクリプトを追加します。
  名前は「HitTama」にします。
 

⑦以下のスクリプトを貼り付けます。
HitTama.cs
void OnCollisionEnter (Collision col)
{
    if (col.rigidbody!=null)
    {
        GameObject target = col.transform.gameObject;
        GameObject root = col.transform.root.gameObject;
        Animator anim = root.GetComponent<Animator>();
        anim.enabled = false;

        Rigidbody rigid = col.rigidbody;
        rigid.isKinematic = false;

        rigid.AddForce(transform.forward * power,ForceMode.VelocityChange);
    }
}

⑧ Sphereは無効にしておきます。
 

⑨ 最後に実行してみます。マウスを右クリックして球を発射して、キャラクタが倒れたら完成です。















ちなみに、RagdollとColliderの作る順番を間違えるとおかしくなるのでご注意を!