Unity勉強中!あこがれだったプログラマーに今からなろう!

昔あこがれだったプログラマー。今からでもUnityを勉強してみようと思い立ち、チャレンジ開始! Unity勉強メモや、悪戦苦闘な日々の記録です。

TimelineでAnimationClipを動作させる時の問題点と解決策:3Dアクションゲームを作ろう(18)

操作説明を作ろうとして、ずいぶんと迷走している。
Timelineで作ろうとしているのだが、どうしてもTimeline上のAnimationClipを作動させると色々と弊害が出てしまう。

確認できただけで、ざっとこんな感じ。
①AnimationClipの動きに沿ってPlayerが移動してしまう。
②なぜかPlayerがゆっくりと上に移動してしまう。
③Objectの向きが一回しか変えられない。

Playerがアニメに沿って移動してしまうのは、普通に考えると、ObjectのAnimatorの設定で「ルートモーションを適用」
のチェックを外せば解決しそうなものだけど


Timelineの場合だと、これでは解決してくれない。

どこかの記事で、AnimationClip自体のインスペクターで、「ポーズにベイク」にチェックを入れると良いような記載を
見つけたのだけど、

youtu.be


移動はしなくなったけど、なんか違う😭

理想は、これ。

youtu.be

・・・明らかに別物😭

こんな感じで、ここ数日、ずっと解決方法の実験を繰り返していた。
うまくいったと思っても、同じ動作を何回か繰り返すように組むと、なぜか問題が再発してしまう。
原因がわからないままに、随分と時間をかけてしまった。

多分、推測だけど、Timelineで動かすAnimationClipは、最初からTimeline用に作る必要があるんじゃないだろうか。
ゲーム用のAnimationClipの、動作だけを流用しようとしているから、それで上手くいかない様な気もする🧐

ではTimelineなしでムービーを作ろうとしたけれど、ちょっとやってみただけで、追加するObjectの多さに早々に諦めてしまった🤣
Timelineだと簡単なImageのSpriteの変更も、スクリプトでやろうとすると、ImgaeとSpriteを変数に格納させないといけない訳で。

つまり、ムービーで動かすObjectを全て変数に取り込む必要があるので、大量の変数を作らないと・・・・と、諦めてしまった😆

散々迷って、迷走して、悩んだ結果。
大筋はTimelineで作って、プレイヤーのアニメだけをスクリプトで制御する事にした。
Timelineからスクリプトを制御するのは、TimelineSignalを使ってイベントを発生させてやる。

そして、イベントで実行されるスクリプトは普通に作ってやる。

public class Operating : MonoBehaviour
{
    [SerializeField] private Animator animator;
    [SerializeField] Transform Player;

    public void PlayerRun()
    {
        animator.SetBool("run",true);
    }

    public void PlayerLeft()
    {
        Player.eulerAngles=new Vector3(0,270,0);
    }

    public void PlayerBack()
    {
        Player.eulerAngles=new Vector3(0,180,0);
    }

    public void PlayerRight()
    {
        Player.eulerAngles=new Vector3(0,90,0);
    }

    public void PlayerIdle()
    {
        Player.eulerAngles=new Vector3(0,180,0);
        animator.SetBool("run",false);
    }
}

それぞれのメソッドをTimeline Signalのイベントで呼んでいる。

これで、どうにか思っていた形になった。

youtu.be

ようやく先に進められそうだ😆
2月中には完成したいな〜