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

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

ゲームの顔になるタイトル画面をつくろう(2):3Dアクションゲームを作ろう(15)

引き続き、タイトル画面の作成。
タイトルロゴとメニューは作成したので、今度はオープニングムービーの作成。
UnityにはTimeLineという、動画編集のノリでムービーを作成できる強力なツールがあるらしいことは知っていたけど
今までは触っていなかったので、これを機に使い方を学べれば良いな。

教材はいつもと同じく、通勤中に学んだyoutube😆
参考にしたのは、トズクさんの動画。

www.youtube.com

オブジェクトのアクティブ状態を制御する「アクティベーショントラック」と、
オブジェクトのアニメを使用する 「アニメーショントラック」の二種類について、ざっくり理解したので、
早速、
アクティベーショントラック」を使って、オブジェクトの表示・非表示切替え、
「アニメーショントラック」でオブジェクトにアニメーションを登録していく。
アニメは普通にアニメーションを作成するイメージで、動きを記録していけばいい。
と、理解はしたけれど、動画の説明通り、恐ろしく地味に手間のかかる作業だった😭

僕の場合、人間型のキャラを動かすようなムービーを作るわけではないので、それでも、まだ楽な方なのかもしれない。

スクリプトを書かないでもムービーは作れるけれど、やっぱりスクリプトを併用した方ができることは広がるみたいなので、
しまづさんのyoutubeを参考に、スクリプト制御用にSingnalという機能を使用してみた。

www.youtube.com

このSingnalと、シグナルトラックの何が違うのかは正直よくわからなかったけれど、
これを使ってスクリプトを実行させている。この点については、アニメのイベントと同じイメージだったので、とてもわかりやすかった。

作成したTimelineは、オープニングムービーと景色を表示させるムービーの2つ。

オープニングムービーで基本ストーリーと目的を説明するようにしてみた。

①のSingnalで、OpeningTextスクリプトのAddIndexを呼び出して、テキストの中身を切り替えている。

using UnityEngine;
using TMPro;

public class OpeningText : MonoBehaviour
{
    [SerializeField]TMP_Text tmpText;

    int OpeningIndex=0;

    public void AddIndex()
    {
        OpeningIndex++;

        switch (OpeningIndex)
        {
            case 1:
                tmpText.text="人々の知恵と・・・・";            
            break;

            case 2:
                tmpText.text="そのクリスタルが・・・・";    
            break;

            case 3:
                tmpText.text="クリスタルの恩恵を・・・・";    
            break;

            case 4:
                tmpText.text="力弱い者たち・・・・";
            break;

            case 5:
                tmpText.text="・・・貴方はクリスタル探索の旅に出た。";
            break;

            case 6:
                tmpText.text="・・・できた。";
            break;

            case 7:
                tmpText.text="・・・・";
            break;

            case 8:
                tmpText.text="・・・・";
            break;

            case 9: //オープニングムービーを再度表示させた時のために初期化
                OpeningIndex=0;
            break;
        }
    }
}

次にTimelineをスクリプトで再生する方法と、切り替える方法だけど、これはこの記事を参考にやってみた。

marumaro7.hatenablog.com

Timelineを配列変数に取り込んでおいて、表示させたいTimelineを空のPlayableDirectorで再生させるイメージ。

同じようにスクリプトを組んでみたのだけど、なぜかTimelineが表示されない。
色々とやってみたけれど、どうにもTimelineが表示してくれない。

ちょうど、しまづサロンのユニコンの時間で、まだしまづさんがチャンネルに残っておられたので、早速相談。

結論として、ヒエラルキーウィンドウ上で編集したTimelineは、Prefabと同じで、プロジェクトウィンドウ上にあるものを載せることができないので
プロジェクトウィンドウ上のTimelineをそのまま配列に取り込んだのでは、ヒエラルキーウィンドウ上のオブジェクトとのリンクが切れた状態なのでうまくいかなかったという事がわかった。

かといって、ヒエラルキーウィンドウ上のTimelineは、自動的にPlayableDirectorコンポーネントがついてしまうため、
このままでは、Timeline型の配列に格納できない。

なので、Timeline型の配列ではなく、PlayableDirector型の配列に変更。
これでうまくいった。

スクリプトは、昨日のMenuSelection とマージ。

using UnityEngine;
using UnityEngine.Playables;

public class MenuSelection : MonoBehaviour
{
    
  [SerializeField] SelectableText[] selectableTexts;
  int selectedIndex;
  [SerializeField] private AudioSource audioSource;
  [SerializeField] private AudioClip MoveSE;
 [SerializeField] private PlayableDirector[] director; //PlayableDirector型の配列の宣言
  int directorIndex=0; //Timeline切替用
  float timer=0; //Timeline開始のタイミング用
  private InputSystemSC inputSystemSC;

  float inputTimer=0; 

private void Start() 
{
    inputSystemSC=new InputSystemSC();
    inputSystemSC.Enable();
    Init();
    timer=11.0f; 
    director[0].Play();   
}    
public void Init()
{
    selectableTexts=GetComponentsInChildren<SelectableText>();
}

private void Update() 
{
    timer+=Time.deltaTime;
    inputTimer+=Time.deltaTime;
    if(timer>9 && timer<10) //Timeline用のタイマーが9秒〜10秒の間でTimeline開始
    {
        director[directorIndex].Play();
    }

    Vector2 LeftDirction=inputSystemSC.SelectedMenu.Move.ReadValue<Vector2>();
    var LeftDirction2 =LeftDirction.y;

    if(LeftDirction2<0 && inputTimer>0.5f)
    {
        audioSource.PlayOneShot(MoveSE);
        selectedIndex++;
        inputTimer=0;

    }

    if(LeftDirction2>0 && inputTimer>0.5f)
    {
        audioSource.PlayOneShot(MoveSE);
        selectedIndex--;
        inputTimer=0;
    }
    selectedIndex=Mathf.Clamp(selectedIndex,0,selectableTexts.Length-1);

    for (int i = 0; i < selectableTexts.Length; i++)
    {
        if(selectedIndex==i)
        {
            selectableTexts[i].SetSelectedTexe(true);
        }
        else
        {
            selectableTexts[i].SetSelectedTexe(false);
        }
    }

}

//このメソッドをTimelineのSignal②のタイミングで起動している。
public void TimelineChange()
{
    directorIndex++;
    if(directorIndex==2){directorIndex=0;}
    timer=0;
    director[0].Play();   
}
}


タイトルロゴとメニュー、Timelineを組み合わせて完成させてタイトル画面。

www.youtube.com

あとは、操作説明画面と、設定画面と、クリア画面の作成〜
ゴールは見えてきている・・・はずなんだけど、まだまだあるな〜😅