Alicia in Godot Land #06.1「アニメーションから関数(ファンクション/メソッド)を呼び出す方法」
YouTubeのコメントで、椅子から立ち上がる時にアリシアがテーブルのメッシュと一瞬重なるのが気になったのか、「コリジョンチェックのタイミングを変えてみたら~?」との内容のご指摘があって、最初は「何言ってやがるんだ、勝手なことを!」と思っていたんだが、実際にちょっと自分で工夫してコリジョン再有効化のタイミングを変えてみたら、すげーよくなったわ! サンキュー、コメントくれた人! 君の友情は忘れない。
Before / After
◆ Before
まー、俺も動画の中でメッシュが重なるのが気にはなっていたんだが、「ま、いっか、これくらい。」と流すつもりだった。だから、コメントもらった時は、正直「めんどくせーヤツだなー。」と思ったわけさ。以下画像は修正前。
実際のコメントは「コリジョンを立ち上がる前に有効化させてみたら?」っていう内容だったんで、「立ち上がる前にコリジョンを再有効化したら、メッシュは重ならなくなるけど、アリシアと椅子の挙動が不自然になるなー。」って思ったんだよ。で、実際にやってみたら、やっぱり不自然だった・・・。
◆ After
だけど、もうちょっと考えたら「立ち上がり中にコリジョンの再有効化をすれば、自然に見えるんじゃね?」ってひらめいたわけさ。以下画像は修正後。
どお? 手でちゃんと椅子を押して立ち上がってる風に見えるでしょ。自然でしょ。メッシュも重なってないでしょ。イイ事ずくめじゃん。イイネ、じゃ、これ採用ってなったわけ! 俺、天才的ひらめきの持ち主。
まーでもコメントもらわなかったら、ひらめかなかったけどな。コメントくれた人に感謝!
アニメーションから関数を呼び出す
立ち上がり中にコリジョンを有効化するってのは、具体的には「アリシアが立ち上がるアニメが発動して1秒後にアリシアとテーブルとのコリジョンを復活させるスクリプト(関数)を呼ぶ」って事なんだが、普通はタイマー(Timer
ノード)を使んだと思うけど、俺はアニメで処理してみたんだ。
で、ここでタイトルの通り、「アニメーションから関数を呼び出す方法」を載せておこうと思う。
◆1 スクリプトを用意する
呼び出される関数を仕込んでおくスクリプトを準備する。もちろん専用のスクリプトを作成しないで、既存のスクリプトでもOK。
スクリプトの中身に関しては、呼び出したい自作関数をつくって中身を書けばイイ。
func my_re_enable_collision(): G.P.collision_mask = 3
中身の部分G.P.collision_mask = 3
は、
G
: オートロード(グローバル変数用)。どっからでも呼び出せるように。P
: オートロードで設定したグローバル変数で、アリシアのノードを指定している。ちなみにアリシアはRigidBody
。collision_mask = 3
: コリジョンがチェックする空間を1と2にしてる。1+2=3って事ね。(レイヤとマスクに関しては前回の記事参照のこと。)
という内容。つまり、これでアリシアRigidBody
のコリジョンをテーブルもチェックするように戻すって事。
◆2 トラックを追加する
キーを入れ込みたいアニメーションを選択して、[Add Track]ボタンを押しリストから[Call Method Track]を選択する。
すると、対象の関数が貼ってあるノードを選べって窓が出て来るから、ノードを選ぶ。
すると、トラックが追加されてるはず。
◆3 トラックにキーを打つ
新トラック上で右クリして[Insert Key]。これでキーが打てる。まー大体、1秒後に呼びたいからその辺りで右クリだな。
◆4 関数を選ぶ
んで、あとは出てきた窓から自分で用意した関数を選べばいい。
◆5 位置がずれてたらD&Dで調節する
キーが打たれたはずなので、目的の時間とずれてたら、ドラッグしてひっぱって目的の所へ。(キーは色で役目が分かるようになってるんだな。)
ちょうど1秒後の所に持ってこれたら成功。これでアニメーション中の好きなタイミングで自作関数を呼び出すことが出来る様になったってわけだ。よかったな。 おつかれ!
また、選択したキーはInspectorからでも確認・修正ができる。
まー、こんな感じでアニメで関数を呼び出せるってことだよ。アニメのトラックで出来ることは、モノのポジションを変えるだけじゃないんだ。これ、後できっと役立つはずだ。覚えておこうぜ。
「[Add Track] > [Call Method Track]」だ!