トマシープが学ぶ

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

音声認識でソフト&ウェットとザ・ワールド【Unityでジョジョ再現シリーズ】

 前回カラーチェンジをしました。

bibinbaleo.hatenablog.com

今回はLeapMotionでシャボン玉に物体を包ませるのと、音声認識でザ・ワールドをします!

完成品はこちら

youtu.be

ジョジョ×LeapMotion

LeapMotionで実装できそうなスタンド能力をまとめた。触る系のやつ

3部
子供にする(アレッシー)
磁石にする(マライア)


4部
破壊物を元に戻す(クレイジーダイヤモンド/東方 仗助)
触れるものを透明化(赤ちゃん)
重くする(エコーズアクト3)


5部
生命を与える。(ジョルノ)


8部
シャボン玉で包んで飛ばす。

参考

スタンド一覧表

生命を与えるとシャボン玉で包んで飛ばすがやりたい!

今回はシャボン玉

ジョジョリオン 18 (ジャンプコミックス)

ソフト&ウェット

ジョジョリオンで定助がシャボン玉で何かを包んで運ぶシーンが何個かあったのでそれをLeapMotionで再現してみたいと思います!

包んでたのはネジと鍵とイチイの実が主かな~

xn--w8jtkjf8c570x.com

とりあえずカギとネジを用意

poly.google.com

poly.google.com

昔シャボン玉を作った。

bibinbaleo.hatenablog.com

今回は原作同様星マークを付けました。

f:id:bibinbaleo:20190223110646p:plain

テクスチャ

f:id:bibinbaleo:20190223110654p:plain

シャボン玉は布にする必要はないかな

f:id:bibinbaleo:20190223110650p:plain

触ったらシャボン玉の中に入る

手と物体が衝突したら物体の位置が常にシャボン玉の位置になるようにします。

qiita.com

衝突は

public void OnTriggerStay(Collider other)
{
 if (other.tag == "key")
 {
  a = 1;
 }
}

でとれる。

シャボン玉の位置は時間ごとに変わるからUpdate内で更新したい。

けどOnTriggerStayはupdate的な挙動をしない。

Update内でOnTriggerStay();を呼び出したら、()の中にコライダーを指定しないといけないみたいだけど、何を入れたらいいか分からなかった。

teratail.com

Collider otherのotherのオブジェクト情報をUodate内で使いたいけどやり方がわからない。

(せっかく周りに強い人が居たんだから誰かに聞けばよかった。)

 

結局ワークアラウンドな方法を使った。

あらかじめpublicで鍵のゲームオブジェクトを持ってきておく。

衝突したらflagでUpdateで伝えて、それの位置をシャボン玉に変えてる(伝わらない)

otherの位置情報を変えるんじゃなくて、決め打ちでオブジェクトを動かしてる。

void Update()
{
 tmp = shabon.transform.position;

 if (a == 1){
 key.transform.position = tmp;
 }
}

public void OnTriggerStay(Collider other)
{

 if (other.tag == "key")
 {
  a = 1;
 }
}

 

シャボン玉を動かす

シャボン玉をどう動かそう?

今とりあえず簡単に動くために人差し指の「子オブジェクト」にしている。

人差し指の先にシャボン玉があるのはかっこいい

f:id:bibinbaleo:20190223162750p:plain

これはこれでいいので、鍵を取り込めたらこの親子関係を切って、適当なシャボン玉っぽいアニメーションにする。

親子関係を切るのは簡単だった!

子.transform.parent = null;www.sawalemontea.com

ふわふわさせるのはitweenでやればよさげ

veniegames.com

まんまお借りしました。

void FixedUpdate()
    {
        if (a == 1)
        {
            frameCnt += 1;
            if (10000 <= frameCnt)
            {
                frameCnt = 0;
            }
            if (0 == frameCnt % 2)
            {
                // 上下に振動させる(ふわふわを表現)
                float posYSin = Mathf.Sin(2.0f * Mathf.PI * (float)(frameCnt % 200) / (200.0f - 1.0f));
                iTween.MoveAdd(syabon, new Vector3(0, amplitude * posYSin, 0), 0.0f);
                iTween.MoveAdd(syabon1, new Vector3(0, amplitude * posYSin, 0), 0.0f);
            }
        }

上下にふわふわできた。

本当はもっとシャボン玉っぽい挙動を実装したかったけどやり方がわからない。

ランダムで位置移動するようにしたらいいのかな〜

音声認識

この親子関係を切ってふわふわさせるという動作のトリガーを音声認識でします。

LeapMotionの操作中ってマウスもキーボードも押せないから音声認識がいい。

以前音声認識をやった時はIBMのワトソンとかGoogleのとか外部のやつを使った記憶があります.

bibinbaleo.hatenablog.com

bibinbaleo.hatenablog.com

しかしUnityのコードだけで実装できるそうです。(Windows10限定)

こちらの記事のコードをお借りしました。

qiita.com

何の設定をしなくても認識してくれました!

日本語も英語も!

めっちゃ簡単!!!精度も良かった!!

docs.unity3d.com

セリフは

「soft and wet」「soft」

「ザ・ワールド」「ワールド」

「そしてときはうごきだす」「うごけ」

のように一つの反応してほしい単語につき何種類か予備単語を登録できます。

    void Start()
    {
        keywords = new string[3][];
        keywords[0] = new string[] { "soft and wet", "soft" };//ひらがなでもカタカナでもいい
        keywords[1] = new string[] { "ワールド", "ザワールド" };
        keywords[2] = new string[] { "そしてときはうごきだす", "うごけ" };

        keyCon = new KeywordController(keywords, true);//keywordControllerのインスタンスを作成
        keyCon.SetKeywords();//KeywordRecognizerにkeywordsを設定する
        keyCon.StartRecognizing(0);
        keyCon.StartRecognizing(1);
        keyCon.StartRecognizing(2);//シーン中で音声認識を始めたいときに呼び出す
                                   // keyCon.StartRecognizing(1);
    }

周りに人がいたのでデバッグ中は右側のセリフしか言ってなかったのですが、左の長いセリフも反応したり反応しなかったりします。

でも発表の時左で言ったら全然反応しなくて恥ずかしかったよ!

 

シャボン玉の形がゆがむ

指の先につけたシャボン玉の形が楕円になってしまいます。最初カメラが歪んでるのかと思った。

f:id:bibinbaleo:20190223162750p:plain

これは親のTransformの影響を受けているためです。

f:id:bibinbaleo:20190223162747p:plain

f:id:bibinbaleo:20190223162744p:plain

昔同じような状況になってteratailで相談した。

teratail.com

L_index_cを無理やり1にしたいいか分からなかったので、とりあえず無視します。

ただソフト&ウェットを使って指との親子関係が切れた後も楕円になってしまっているのでそれは無理やりスクリプトで正しい形にしました。

          syabon.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
          syabon1.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);

ザ・ワールド

シャボン玉の動きはiTweenの

  iTween.Stop(syabon, "move");

で止められました。

increment-log.com

それだけじゃないで何か別の動くものを止めたいと思います。

この風車を止めます。

最初から回ってくれています。

Animatorをスクリプトから止めるのはこちらの方法でできました。

qiita.com

止めるとき

husha.enabled = false;
m_animStartTime = husha.GetCurrentAnimatorStateInfo(0).normalizedTime;

再び動かすとき

husha.enabled = true;
husha.Play(MOVE_ANIM_NAME, 0, m_animStartTime);

 

MOVE_ANIM_NAMEはanimの名前を最初に宣言

const string MOVE_ANIM_NAME = "Take 001";

 

ついでに「ザ・ワールド」っていうときにカラーチェンジをしています。それは前と同じ要領。

f:id:bibinbaleo:20190224164324p:plain

usingにPostProcessingを入れないといけない

using UnityEngine.PostProcessing;

        if (keyCon.hasRecognized[1])///色が変わる
        {

            mahou.Play();
            GetComponent<PostProcessingBehaviour>().enabled = true;
            Debug.Log("ザ・ワールド");
            keyCon.hasRecognized[1] = false;
            a = 2;
        }

画面

LeapMotionの画面構成難しすぎる。

f:id:bibinbaleo:20190223184054p:plain

手を動かせる範囲が狭い。物を置く場所と手が出現する場所が被ってうまく配置できなかった。

LeapMotionはVRに向いているというかデスクトップで画面構成がしにくすぎるんだ!

Fogつけたりした。

ザ・ワールドの時の時計のカチカチという音はこちらから

sounddictionary.info

そして時は動き出すのときはこちら。

dova-s.jp

長かったのでwebサービスでカットしました。

BGM

dova-s.jp

UnityCollaborate

今回はミニハッカソンみたいな感じでした。

久しぶりにUnityCollaborateを使ってプロジェクトを二人で共有しました。

それぞれフォルダを分けて、シーンも分けました。

共通箇所は最初のシーンセレクト画面だけです。

f:id:bibinbaleo:20190223184039p:plain

1年ぶりぐらいに使いましたが、基本的にはスムーズに使えました。

ただ途中で勝手にUnityからサインアウトされててCollaboもはたらいてなかったり、自分おフォルダが消えて30分まえのアップデートから復活させたりと若干のトラブルもありました。

最後に

こっそり配布しています

bibinbaleo.booth.pm

こういうゲームでもツールでもない物を作るの楽しい!!!

ジョルノの物に生命を吹き込むやつも、花の成長アセットとかあればできそうだな〜

ジョジョの奇妙な冒険 第5部 カラー版 8 (ジャンプコミックスDIGITAL)

1万円のはずなのに日本Amazon2万円近くになってる。.comの方が安いらしい

いい商品がない

コード

gist.github.com