Re:iN works

覚書き

Enable Behaviour と MecanimJitter の挙動を考える

はじめに

本記事は 前回  Trigger Eventでつまづいたところ のさいごに にて未解決の Playmaker での Enable Behaviourを使ってスクリプトの有効/無効を切り替え と いちか様 作成のUnityアドオン MecanimJitter  MMD4Mecanimアドオン MecanimJitter作ってみた - Unityの備忘録的な を組み合わせの使い方の模索の経緯です

やってみる

Triggerエリアに物が入ると、 MecanimJitterで ONCEで設定したものを1回だけ実行したい

f:id:riesenrein:20170510002433p:plainf:id:riesenrein:20170510002434p:plainf:id:riesenrein:20170510002435p:plain

 

待機状態でスクリプトを無効 → On Triger Enter で遷移して スクリプトを有効にする

f:id:riesenrein:20170510003033p:plain

GameObjectにアタッチしているスクリプトの有効/無効を切替するということでできないかなぁと思ってました。

⇒スクリプトの有効/無効の仕方はこれであってたみたいだが 結果は NG・・・ ONCEに設定されているものは 有効になったときに実行されるわけではなく、Play Once を押したときにしか実行されない

暫定でもやってやる

じゃぁ、LOOPの挙動はどうなんだろうと思ったら、INTERBALの設定値に関わらず、まず1回実施されて そのあとでINTERBAL値分待つ格好だった。

LOOP間隔を広げておいて1回実行した後で スクリプトを無効にすればいいじゃないということで、

f:id:riesenrein:20170510002903p:plain

(この時、Sync にチェックを入れておかないと3つの動きがランダムになってしまったので、Syncは忘れずにチェックを入れる)

 

⇒ 結果は NG... On Triger で遷移してスクリプトを有効にした後、すぐに待機状態に戻るので 動作途中にスクリプトが無効になりすぐに元に戻る

 

安直なやり方でこの後にWaitをいれればできるわなということで、やった結果は とりあえずはOK

だけど、 Wait時間分待つことになるので その間に次のOn Trigger が発生しても遷移しないので やっぱりダメ

 

さいごに

今更ながら改めてチュートリアルを見ると

youtu.be

スクリプトからはPlayoOnce() を実行すればよい

と書かれておりました。

今度はPlaymakerで関数の実行方法を探ってみましょう

※2017.05.11 続きました

riesenrein.hatenablog.jp

Trigger Eventでつまづいたところ

 

前置き

Windows版 Unity 5.6.0f3 Personal(64bit) での発生(その他環境では未確認)

筆者はUnity初心者 & C#やJSを理解しておりません 

 

以上のことご了承いただき、生暖かい目でみてやってください

(ゆっくりがんばります)

 

はじめに

これを 自分のできるレベルで実施したかったんで、ある領域に入ったら驚いた表情をするようなこと考えた 。 

いちか様が公開いただいたアドオンで簡単にMorphやBorn の動作をランダムループや1回だけ等で動かすことができるようになりました。

ichika292.hatenablog.com

 すごく使いやすく、また内容も充実しており大変助かります

 

つまづきポイント

まずは、領域をつくって そこに入ると次の動作に移ることを考えた。

 Playmaker での Trigger Event はお勉強済 (のつもり)

www.youtube.com

だったので、これで実現できそう・・・と思ったのだけど、まずTrigger Eventがうまくいかず次の状態に遷移できない。

 チュートリアル用のシーンでは問題なくできた

 

f:id:riesenrein:20170508201504g:plain

 

けど、一から作るとうまくいかない...

 

f:id:riesenrein:20170508201543g:plain

 

 

調査

困ったときのGoogle 先生 キーワード:unity trigger でググると一発目に本家が出てくるのは、いかに充実しているか分かりますね

docs.unity3d.com

<引用>

"このメッセージはトリガー状態の Collider、その Collider が属している Rigidbody (存在する場合)、 そのトリガーに接触する Rigidbody (Rigidbody がない場合は Collider) に送信されます。"

<引用終わり>

Rigidbody ってのがキーワードっぽい。接触する相手のInspectorを見るとRigidbody が無い

f:id:riesenrein:20170508013857p:plain

もうちょっと調べてみると

Post Position 【Unity】 静止した物体同士の当たり判定の検出について

 <引用>

どちらかにRigidbodyが必ず付いていること
RigidbodyのIs Kinematic(物理挙動をさせない)にチェックが入っていること
ColliderのIs Triggerにチェックが入っていること

また、さらに以下の様な条件がある。
Rigidbodyが付いている方のオブジェクトが移動もしくは回転している(静止しているとダメ)
(ただし、起動直後のフレームだけは静止していても検出可能)

 <引用終わり>

というものらしい ... そういうものだと理解してトライすると成功

(トリガー側だけ、 もしくは衝突相手 だけ 、また両方でもOK)

 

もうちょっと突っ込んでみる

ここで、Playmakerのチュートリアル用のシーンで使われているものを見てみた

f:id:riesenrein:20170508023716p:plain

あれ? Rigidbodyがない。だけど問題なく動くことから有効/無効で確かめてると、Charactor Controller を無効にすると、Trigger がとれなくなる。

またまたGoogle先生のお時間 キーワード:unity charactor controller

docs.unity3d.com

<引用>

Character Controller は、主に Rigidbody による物理特性を使用しない、3 人称や 1 人称のプレイヤー制御に使用されます。

(中略)

プレイヤーキャラクターが物理特性の影響をうけるようにしたい場合は、Character Controllerの代わりに、Rigidbody を使用した方がよいでしょう。

<引用終わり>

 

そういうものらしい。 

Charactor Controller の場合は、トリガー範囲のほうに設定してしまうとEnter扱いになり使えないので衝突相手に設定しないといけませんでした。

 

解決まとめ

いずれか(もしくは両方)の方法で対応

  • Trigger 範囲 に Rigidbody を設定
  • 干渉相手にRigidbody or Charactor Controller を設定

Rigidbody を使うか Charactor Controller を使うかは 目的・ 用途で使い分けしていかないといけないわけですね。

MMD4MecanimからもってくるモデルにはColliderは設定されないので一工夫が必要になると思います。

* 2017.06.24 Colliderは設定可能でした (いずれ別記事で)

 

さいごに

最初に目的としていた未達成です

Enable Behaviourを使ってスクリプトの有効/無効を切り替えればいけないかなぁと思ってたのですが、ループの場合は動作/停止 を切り替えれるのですが onceの場合は有効になったときに1回だけ... という風には動かないようでした。

まだまだ勉強しなければなりません。

UnityもHoloLensでのモデル表示ぐらいしかできていないのが現状です。

最低限のチュートリアルだけを見て触っている段階ですので、もっと色々とみていかないといけないですね

 * 2017.05.10 続きました 

riesenrein.hatenablog.jp

 

* 2017.05.19 Arbor 2 でもやってみた

works.riesenrein.net