前回構想しました。
今回実装しました!!!!できた!!!!
ただやりながら書いたので恐ろしく読みにくいです。
方針
音声認識はこのアセットが使えそうということで買いました。
サンプルを動かすことはできましたが、次は自分で書かないといけません。
Exampleスクリプトを見たらなんとかなるかと思いましたが、コメントもついていない長い他人のスクリプトを理解できる能力がまだなかったようです。
頑張ればできそうだけど、めっちゃ頑張らんと
こちらの方のHololensでやったスクリプトも見ました。
声認識の方のスクリプトのいじり方がわからなかったので、最初はサンプルのcanvasを持ってくるというワークアラウンドな方法でやります。
これでトリガーとかスタートボタン機能を自分で作る必要がなくなります。
その上で、認識した言葉をcharacter particleに渡す部分だけ書き加えます。
Character particle側
発射する文字をスクリプトから変えるのは意外に簡単でした。
character paerticleにgivemojiスクリプト内のgiveという文字列を渡しました。
最初の方をTextにして
public class CharacterParticlegive : MonoBehaviour
{
#region Property
[Tooltip("characters to emit")]
[SerializeField]
private string _text;
public string Text//////ここ
{
get
{
return this._text;
}
set
{
this._text = value;
this._charactorIndex = 0;
}
}
後ろの方にUpdate()を作ってその中に、
(渡すスクリプト名).(stringが入っている変数)
でできました。
private void Update(){
Text = givemoji.give;
}
ちなみにパーティクルを発射するときの数をEmissionで設定しないといけません。
「こんにちは」ならCountを5にしないと、ここで設定した数しか文字が発射されないのです。
これをスクリプトで変えれるのか試しました。
文字列の長さ(文字数)を取得する - .NET Tips (VB.NET,C#...)
文字の長さはtext.Lengthでint形式に取れるそうです。
そしてパーティクル発射数はEmit (数);でできるらしいです。
public class givemoji : MonoBehaviour {
public static string give;
public static int len;
public ParticleSystem a;
// Use this for initialization
void Start () {
give="こおろぎ";
if (give != null)
{
a.Emit (give.Length);
}
}
こんな感じでやりましたが、変わりませんでした!
public void Emit(ParticleSystem.EmitParams emitParams, int count);
emitParams パーティクルのプロパティーを上書きします。
emitParamsっていいうやつがいるらしいけどどういうことなんだろう?何を入れたらいいの???
と思ったらBurstか
と思ったらBurstだとエラーが出まくる。なぜ??リファレンスの通りに書いているのに。
ググる。
英語の方のEmitにはスクリプトも載っていた。
音声認識側
デフォルトで日本語にするには
_languageDropdown.value = _languageDropdown.options.IndexOf(_languageDropdown.options.Find(x => x.text == Enumerators.LanguageCode.ja_JP.ToString()));
ここのen_GBをja_JPにします。
またデフォルトでは、voice Detection Enabledのトグルがオンになっていて、かつstart Recordを押した時に認識が開始されます
これをゲームが始まった時からずっとオンにするには
void Update(){
_speechRecognition.StartRecord(true);//スタート
}
Update内で_speechRecognition.StartRecord(true);にしておけば良さげ。
音声認識側はphrasesという名前のstringsに認識した言葉を入れているようです。
そしてそれをListに入れている??Listってなんなんだ
public void ApplySpeechContextPhrases()
{
phrases = _contextPhrases.text.Trim().Split(","[0]);
if (phrases.Length > 0)
_speechRecognition.SetContext(new List<string>() { phrases });
}
public static string phrases ;をトップに書いています。
受け取る側はstringにしてたのでエラーが出てしまいました。どっちに合わせたらいいんだろう?
違いました。Exampleの結果が表示されているところを見ると
if (obj != null && obj.results.Length > 0)
{
_speechRecognitionResult.text = "Speech Recognition succeeded! Detected Most useful: " + obj.results[0].alternatives[0].transcript;
という感じでobj.results[0].alternatives[0].transcript;に結果が入っていました。ちゃんとstring形式!
ということで同じ場所に
kekka = obj.results[0].alternatives[0].transcript;
を書いて public static string kekka ;をトップに書きます。
再びcharacter particle側
音声認識のスクリプトがnamespaceを使っているせいか、変数を呼び出せませんでした。
そんな時は呼び出す側のスクリプトにusing namespace名;でできました。
そして先ほどのように
private void Update(){
Text = aa.kekka;
}
こんな感じで受け取ったらできました!!!!
できたああああああ
— bibinba (@bibinbaleo) 2018年1月4日
声認識してcharacter particleに渡せた!!!!!
ちゃんと言葉ごとに変わるし!!!!!!!
頑張った!いいこ!やればできる子!
めっちゃワークアラウンド的なことしたけど。 pic.twitter.com/BsGcZCpIgj
Power UIを使った3Dテキスト表示
汗人柱さんにPowerUIというアセットの中のText 3Dという機能が使えるのでは?と言及していただきました。
早速使ってみました。
サンプルの中の21番Text3D
カメラが二つ生成されてゲーム画面に何も映らないので、PowerUI下のCameraをオフにします。
こんな感じで3Dの文字が出ます。日本語にする方法よくわからない。
text3Dというhtmlファイルから生成しているものと、C#のスクリプトから生成しているものの2種類がありました。
今回は動的に生成したいのでc#の方をいじります。
text 3d exampleスクリプトの、メッセージを受け取るとこ( msg.innerHTML)に、音声認識したものを入れます。
void Start(){
}
void Update(){
var document = GetComponent<PowerUI.Manager>().Document;
var msg=document.getElementById("message");
msg.addEventListener("animationiteration",delegate(PowerUI.AnimationEvent e){
// Write out the next message:
msg.innerHTML=aa.kekka;
Debug.Log(msg.innerHTML);
// Cycle index:
});
}
}
するとできました。helloと言ったらhelloになりました!
これで日本語ができて、かつこの文字にrigidbodyつけれて、動かすことができたら使えそうです。
最後に
結局flyingText3Dという立体化できるアセットを買いました。