Timelineの使い方について、これまで紹介してきましたが、
実際にゲーム開発の中で、どのように使えるのか、考えたいと思います。
Timelineはムービーやアニメーションを作成するのに便利な機能です。
なので、イベントシーンを作成するに有用です。
「ゲームを進める」
↓
「イベント発生」(アニメーションまたはタイムラインの実行)
↓
「ゲーム継続」
特定の条件が満たされた場合に、
Timelineが再生されるように設定すれば、ゲーム中にイベントを発生させることができます。
作り方は、タイムラインを用意できていれば、あとはコーディングで制御するだけ!
今回見本として解説するのは、こんなもの↓
緑の下部はTimelineが再生されている様子です。
ここではBoxが動くアニメーションのみTimelineに設定してます。
Timeline再生の条件は、下の2つが満たされたときとしています。
①Boxにぶつかる
②Qキーを入力する
※単なるアニメーションの実行に思われるかもしれませんが、
Boxが動くように設定したタイムラインが再生されています。
ちなみに、
宙に浮く球がフェードイン・アウトしているのは、タイムラインでなくスクリプトで制御しています(当たり判定によって徐々に透明度が変わるようにしている)。その方法はこちら↓
1.Timlineアニメーションの準備
Cubeが動くTimelineの作り方は、以前紹介した方法に則れば、サクッと作成できます。
ざっくり言うと、
シーンにCubeを配置して、Timelineファイルを紐づけ。
Timlineファイルの中身は、アニメーションを設定するのと同じ感覚で、設定します。
デフォルトでは、Timelineの紐づけたときにアタッチされるコンポーネントの「Play On Awake」のチェックを外します。
※これはゲームの実行とともに、そのTimelineが再生されるというもの。
今回は、特定の条件が満たされたときだけ、Timelineを実行したいので、解除しておきましょう。
ピンク文字の部分が準備できたと思います。
次に、黄色文字のスクリプトを作り、Timelineが再生される条件を設定します。
2.スクリプトによるTimelineの制御
Timelineをどのように再生させるかによりますが、今回はBoxへの当たり判定を条件に加えます。
なので、Boxにその制御するスクリプトをアタッチするのが簡単です。
次のTimelineControl.csというスクリプトを作成し、アタッチします。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.Playables; //Timelineの制御に必要 public class TimelineControl : MonoBehaviour { public PlayableDirector playableDirector; public bool isBoxmover = false; public GameObject QText; // Start is called before the first frame update void Start() { playableDirector = GetComponent<PlayableDirector>(); } // Update is called once per frame void Update() { if(isBoxmover && Input.GetKeyDown(KeyCode.Q)) { PlayTimeline(); isBoxmover = false; QText.SetActive(false); } } void OnTriggerEnter(Collider other) { if(other.gameObject.tag == "Player"){ Debug.Log("当たりました"); //確認用 QText.SetActive(true); isBoxmover = true; } } //再生する void PlayTimeline() { playableDirector.Play(); } //一時停止する void PauseTimeline() { playableDirector.Pause(); } //一時停止を再開する void ResumeTimeline() { playableDirector.Resume(); } //停止する void StopTimeline() { playableDirector.Stop(); } }
変数の宣言は、
playableDirector(実行するTimeline)、isBoxmover(Timelineを作動させるboolスイッチ)、QText(Timelineを再生できることを示すテキスト)
の3つをしています。
いずれもInspectorで項目を確認&設定できるようにpublicとしていますが、isBoxmoverはゲーム内の当たり判定でboolがtrueになるように設計します。
(isBoxmoverを使わなくともTimeline再生は可能ですが、連続再生されないように無効化しやすい)
このスクリプトでは、ゲーム実行時(void Start)に、再生するTimelineを定義させます。
そして、フレーム処理時(void Update)に、
isBoxmoverが「ture」になり、かつQキーが押されたときに、
PlayTimeline()というメソッドが読まれて、Timelineが再生されるようにしています。
isBoxmoverが「true」になる条件は、当たり判定を検出するメソッドである「onTriggerEnter」を使います。
playerというタグ付けされたオブジェクトに、このスクリプトがアタッチされているBoxが当たると、isBoxmoverが「true」になります。
また、QTextが有効化されます(SetActiveがtrueになる)。
QTextは単なるテキストです。あることで、プレイヤーにイベント(Timeline)が再生可能ですよという、合図的な意味合いで使いました。
(Qキーを押すことを条件に入れなければ、不要です)
最後の方には、自分の備忘録もかねて、
PlayTimeline()の他、
PauseTimeline():一時停止
Resumetimeline():再開
StopTimeline():停止
ということも書いておきました^^
冒頭のusing UnityEngine.Playablesを呼び出すことで、これらが使えるようになるので、知っておきましょう。
さて、スクリプトをアタッチしたら、
図のような操作をして、準備完了です!!
スクリプトの項目である
Playable Directorには、それが取り付けられているオブジェクトを、
QTextにはCanvas配下に作ったTextオブジェクトを、
それぞれドラッグ&ドロップします。
Textオブジェクトは、当たり判定後にSetActiveでtrueにするので、デフォルトでは非アクティブにしておきます。
Boxの当たり判定を使う方法ですが、
Box ColliderのIs Triggerにチェックを!
そして、Rigidbodyコンポーネントのアタッチが必須です。
ただ、TimelineのアニメーションでBoxを動かす場合、重力の影響を受けるとおかしなことになるので、Use Gravityのチェックは外しましょう^^;
最後に操作するプレイヤーキャラクターについて、
当たり判定はPlayerを対象とするので、タグでPlayerを選びます。
操作キャラクターは、本ブログでお馴染みのシステマンにしてますが、Unity-Chanと同じ設定で動かせます。
自作モデルを動かしたい場合はご参照ください↓
というわけで、解説は以上です。
これで、Timelineとゲームをシームレスに実行できるはずです!
cinemachineを使うとイベント中のアングルも変えられてよいですよ!
それは、またの機会に^^
unityビギナーは、まずunityに触れまくろ~
世界基準のエンジンを日本語で親しみやすくするならこちら↓