トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

言葉を可視化して戦うVRを作る【Part1】

 前回構想しました。

bibinbaleo.hatenablog.com

今回実装しました!!!!できた!!!!

ただやりながら書いたので恐ろしく読みにくいです。

方針

音声認識はこのアセットが使えそうということで買いました。 

bibinbaleo.hatenablog.com

サンプルを動かすことはできましたが、次は自分で書かないといけません。

Exampleスクリプトを見たらなんとかなるかと思いましたが、コメントもついていない長い他人のスクリプトを理解できる能力がまだなかったようです。

頑張ればできそうだけど、めっちゃ頑張らんと

 こちらの方のHololensでやったスクリプトも見ました。

github.com

 

声認識の方のスクリプトのいじり方がわからなかったので、最初はサンプルのcanvasを持ってくるというワークアラウンドな方法でやります。

これでトリガーとかスタートボタン機能を自分で作る必要がなくなります。

f:id:bibinbaleo:20180104204704p:plain

その上で、認識した言葉を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で設定しないといけません。

f:id:bibinbaleo:20180104204238p:plain

「こんにちは」なら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っていいうやつがいるらしいけどどういうことなんだろう?何を入れたらいいの???

docs.unity3d.com

unitylab.wiki.fc2.com

と思ったらBurstか

docs.unity3d.com

と思ったらBurstだとエラーが出まくる。なぜ??リファレンスの通りに書いているのに。

f:id:bibinbaleo:20180104220355p:plain

ググる

https://forum.unity.com/threads/shuriken-change-emission-burst-particle-count-at-instantiation.151259/

英語の方のEmitにはスクリプトも載っていた。

docs.unity3d.com

音声認識

デフォルトで日本語にするには

_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を押した時に認識が開始されます

f:id:bibinbaleo:20180105104242p:plain

これをゲームが始まった時からずっとオンにするには

        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にしてたのでエラーが出てしまいました。どっちに合わせたらいいんだろう?

f:id:bibinbaleo:20180104201239p:plain

 

 

違いました。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を使っているせいか、変数を呼び出せませんでした。

qiita.com

そんな時は呼び出す側のスクリプトにusing namespace名;でできました。

そして先ほどのように

        private void Update(){
            
            Text = aa.kekka;
        }

 こんな感じで受け取ったらできました!!!!

f:id:bibinbaleo:20180105104611p:plain

mizutanikirin.net

Unityでゲーム開発 -C#で文字列操作-

Power UIを使った3Dテキスト表示

汗人柱さんにPowerUIというアセットの中のText 3Dという機能が使えるのでは?と言及していただきました。

assetsale.hateblo.jp

早速使ってみました。

サンプルの中の21番Text3D

f:id:bibinbaleo:20180105104252p:plain

カメラが二つ生成されてゲーム画面に何も映らないので、PowerUI下のCameraをオフにします。

f:id:bibinbaleo:20180105104559p:plain

こんな感じで3Dの文字が出ます。日本語にする方法よくわからない。

f:id:bibinbaleo:20180105104554p:plain

text3Dというhtmlファイルから生成しているものと、C#スクリプトから生成しているものの2種類がありました。

f:id:bibinbaleo:20180105104255p:plainf:id:bibinbaleo:20180105104248p:plain

今回は動的に生成したいので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になりました! 

f:id:bibinbaleo:20180105104245p:plain

これで日本語ができて、かつこの文字にrigidbodyつけれて、動かすことができたら使えそうです。

最後に

結局flyingText3Dという立体化できるアセットを買いました。

 

bibinbaleo.hatenablog.com