2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UnityのButtonNavigationを毎回循環させるの面倒だったのでちょっと作った。

Last updated at Posted at 2017-08-25

#もっとスマートにみんなやってるのかもだけれど
自分みたいな趣味レベルのプログラマーが同じようにイライラしてるかもしれないのでちょっと書いてみました。
ローカルでGitは使ってみてたけど初GitHub、初Qiitaだよ!

#で、何やったの?
どっかで見たことあるコードかもしれないし本当に小物なんですが、
Buttonを縦に並べたり横に並べた際、毎回上下、左右のButtonの選択つなげるの面倒だなぁと思ってまして。

WS000620.JPG
Automaticだとこうなりますよね。左と右で繋がってない。

WS000622.JPG
こうしたい。

じゃあButtonList送って動的に修正する関数作りましょう、と。

#そして作ったのがこちらになります(3分クッキング)
https://github.com/Tukikei/UnityButtonNavigation

ButtonNavigation.cs
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;

public class ButtonNavigation: MonoBehaviour
{
        
    public void VerticalButtonNavigationFix(List<GameObject> buttonList)
    {
        if (buttonList.Count() > 1)
        {
            Navigation firstButton = buttonList[0].GetComponent<Button>().navigation;
            firstButton.mode = Navigation.Mode.Explicit;
            firstButton.selectOnUp = buttonList[buttonList.Count() - 1].GetComponent<Button>();
            firstButton.selectOnDown = buttonList[1].GetComponent<Button>();
            buttonList[0].GetComponent<Button>().navigation = firstButton;

            Navigation lastButton = buttonList[buttonList.Count() - 1].GetComponent<Button>().navigation;
            lastButton.mode = Navigation.Mode.Explicit;
            lastButton.selectOnUp = buttonList[buttonList.Count() - 2].GetComponent<Button>();
            lastButton.selectOnDown = buttonList[0].GetComponent<Button>();
            buttonList[buttonList.Count() - 1].GetComponent<Button>().navigation = lastButton;
        }
    }

    public void HorizontalButtonNavigationFix(List<GameObject> buttonList)
    {
        if (buttonList.Count() > 1)
        {
            Navigation firstButton = buttonList[0].GetComponent<Button>().navigation;
            firstButton.mode = Navigation.Mode.Explicit;
            firstButton.selectOnLeft = buttonList[buttonList.Count() - 1].GetComponent<Button>();
            firstButton.selectOnRight = buttonList[1].GetComponent<Button>();
            buttonList[0].GetComponent<Button>().navigation = firstButton;

            Navigation lastButton = buttonList[buttonList.Count() - 1].GetComponent<Button>().navigation;
            lastButton.mode = Navigation.Mode.Explicit;
            lastButton.selectOnLeft = buttonList[buttonList.Count() - 2].GetComponent<Button>();
            lastButton.selectOnRight = buttonList[0].GetComponent<Button>();
            buttonList[buttonList.Count() - 1].GetComponent<Button>().navigation = lastButton;
        }
    }

    public void VerticalButtonNavigationFix(List<Button> buttonList)
    {
        if (buttonList.Count() > 1)
        {
            Navigation firstButton = buttonList[0].navigation;
            firstButton.mode = Navigation.Mode.Explicit;
            firstButton.selectOnUp = buttonList[buttonList.Count() - 1];
            firstButton.selectOnDown = buttonList[1];
            buttonList[0].navigation = firstButton;

            Navigation lastButton = buttonList[buttonList.Count() - 1].navigation;
            lastButton.mode = Navigation.Mode.Explicit;
            lastButton.selectOnUp = buttonList[buttonList.Count() - 2];
            lastButton.selectOnDown = buttonList[0];
            buttonList[buttonList.Count() - 1].navigation = lastButton;
        }
    }

    public void HorizontalButtonNavigationFix(List<Button> buttonList)
    {
        if (buttonList.Count() > 1)
        {
            Navigation firstButton = buttonList[0].navigation;
            firstButton.mode = Navigation.Mode.Explicit;
            firstButton.selectOnLeft = buttonList[buttonList.Count() - 1];
            firstButton.selectOnRight = buttonList[1];
            buttonList[0].navigation = firstButton;

            Navigation lastButton = buttonList[buttonList.Count() - 1].navigation;
            lastButton.mode = Navigation.Mode.Explicit;
            lastButton.selectOnLeft = buttonList[buttonList.Count() - 2];
            lastButton.selectOnRight = buttonList[0];
            buttonList[buttonList.Count() - 1].navigation = lastButton;
        }
    }
}

List< GameObject >、List< Button >のどちらかで対応する構成です。
Inspector上からButtonList登録して使うも良し、他の形で動的にList作って送っても良し。
縦なら上下循環、横なら左右循環するようにしてます。
弄って自分の好みにしちゃうのも有り。拡張メソッド化してもいいかもしれないですね。

#結論
大したものではないですが、自分用に作って割りかし便利に使いまわせてるので満足してます。
誰かの役に立てばより良いかなーとも思います。
ゲーム作ってる最中でちょこちょここういうのは書いたりしてるので、また何かあれば書きます(多分同じように小さいもの)

#参考
https://boccilog.wordpress.com/2016/03/26/
こちらのサイト様の解説を見ると大体仕組みがわかるかと思います。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?