#ChannelPlayer · Unity · VRソフト

Unity uGUIで一覧表示スクロールをボタンで実装する方法

uGUIにてボタンを並べて、ローカルファイルシステム内のフォルダを選択させる以下のような画面を作っています。

Channel Player内フォルダ設定ダイアログのEditor画面

普通だとスクロールバーかスクロールビューなどのスクロールする部品で構成するところですが、他のVRアプリのようなレーザーポインター方式は使っておらず、キーボード操作と各コントローラのスティックにて、ボタンのフォーカスされているところをEventSystemを使って移動させています。

上記画面の右側「folder name 1」や「folder name 7」に来た後で、さらに上方向あるいは下方向に移動させようとした時に、フォルダの数が多い時には、移動させずにボタンに表示されているフォルダ名を更新させてスクロールしているように見せています。

具体的には、「folder name 1」と「folder name 7」のボタンでは次のようなスクリプトをアタッチして、ダイアログ処理の本体側に通知しています。

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class GetEventFolder : MonoBehaviour, IMoveHandler, ISelectHandler
{
    public static MoveDirection moveDirection;

    //    Left = 0,
    //    Up = 1,
    //    Right = 2,
    //    Down = 3,
    //    None = 4

    public void OnMove(AxisEventData eventData)
    {
        FolderSettingDialog.moveDirection = eventData.moveDir;
    }
    public void OnSelect(BaseEventData eventData)
    {
        FolderSettingDialog.moveDirection = MoveDirection.None;
    }
}

そして、フォルダ設定ダイアログ本体側のスクリプトでは、以下のようなコードでボタンの表示内容を更新しています。goには現在選択されているGameObjectが入っています。ボタン自身が受けとった移動方向のイベントを使って、ボタンの表示はスクロールさせるが、ボタンの選択自体はそこに留まらせます。そして表示できるフォルダが無くなったら、そこで初めて下に移動させています。

                if (go == folderName7_BUTTON)
                {
                    preUpFlag = false;
                    if ((moveDirection == MoveDirection.None) && !preDownFlag)
                    {
                        preDownFlag = true;
                    }

                    if ((moveDirection == MoveDirection.Down) && preDownFlag)
                    {
                        moveDirection = MoveDirection.None;
                        if (current_index + 1 < lstStr.Count)
                        {
                            // 下にスクロールさせる
                            current_index++;
                            SetFolderButton(lstStr, index: current_index);
                            // Downさせずに、そのボタンを選択させる。
                            sel = GetComponent<Selectable>();
                            if (sel)
                            {
                                sel.Select();
                            }
                        }
                        else
                        {
                            // スクロールできないので、下のボタンを選択させる。
                            EventSystem.current.SetSelectedGameObject(Retrun_BUTTON);
                        }
                     }
                }
                else
                {
                    preUpFlag = false;
                }
            }
広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中