Udemy学習記録 Unity2D脱出ゲーム開発入門(4日目)

えにあです。

島津さんUnity2D脱出ゲーム開発入門をやっていきます。 前回は41 までやりましたので、No42~進めていきます。

No42. 戻るボタンの実装

ロッカー画面、バケツ画面まで進んだ後に、下矢印ボタンを押したら元の画面に戻るようにします。

変数の追加

現在選択されているパネルを見て、戻り先を分岐させる必要がある。 まず、パネルをenumで表現する

    enum Panel
    {
        Panel0,        Panel1,        Panel2,        Panel3
    }

次に、現在選択されているパネルを格納するための変数を用意する

    // 現在表示されているパネル
    Panel currentPanel;

OnBackArrowの実装

    public void OnBackArrow() {
        switch(currentPanel)
        {
            case Panel.Panel2:
                transform.localPosition = new Vector2(0, 0);
                break;
            case Panel.Panel3:
                transform.localPosition = new Vector2(-1000, 0);
                break;
        }
    }

OnBackArrowの関連付け

BackArrowのOnClickにOnBackArrowを関連付ける。

いつものごとく、PanelParentオブジェクトの、PanelChangeスクリプトの、OnBackArrowファンクションという紐づけ方。

currentPanelの初期値も設定していないし、選択時に更新もしていないのでこのままでは動かないだろう。この後修正されるはず。

バグ修正

以下の感じで、矢印が押されるたびにPanelを更新していく。 これで動くはず。 初期値がnullなのが微妙だが、まぁ動く。

    public void OnRightArrow()
    {
        currentPanel = Panel.Panel1;
        transform.localPosition = new Vector2(-1000, 0);
    }


    public void OnLeftArrow(){
        currentPanel = Panel.Panel0;
        transform.localPosition = new Vector2(0, 0);

    }

    public void OnLocker0()
    {
        currentPanel = Panel.Panel2;
        transform.localPosition = new Vector2(0, 1500);
    }

    public void OnBucket()
    {
        currentPanel = Panel.Panel3;
        transform.localPosition = new Vector2(-1000, 1500);
    }

No43. 矢印の表示非表示

初期画面ではこれ以上左にいけないので、左ボタンを出さないといった制御を行う。

Arrow用の変数定義と割り当て

以下のように、Arrowの状態を格納するための変数を定義する。 これらに対してsetActive(true/false)することで、表示状態を変えられる。

    public GameObject rightArrow;
    public GameObject leftArrow;
    public GameObject backArrow;

publicにすることで、Unityエディタから見えるようになる。 こんな感じでインスタンスを割り当てる。 f:id:enia:20210831220121p:plain

矢印が押されるごとに状態の変更

右矢印が押されたら、一度全部の矢印を非表示にして、左矢印だけを表示する。 同じようにすべて関数を更新していく。

明らかに冗長なコードである。どこかで直すのであろう。

    public void OnRightArrow()
    {
        currentPanel = Panel.Panel1;
        transform.localPosition = new Vector2(-1000, 0);

        rightArrow.SetActive(false);
        leftArrow.SetActive(false);
        backArrow.SetActive(false);
        leftArrow.SetActive(true);
    }

初期表示のバグを直す

今までの修正では、矢印を押したタイミングで表示非表示を切り替えているので、 初期表示では矢印が3つ表示されてしまっている。

Start関数の中で表示を切り替えることで、初期表示を修正できる。

    private void Start()
    {
        currentPanel = Panel.Panel0;
        rightArrow.SetActive(false);
        leftArrow.SetActive(false);
        backArrow.SetActive(false);
        rightArrow.SetActive(true);
    }

No.44 矢印の修正

毎回同じロジックを書いているところを修正していく。

HideArrowsの作成

先ほどのコードで、一度すべての矢印を表示にする処理がかなり冗長だったので、以下の関数を新たに作って呼び出すように変更していく。

    void HideArrows()
    {
        rightArrow.SetActive(false);
        leftArrow.SetActive(false);
        backArrow.SetActive(false);
    }

No.45 画面移動の修正

まだまだソースが冗長なので直していきます。

ソースの共通化

指定されたパネルを表示する処理を一か所に寄せます。

 void ShowPanel(Panel panel)
    {
        switch(panel)
        {
            case Panel.Panel0: 
                currentPanel = Panel.Panel0;
                transform.localPosition = new Vector2(0, 0);
                HideArrows();
                rightArrow.SetActive(true);
                break;
            case Panel.Panel1: 
                 currentPanel = Panel.Panel1;
                transform.localPosition = new Vector2(-1000, 0);
                HideArrows();
                leftArrow.SetActive(true);
                break;
            case Panel.Panel2: 
                currentPanel = Panel.Panel2;
                transform.localPosition = new Vector2(0, 1500);
                HideArrows();
                backArrow.SetActive(true);
                break;
            case Panel.Panel3: 
                currentPanel = Panel.Panel3;
                transform.localPosition = new Vector2(-1000, 1500);
                HideArrows();
                backArrow.SetActive(true);
                break;
        }
    }

こうすると、左矢印を押された時の処理は以下のようになります。 他の矢印が押された場合も同様です。

   public void OnLeftArrow(){
        ShowPanel(Panel.Panel0);
    }

さらなる共通化

HideArrowsはすべてで共通なのでメソッドの一番上に持ってくる。 currentパネルの設定は、引数で渡された値を使う。

こんな感じになる。

    void ShowPanel(Panel panel)
    {
        HideArrows();
        currentPanel = panel;
        switch(panel)
        {
            case Panel.Panel0: 
                transform.localPosition = new Vector2(0, 0);
                rightArrow.SetActive(true);
                break;
            case Panel.Panel1:
                transform.localPosition = new Vector2(-1000, 0);
                HideArrows();
                leftArrow.SetActive(true);
                break;
            case Panel.Panel2: 
                transform.localPosition = new Vector2(0, 1500);
                HideArrows();
                backArrow.SetActive(true);
                break;
            case Panel.Panel3: 
                transform.localPosition = new Vector2(-1000, 1500);
                backArrow.SetActive(true);
                break;
        }
    }

No46 おわりに

ここは特になし

まとめ

今回でNo46まで終了しました。 セクション6終了です。 次回はセクション7 No47~進めていきます