Tweeningを引き続き勉強してみる

実はLocal違いなんじゃないの?

前回、DOTweenを使用してみたところ、動きはしたものの期待の動作にならず。

himatsubushi-industry.hatenablog.com

アセット製作元に聞こうかとも思ったが、残念な英語スキルを発揮する前に、ちょっと考えてみた。

「ここで云うLocalは、入れ子のGameObjectのLocal座標系とちゃうか?」

筆者は"transform.localPositioin"の感覚で、パラメータが操作されていると考えていたのだが、もしそうならとんだ考え違いである。

 座標系とスクリプトを分解してみた

というわけで、平行移動/回転用にEmptyでGameObjectを生成("unitychanPivot"と命名)し、これのツリー構造下に"unitychan"を配置した。

また"PlayerController"Scriptを分解、平行移動部の"moveCtrl"Scriptを"unitychanPivot"に、Tweenモーション部の"animCtrl"Scriptとスコア管理部の"scoreCtrl"Scriptを"unitychan"に、それぞれCompornent登録する。

上記内容で実行した結果がこれである。

f:id:himatsubushi-industry:20180820211327g:plain

上手くいっているように見えるが、実はこんな問題が潜む。

f:id:himatsubushi-industry:20180820211650g:plain

"unitychanPivot"が物理演算の影響を受けず、座標が更新される一方で、"unitychan"自身の座標は物理演算の影響を受けて、"unitychanPivot"から遠ざかる。
そしてジャンプした瞬間に、"unitychan"座標系の(0,0,0)、すなわち親である"unitychanPivot"の所在座標に移動しようとするため、gifのようにユニティちゃんが投身自殺を図るわけだ。

ゴメンよユニティちゃん...。

今回分かったこと、感じたこと

 DOTweenのLocal系メソッドは、入れ子の座標系に対する操作であることが理解できた。
上では触れていないが、Localでは無いほうでジャンプすると、Global座標系の(0,0,0)に向かって飛ぶことも確認した。

また、座標値は絶対値であり、相対移動をするためには自前で計算せねばならんということだ。

あと、これは感想だが、物理演算との複合は相性が悪いように感じた。
もっともこれは、筆者の使い方にDOTweenのショートカット系メソッドが合わなかっただけなのかもしれない。

DOTweenは汎用系メソッドとしてToメソッドがあり、こちらは変数ならほぼ何でもTweenしてくれるので、使い方は煩雑になるだろうが、もうちょっとプリミティブな層での変数操作に活用していきたいと考えている。

次回予告

DOTween活用の道が見えてきたので、本格的に移動操作処理に着手したい。
とりあえずは、入力系のアサインとイベント処理系の整理か。
せっかくのイベントドリブンな記述なのに、イベントハンドラの中がif文だらけというのはゾッとせんからな。

とはいえ、夏季休暇が今日で終わりなので、今後は週刊ペースかな。
会社へ行きたくないでござる。

著作情報

ユニティちゃんライセンス

この作品はユニティちゃんライセンス条項の元に提供されています