前回、声認識してcharacter particleというアセットで言葉を可視化するとこまではできました。
Flying Text3D
ただ、やっぱり3Dで表示したかったので、思い切ってアセットを買いました。
20ドルぐらい
レビューでもコエカタマリンできたって書いてあったので安心して買いました。
使い方
空のゲームオブジェクトにFlyingtext3dスクリプトを付けます。
add Fontで.bytes形式のフォントファイルを入れます。
そして下のCreate~で実行中じゃなくてもボタン一つで3D文字が作れます。
わお!(日本語化は下に書いてます)
また自分でスクリプトを作って
FlyingText.GetObject("I'm bibinba");
とstart関数などに書くと
表示されました!簡単。
FlyingText.GetObjects("I'm bibinba");
GetObjects(sをつける)とすると一文字位置文字バラバラになります。
フォント追加
IPAexフォント Ver.003.01(IPAexFont Ver.003.01) | IPAexフォント/IPAフォント
ttfフォントを.bytes拡張子にしたら読み込めます。
手動でやってもいいですが、Flyngtextコンポーネントの下のほうにConvertするところがあるのでそこでもできます。
あとは上のほうのaddFontから加えれます。
日本語化
そのままだと私の環境では日本語が文字化けします。
UTF-16にしないといけないそうです。
Note that if you’re using characters in strings outside the ASCII range and you’re using C#, your script must be saved with UTF-16 encoding. Unityscript users can use UTF-8 or UTF-16.
スクリプトファイルの文字エンコーディングについて
日本語(マルチバイト文字)を扱う場合、文字エンコーディングは以下にする必要があります。(ドキュメントのP.17参照)
- C#: UTF-16
- UnityScript: UTF-8 または UTF-16
私の場合はこちらのスクリプトをassetフォルダ以下において、Unityを再起動したら使えるようになりました。
UTFあたりはよくわかりませんね・・・
物理など
設定からColliderや
rigidbodyを付けることもできます
床の上に落ちてくれます。
シーン内で手動で床をドン!ってやったらバラバラになった!
音声認識を表示
「音声認識して、3Dの文字を出す」できました。
— bibinba(トマシープ) (@bibinbaleo) 2018年1月15日
みゅみゅさんのコメントが落ちてきてつかむとかもできそう。 pic.twitter.com/p8oxWUGSGL
こんな感じのスクリプトで、音声認識で受け取ったstringをランダム位置に上から文字が下りてくるようにしました。
なんかエラー出てたけど翌日になったら動いた。
最初はupdateObject関数を使っていたのですが、それだと同じ場所に文字が変わるだけなので、認識したときに一回だけ新しい場所から文字が降ってくるようにしました。
if (text != aa.kekka)
{
textObject = FlyingText.GetObject(aa.kekka, random, Quaternion.identity);
}
text = aa.kekka;
こんな感じでやったら変数の値が変わっているのを察知できました。
物理
rifidbodyとConvexmeshを付けます。
Physics Materialでどれくらい跳ねるかとか摩擦とかを設定できます。
また重力を減らして、ゆっくり落ちてくるようにするには、スクリプトを書いてもいいがProject setting>PhysicsからGravityで一括で変えることができる。
ちなみにみゅみゅさんの生放送ではtwitterやニコニコ生放送などのコメントがリアルタイムで上から落ちてきて、掴んで投げたりしています。楽しそう!
コメントの取得はニコニコに関してはアセットを公開してくださっている方がいます。
youtubeも記事はあった!
まあそもそもコメント来ないから使わないけど。
当たり判定
床に当たった時にドンっていう音を発生させたい。
生成される文字オブジェクトにvoid OnCollisionEnter (Collision col)っていうスクリプトつけるのどうするんだろうと思ったけど、床につければいいのか。
ちなみにflyingtextにつけるスクリプトに書いても反応なかった。
ぴゅー、ストン。
— bibinba(トマシープ) (@bibinbaleo) 2018年1月15日
っていういい効果音ないかな。
なんかあってない。 pic.twitter.com/JU5H2av9r2
とりあえずできました。2回床に当たるときはちゃんと2回音が鳴ってます。
文字をつかむ
VRTKを入れて文字をつかめるようにしたい。
ただ生成されるテキストにInteractableObjectなどのスクリプトを付けないといけないのだが、付け方がわからない。
スクリプトで動的につける方法が二つぐらいあるみたい。
ただaddcomponentはうまくいかないし(外部のコンポーネントだとエラーが出る??)、RequireComponentはあらかじめ何かひとつスクリプトをつけないといけない。
textObject.AddComponent(typeof(スクリプト名));
でできた。
ゲームを実行してから、生成されたものにGrabbable〜などをつけたら掴むことはできるけど、これを動的にやるのはどうするんだろう???
ちなみにつかめるようにするには、Window>VRTK>setup interactable~を開いて、オブジェクトを選択した状態でsetupボタンを押したら設定したようにつかめる。
頭から出す
前回同様、頭(自分)の位置から言葉を出して、ものに当てたい。
頭の位置を取得してそこから発射して、AddForceでその方向に力を加えたら良さそう。
Vector3 head = eye.transform.position;
Vector3 force = eye.transform.forward*300;
textObject = FlyingText.GetObject("スタート", head, Quaternion.identity);
textObject.GetComponent<Rigidbody>().AddForce(force);
こんな感じで一応最初のスタートは発射されました。
*300で力の強さが調整できます。ふわーんって発射したいな
色の変化
色をランダムで変えようと思ったのですができません!!!
まず直接変えるには<color=#7e1113>みたいなカラーコードを文字列のところに打つ必要があるのですが、Unityでカラーコード形式のランダム数値を作る方法がググっても出てこない。
FlyingText.GetObject("<color=#7e1113>スタート");
次にマテリアル経由で変える方法もやったのですが、GetObject関数の中にマテリアルを入れたらエラーが出る。
全部のパラメーターを書かないといけないっぽい。
textMaterial.color = rand;
Vector3 random = new Vector3(Random.Range(-12.0f, 6.0f), 4, Random.Range(1.6f, 6.0f));
textObject = FlyingText.GetObject(aa.kekka,textMaterial,null,1.0f,0.3f, 10,random, Quaternion.identity);
ということで書いたら、変わるけど、全部の色が変わる。
そうか、マテリアルは全部共通だもんね。
じゃあ"<color=#7ae090>スタ<color=#009090>ート"こういう感じで別の色にしたらどんな感じでマテリアル生成されるの?って思ってやったら一色なんですけど!はあ?なんですけど
よくわからないけど、必須スキルじゃないから無視しよう。
あとマテリアル変えるだけならGetObject関数の中にマテリアル書かなくても、勝手にマテリアル変わりますやんか。
最後に
ツイートが若干バズったせいで、自分の気持ち悪い声を1000回近く再生されることになった。
しかも最初の言葉が「世の中そんなに甘くないんだ!」だし。辛い。ちなみにこのセリフはおそ松さんのセリフです。
このブーメランをやりたいんだ!
詳しくはこちら
あとこちらの方は、音声認識とこのFlyingTextを使って作品を作ったそうです。