LotosLabo

プログラミング技術とか気になった情報を載せていきます

穴に棒を入れたかったが、拒まれて入れられなかった件【Unity】


Blenderで作成したTorusモデルをUnityに持ってきて、
MeshColliderをつけたが棒をうまく貫通してくれなかった。


輪っかの設定はこのようにしている。

f:id:lo25131:20170629033832j:plain:w500

f:id:lo25131:20170629033945j:plain:w500



それで原因を調べてみたところ、凸型メッシュを凹型メッシュにはめ込むことはできないらしい。逆も。

どうしても棒を差し込みたいのであれば、複数のプリミティブなコライダーを組み合わせてあげるとのこと。

https://forum.unity3d.com/threads/how-to-make-a-ring-collider-or-torus-collider.440035/




雑ですがこんな感じで。


f:id:lo25131:20170629034036j:plain:w500



そしてこのプリミティブコライダーを簡単に配置してくれるAssetもありました。


https://www.assetstore.unity3d.com/jp/#!/content/62611


f:id:lo25131:20170629034504j:plain:w500


 
こんなの常識だろ、タイトルで釣るなよ!ちょっと期待したじゃないか!!
という方はごめんなさいでした。

UnityでカスタムURLスキームを使用してアプリを起動する【iOS】【Android】

はじめに

今回投稿する内容については、他のサイト様でも紹介されている方法を参考にしてみて、
起動までの確認や方法のメモとなります。


独自のカスタマイズしたURLを使用して、アプリを起動してみました。
カスタムURLスキームとは例としてあげるとこのような形です。

myScheme://

この「myScheme」が独自のスキーム名となります。

今回はWebサイトを用意して、ブラウザ上のリンクをタッチしてカスタムURLスキームからアプリ起動、
またパラメーターを渡してアプリ側へ表示というのやってみたいと思います。


[用意した簡単なWebサイト]

f:id:lo25131:20170627023042p:plain:w500


Unity側からスキームやパラメーターを指定できる方がよかったかもしれない。


今回のスキーム起動までの流れ

[1] Unityから外部ブラウザですでに用意したサイトを開く(Unity)
[2] サイト上のリンクをタッチする
[3] アプリ側へ値を受け渡す(iOSAndroid)
[4] アプリ側で値を受け取る(Unity)



[1] Unityから外部ブラウザですでに用意したサイトを開く(Unity)


今回は受け取ったパラメーターを表示するため、Webサイトを表示後、
受け取ったデータをコールバックで呼び出して表示します。
ドメイン名は伏せています。

今回はテスト用に作ったページなので、HTTP通信ですが
確かiOSでは申請周りでHTTP通信だと注意かリジェクトされたかと思うのでご注意ください。


Application.OpenURLでサイトを開きます。
また、この後説明しますが、Unity側で値を受け取るため
サイトを開く前にオブジェクトを生成してあげています。



[2] サイト上のリンクをタッチする

リンクをタッチする
iOSであればアプリを開くかどうかの確認のダイアログが出るかと思います。
f:id:lo25131:20170627023042p:plain:w500



[3] アプリ側へ値を受け渡す(iOSAndroid)

iOS側>

スキームを起動の処理をがすでに用意されているので、
基本は起動できるスキームを設定してあげるだけになります。

ただ今回は起動したスキームのパラメーターもUnity側へ受け渡すことになるため、
スキーム起動の処理を行っているクラスを継承した上で、渡す処理を作成します。


【スキームの設定】
スキームの設定はUnityのEditor上で行なえます。
File->Build Settings->iOS->Player Settings->Supported URL schemes

今回はスキーム名を「schemeTest」としたので、一つだけ設定しました。

f:id:lo25131:20170627042302p:plain:w500


【スキーム起動してパラメータをUnity側へ渡す】
スキーム起動の処理を行っているクラスを継承して、
Unity側へスキームを渡す処理を作成します。
スキーム起動を行っている処理は"UnityAppController"なのでこれを継承します。


スキーム起動の処理には、openURLというAPIが使われているのですが、
このAPIiOSのバージョンによって書き方を変える必要があるので、今回はバージョンも分けて記述しています。

Unity側へ値を渡すために、UnitySendMessageというものを使用しています。
第一引数にオブジェクト名、第二引数にメソッド名、第三引数に渡すパラメーターとなっています。



また、この記事を書いている途中にopenURLがiOS10から変わったというのを見つけました。
ただ現状iOS10でもこちらで動いているので、いつか試す機会があったらこちらもバージョン分けして追加します。
dev.classmethod.jp


最後にこの作成したファイルをUnityのAssets/Plugins/iOSの中に入れます。


Android側>

Android側についても今回はUnity側にパラメーターを受け渡す必要があるので、
スキームの設定だけでなく、処理も作成していきます。

まずUnityでAndroidのPlugin読み込むためには.jarファイルとして、書き出されたものが
必要なのでこれを作っていきます。

作成するための環境としては、EclipseやAndroidStudioなどがあると思いますが、
今回はEclipseを使用して説明していきます。

インストールの手順からは説明しませんが、
プラグインの作成までの流れを簡単に説明します。


Eclipseインストー
② AndroidSDKやJDKをインストー
EclipseAndroid開発用のPluginをインストー
④ 新規プロジェクト作成からAndroidアプリケーションプロジェクトで作成(設定はDefaultでOK)
⑤ パッケージ内にスキーム起動用のJavaクラスを作成
⑥ 作成したクラスを.jarファイルとしてエクスポートする
⑦ .jarファイルをUnityに入れる
⑧ スキーム起動アクティビティの設定をAndroidManifestに追記する


①〜④については割愛します。


⑤ パッケージ内にスキーム起動用のJavaクラスを作成

新規でクラスを作成します。

SchemeIntentActivityというクラス名で作成しました。
ここではUnityActivityを継承して、アクティビティの遷移や
スキームパラメーターの受け取りを行っています。

Unity側へスキームのパラメーターを送る際にはiOSと同じように
UnitySendMessageを使用しています。


また、Unityのクラスを使うのでUnityからclasses.jarというファイルを持ってきます。

Unityをインストールしたファイルのこの中にあります。
※Unityのバージョンによっては場所が異なるかもしれません。
/Applications/Unity/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Classes/classes.jar


このファイルをEclipseのプロジェクトに追加していきます。
プロジェクトを右クリックして、ビルド・パス→ビルド・パスの構成→
ライブラリタブ→外部JARの追加を選択から対象のファイルを選択します。

追加後は一度、メニュのプロジェクトタブからクリーンをしてあげてください。


⑥ 作成したクラスを.jarファイルとしてエクスポートする

作成したクラスを右クリックして、エクスポートを選択してください。
ダイアログが出てくるので、Java→JARファイルを選択。

エクスポート対象のファイルが選択されていることを確認して、
エクスポート先を指定して、完了を押してください。


⑦..jarファイルをUnityに入れる

Assets/Plugins/Androidの中に作成された.jarファイルを入れてください。


⑧ スキーム起動アクティビティの設定をAndroidManifestに追記する

AndroidManifestに追記していきます。
UnityProjectのAndroidManifestは一度Android向けにBuildを行うと、
Projectファイル内のTemp/StaginArea/AndroidManifest.xmlとして作られます。


こちらをPlugins/Androidの中に入れて追記をしていきます。


少し長いですが、13行目〜20行目ちょうど追記部分となります。
スキーム名はアプリごとに決めたものに変更してください。



[4] アプリ側で値を受け取る(Unity)

最後に[1]で生成したクラスでスキーム起動で渡されたパラメータを受け取ります。
受け取った後、[1]のSchemeController.csのUrlReceiveに渡してあげて、
パラメータをクエリごとに分解してあげます。


うまく受け取って表示されれば成功です。

うまく受け取れなかった場合

ネイティブプラグイン作成中によくあったこと


iOSの場合)

・スキームは起動するけどUnity側へ値が渡されていない。
UnitySendMessageで指定しているオブジェクト名やメソッド名が、
Unityで指定している名前と異なってるかもしれませんので確認してください。

またはObjective-cの場合他のところで継承しているともう一方の場合のほうが
優先的に呼び出される場合があるかもしれません。
今回だとUnityAppControllerが他のところで継承されていたり。。

この場合は他のところで呼ばれているところに今回のスキーム処理をいれるなど
してください。
もしかしたら他の方法もあるかも…


Androidの場合)

・スキーム起動しようとしたら落ちた、アプリが立ち上がらない

UnityのActivityが取得できていない、もしくはAndroidManifestに記述したパッケージ名が
異なっている可能性が考えられます。
Activityが取得できない場合はUnityPlayerActivity.classではなく、
UnityProjectで使用しているMainActivityを取得する方法でうまくいくかもしれません。


また、同じスキームが指定されているアプリが複数、端末内に存在した場合は
正常に起動しない可能性があるので気をつけてください。

まとめ・感想

OSごとにネイティブ用の処理を書かないといけなかったり、特に
Androidの場合は環境から用意したりと、一から調べていかないと分からなかったので結構大変でした。
ただ、一度やり方さえ覚えれば他のプロジェクトで流用できるものなのでプラグインの処理を作成する
勉強にもなりました。


また、前回紹介させていただいたSFSafariView上でも今回のスキーム起動はできるので是非合わせて使ってみてください。
ちなみにWebViewでは動きませんでした。

環境

Unity5.6.1f1
Ecliipse Neon 4.6.3
Xcode 8.3.3

試した端末OS
Android OS 7.0
Android OS 6.0
iOS 10
iOS 9
iOS 7

UnityからSafariViewを表示させる

Appleさんから外部ブラウザへ飛ばさないように。
WebViewかSafariViewで表示してくれ!
と来ていたので、試してみました。

◆ SafariViewってなに?

iOS9から使用できるWebViewの機能を持った、アプリ内からWeb画面を表示できるもの。
Safariブラウザとの見た目の違いは、完了ボタンがついたり、Urlが変更できないことぐらい?


◆試してみる

まず今回やることとしては、iOS9未満ではSafariViewが使用できないので、外部ブラウザで表示します。
iOS9以上はSafariViewを表示するものとしていきます。

また、Unity上でApplication.OpenURL(ブラウザで指定したURLを開く処理)を呼んだ際に、
iOSのネイティブ側でフックする処理があれば、iOS9のときは自動でSafariViewに飛ばすよという処理を書けたのですが、
見つからなかったので、Unityとネイティブでごにょごにょ書いていきました。


今回やったことのまとめです。

1.iOSネイティブ側でSafariViewを表示する処理を記述
2.iOSネイティブ側でSafariViewをUnity側から呼び出す処理を記述
3.Unity側でiOS9以上のときはネイティブからSafariViewを表示する処理を呼び出す、それ以外は通常のOpenURLを呼ぶ


以下、サンプルコードです。



【Unity側】


ボタン押したときに指定したURL(Googleさん)を開くようにしています。
iOSのバージョンですがUnityのAPIからでは、バージョン入りの端末名のみしか取れず、
確かiOSのバージョンによって名前が異なっていたような気がしたので、
ネイティブからiOSのバージョンを取得する処理を書いて呼び出しています。

f:id:lo25131:20170621035313p:plain:w300



iOS側】


※SafariViewを表示するにあたり、フレームワークも必要となるので
Unity上でSafariViewClass.mmを選択して、Framework dependenciesから
Rarely used frameworksのSafariServicesにチェックを入れてください。


見た目こんな感じ(iPad
f:id:lo25131:20170621040422p:plain:w600



◆まとめ

アプリ内から外部ブラウザへ誘導させるような挙動はAppleさんからNGとされているので、
WebViewで表示するか、iOS9以降であればSafariViewでの表示が推奨とされているようです。
今回 Unity Safariviewとかで検索しても出てこなかったので、記事を書かせていただきましたが、
少しでも参考になってもらえるとありがたいです。

また、今回iOSのネイティブ処理を書くのが初めてだったので、
ここはこうした方がいいとかあればご教示いただけると幸いです。


VRZONEに行ってきました

f:id:lo25131:20160609211641p:plain


今回体験したのは、4つ。
順番に脱出病棟、高所恐怖症体験、アーガイルシフト、スキーロデオ


まずVRZONEに入ると、Suicaのチャージ機のような機械がお出迎えしてくれました。
f:id:lo25131:20160609212029p:plain


VRZONEではコンテンツを体験するためにバンダイナムコポイント(バナポイント)が必要になります。
そのため、ポイントをチャージするカードとポイントをチャージしてからようやく体験することができるのです。

今回も多くの方がこの機械を利用されていて列ができていたので、VRZONEに行く前にあらかじめ、
バナパスポートカードとバナポイントをチャージして置くことをおすすめします。
カードはゲームセンターなどでも販売しています。



【脱出病棟】

f:id:lo25131:20160609212728p:plain


ホラー系のVRコンテンツ


今回は4人で体験してきました。
椅子に座りながらレバーの操作で、車いすを操縦させ病棟を脱出していくのですが、
椅子に座ってることもあり前から来てもほぼ逃げれない状態でした。


最初に脱出ルートを選び道順に沿って前進していくのですが、
所々に人をギコギコしちゃってる人や、死体袋?がぶら下がってたりと
心臓バクバクさせながら、いつ襲ってきてもいいように待ち構えてました。

しかし、いざ来るともう叫ばずにはいられない。
おっさん4人で叫びまくってました。

右手に懐中電灯を構えているのですが、これが唯一の心強い味方で、
流石に途中で点かなくなったりしないよな と少し不安になりながら
もブルンブルン振り回してました。

個人的に一番怖かったところとしては、曲がり角やドアを開ける瞬間でした。
来るとわかってるんですが、思わず腰を引いてしまうほどの怖さでした。

最終的に脱出付近まで行ったんですが、
最後の最後でゲームオーバーになってしまいました。
あの引っ掛けは酷いです…


体験していて所々見渡してみたのですが、解像度はバリバリ高いって感じではないですが、
光の明暗をはっきりさせていて、音や周りの雰囲気にこだわっていた気がします。
また敵のギコギコアニメーションも必見です。

ただ少々最初の説明の文字がボヤケていたかなと感じました。


終わった後一時間ぐらい心臓バクバクしてました…



【高所恐怖症】


f:id:lo25131:20160609221106p:plain


高所体験を味わうコンテンツ

上空200mにある板の上を歩いて、猫を救います。
ただこの板が普通に歩いてもグラグラするので、VR内でその上を歩こうとすると
バランスをとることすら難しくなります。

ただ私自身高所恐怖症ではないので、
それほど怖さと高いところにいるんだなとは感じませんでした。
あまり下を見ずに体験しなかったというところもあるかもしれません。

そもそも最初にここの上を渡っているんだなと自覚してしまったため、
怖さがかなり激減してました。
怖さというより、バランスを取ることだけに集中してました。



このコンテンツではプレイヤーが動くため、機器のコードが絡まないようにと
スタッフの方がせっせせっせとコードを移動したりしながらやっていました。
ただ、たまにプレイヤーに触っちゃってる時があるので、それは気をつけて欲しいところです。


猫に関しては、リアルではこれ。
f:id:lo25131:20160609223329p:plain


ですが、VR内ではちゃんとした猫でした、
ただ早く振り回すとトラッキングが遅れてトランザム状態になってました。


4人共無事に渡り切ることができてしまったので、
落ちるシーンを見ることができなくて残念です。




【アーガイルシフト】

ロボゲー

f:id:lo25131:20160609225107p:plain


コックピット中の視点から、ロボットを操作して敵を撃退するゲームです。

操作としてはロボット自身を前進後退はできないものの、専用の椅子に取り付けられている
二つのレバーで銃を動かして、ボタンを押すことで射撃ができます。

f:id:lo25131:20160609230343p:plain


このコンテンツで一番魅力的だったのは、隣に座ってるアイネちゃんというパートナーの女の子でした。
ものすごく近いところまで近づいてくるので、実は触れるんじゃないだろうか。と
胸の近くに手を伸ばしてみましたが、無理でした。


ゲームとしては、敵に対してレバーのボタンを押して射撃するのですが、
ロックオンマーク?がどの敵にもついてて、誘導弾なのかとおもいきや
自分で狙わなくてはならなくて、目の前にきて爆破というのが多かったと感じました。

また、コックピットの中をよく見せるため、視点の大半がコックピットとアイネちゃんなので、
その隙間の窓から敵を覗いて撃つというのは正直難しいところがありました。

シューティングを楽しむというよりは、アイネちゃんをみて楽しむのが目的なのかも…


全体的にですが、FPSが少しだけ低いのかなと…
首を左右に振ってみましたが多少ですが遅延を感じました。
またコントローラーの入力からの動きにも結構な遅延があったため改善していって欲しいところです。


ナレーターのおねぇさんが美人でした。
声がよかった。ほんとうに



【スキーロデオ】

スキーゲー

f:id:lo25131:20160609231942p:plain


実際にスキーをしているかのように感じるゲームです。


ダイエットマシンのスカイウォーカーみたいなものに乗って、
足を左右に動かすことで左右に方向の切り替えをしながら、斜面を滑っていきます。


壁や崖から落ちずにずっと滑っていると、かなりのスピードが出てとても疾走感がありました。
また、前から風が送られてくることで、本当にスキーをしている感じがあります。

ただ操作がとても難しく、思うように曲がってくれないのでみなさん壁にぶつかったり、
崖から落ちまくってるようです。
ちなみに私はクリアしました。

今回体験した中では、ゲームをやってるという感じが一番出てました。
繰り返しやってもっと難しいステージとかにも挑戦してみたいです。



まとめ

全体的にクオリティが高く、これはお金を払っても十分なコンテンツだったと思います。

ただ一つ、回転率を上げるためか機器を装着して調整する時間もスピーディに行っているため、
人によっては機器に設定されているIPDと自分のIPDが合わず、ぼやけたまま体験している方がいました。

その少しのぼやけがVR酔いにも繋がる恐れも無きにしもあらずなので、
装着の時にはスピーディかつ丁寧に、また、体験者がぼやけたまま体験をさせないようにも
何らかの対策が必要だと思います。

最後に、ホラーゲームが苦手な方は脱出病棟はオススメできません。
後から身体の節々が痛くなります。

Unity5.3.5だとGoogleVRSDKでuGUIが表示されない件

Unity5.3.5、5.3.4p6でuGUIのUIを表示しようとしたのですが、うまく表示されません。

前のバージョンの現在確認できたところでUnity5.3.4p1、Unity5.3.4では表示されました。

一応、Stereo ControllerのUpdate Streo Cameraをクリックすると一瞬表示はされます。
原因がいまいちわからないので、とりあえず表示されるバージョンを使ってきましょうか。

Unityでジェスチャーによる文字・形の認識

Unityでマウスジェスチャーによる文字や形の認識する方法を探してみました。

要はこういうこと。


f:id:lo25131:20160224010559p:plain

お絵かきした形や文字を認識して、文字として出力させたい。


1.「Gesture Recognizer」

f:id:lo25131:20160224005329j:plain
https://www.assetstore.unity3d.com/jp/#!/content/47326


AssetStoreで販売されている、マウスジェスチャによって形を認識するAssetです。
あらかじめ認識しておきたい形を記録しておき(座標情報など)、
そのデータを基づいて形を認識しています。


使ってみた感想としては、形、文字両方の認識を行ったのですが、
形に関しては書き始めの位置があっていれば、高確率で正しく認識されました。
ただ、文字(今回は数字を認識)に関しては、似たような形が多いせいか、
誤認識がよく見られました。

もし、ゲームなどに導入するときには、これは音声認識でもそうだと思いますが、
認識精度を上げるために検出可能なジェスチャーを少なくしておくことをおすすめします。

紹介させていただいたのはサンプルのゲーム付きの方ですが、スクリプトのみの方も
AssetStoreで配信されています。

サンプルのコードをそのまま用いればすぐコンテンツへの導入も可能なので、
是非試してみてください。$15の価値はあると思います。




2.「手書き文字認識API


Docomoさんで紹介されている手書き文字認識APIです。
文字の筆跡データをもとに、文字を認識します。


一文字のみの認識となります。
認識にはHTTP通信でXML/JSONで取得が可能です。



【利用方法】

PUXさんのデベロッパーサイトにて登録を行い、
APIキーを発行します。
ユーザ登録時に、評価版APIキーを発行するかどうか聞かれるので、その時に発行します。



ユーザ登録後、APIキーとドメイン名がメールにて届くので、
それを基に通信を行います。

APIの詳しい利用方法については、Docomoさんのデベロッパーサポートサイト
に記載されていますので、そちらをご参照ください。


実際に使用してみた感想としては、送るパラメータによって、
認識して欲しい文字を絞れるので、欲しい情報をより正確に取得することができると思います。
すこし雑に書いたとしても認識してくれるので精度は結構高いと思います。

しかし、オンライン環境でしか動作しないところがネックですね…




まとめ


上記で紹介した二つは、AndroidiOSの両方の環境で動作することも確認できました。
ただスマホタブレット手書きとなると、正確に文字を書くコンテンツを開発するとなると
ユーザはペンと大きい画面を有したタブレットが必要になってきますね。

今回はUnityで3DSでの開発ができるようになる?!という情報があったので、
Unityで手書き認識を試してみました。この技術を用いて脳トレや学習アプリ的なものを作ってみたいですね。


参考にさせていただいたサイト様


ユニティちゃんを自由に喋らせた

はじめに

こんなの作りました。




昨年12月に提供が開始された「VOCALOID SDK for Unity」を使用して作ってみました。

テキストボックスに入力された文字列を取得して、リアルタイムで合成して発声させています。
また、文字列の母音を取得して、SDユニティちゃんにリップシンクさせるようにしています。

開発にあたって

まず公式で公開されているSampleProjectを参考に、自分で発声させたい音声を決めて、
Playback合成RealTime合成を行ってみました。
そこからリファレンスを眺めたり、試しに卑猥な言葉も喋らせたりもしてみました。

また、声高を変えて歌わせてもみた(うまくいってはいない


そしてこれを使って何かゲームを作れないかと考えてみたのですが……



思いつかない。。




とりあえず音ゲーかなと思ったのですが、リアルタイムの魅力をどこに引き出すのか?
と疑問に思って考えるのをやめました。

で、そんなときにとあるリプライを頂きました。



これだ!!
Unityちゃんをデスクトップに置いて、
言葉(卑猥な言葉)を自由に喋らせるようにできれば…


開発開始!


とりあえずSDUnityちゃんを用意して、アニメーション、リップシンク、瞬きを行うようにしました。

次にテキストの入力部分についてですが、ユニティちゃんが喋れるのはひらがなだけです。
例えば、漢字、英語、記号といった文字はうまく発音してくれません。


その対策としてまずは根本から、uguiのテキストボックス(Input Field)でContent Typeを「Name」に設定しました。
これで日本語とアルファベットしか入力できなくなりました。


次に漢字に関してですが、こちらについては別途記事にて紹介させていただきました。


lo25131.hatenablog.com


このAPIを使うことでひらがなに変換することが可能になりました。


もちろんこれだけではうまく発音してくれません。

「きゃきゅきょ」のような文字は、文字数として、6文字ですが
実際に発音するときは「き」と「ゃ」を一緒に含めて発音するため、発音数は3文字となります。
その影響で合成発音時にズレが生じて最後に余って発音されてしまいました。

また同様に「っ」のような文字も実際に発音しないので、これも発音カウントに含めてはなりません。


このような対策も含めて3日(1日2時間)ぐらいで完成しました。



まとめ

YoutubeではUnityの環境から撮影したものですが、DeskTopMascotMakerを使用することで、
DeskTopにSDUnityちゃんを配置して、入力した言葉を喋れるようにすることに成功しました。

しかしまだ当然満足はいっていません
夢はAIアバターの作成…


とりあえずこの2週間ほどVOCALOID SDK for Unityをずっと触ってましたが、
実際にUnityで曲を作るとなると、やはりVocaloidDTMの知識が必要となってきます。
また現時点では歌詞のノートへの追加がすべてプログラムで行うので、かなり手間がかかります。

もういっそのことUnity内でVocaloid Editor作ろうかなとも考えたのですが、それは時間があったときに作れればいいなと

ライセンス


f:id:lo25131:20140607195201p:plain

このコンテンツは、『ユニティちゃんライセンス』で提供されています。


本コンテンツにはヤマハ株式会社の
VOCALOID SDK for Unity」が使用されています。
VOCALOID(ボーカロイド)」ならびに「ボカロ」はヤマハ株式会社の登録商標です。



supported by goo