Timelineでちょっと苦戦したことについて

Unity

オブジェクトに対して重力による落下の演出を加えようとしたところ、若干つまづいたので記そうと思います



何につまづいたのか

段ボールの底部分から中身を落下させる演出を作ろうとしたところ、落下の表現をアニメーション内で自作するよりも物理演算に任せた方がリアルだろうと思い、地面より高い位置に落下物を配置して落下させたいタイミングでアクティブにするという方式をとりました。

しかし、再生すると落下するところまでは成功したのですが、元の位置に戻ってくれなかったのです。

アニメーション内でキーによる制御をしたものに関してはリセットされるのですが、アクティブにしたあと重力による落下をさせたものに関しては別の方法でなんとかするしかないようです・・・

Timelineの様子

赤線部分のbooksが落下物にあたります

解決方法

まずはスクリプトを

using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;

public class TimelineReset : MonoBehaviour
{
    public PlayableDirector playableDirector;//再生したいタイムラインをアタッチ
    public Transform objectToBase;//ここに空オブジェクトをアタッチして座標を利用する
    public GameObject books;//グループの親をアタッチ
    private PlayableDirector director;

    void Start()
    {
        director = this.GetComponent<PlayableDirector>();
        playableDirector.stopped += OnTimelineStopped; // イベントを登録  
    }

    //再生終了時に発動
    private void OnTimelineStopped(PlayableDirector director)
    {
        GameObject[] OTR = GameObject.FindGameObjectsWithTag("Event1");
       
        foreach (GameObject _OTR in OTR)
        {   
            
            //アタッチした空オブジェクトの位置に移動させ、親を非アクティブ化
            _OTR.transform.position = objectToBase.position;
            books.SetActive(false);
        }
      
    }
    //再生中に再生させないようにする措置
    public void PlayTimelineIfNotPlaying()
    {
        if (director.state != PlayState.Playing)
        {
            director.Play();
        }
    }
}

objectToBaseに、戻ってほしい位置にあらかじめ配置した空オブジェクトをアタッチして落下物が戻る場所を作ってあげます

OnTimelineStoppedをイベント登録し、Timeline再生終了時に自動的に元の位置に戻るように仕向けます(落下オブジェクトはタグで管理)

Timelineの発動トリガーはレーザーポインタによる該当オブジェクトのクリックになってるのですが、これだとTimeline再生中にクリックしても新たに再生しようとしてうまくいかなかったので

PlayTimelineIfNotPlayngメソッドを作成し、Timelineの状態判別をした上で再生を許可する方式にしました

objectToBaseと落下物(books:複数の落下物の親)をそれぞれアタッチ

トリガーとなるオブジェクトにアタッチしてあるXR Grab Interactable内のSelect EnteredにPlayTimelineIfNotPlayngメソッドを登録します

結果

もふもふ
もふもふ

できたもふ(;゚Д゚)

落下した物がちゃんと初期位置に戻ってくれているので成功です!



まとめ

Timelineと連動してくれない要素もスクリプトでなんとかなる

タイトルとURLをコピーしました