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

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

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

![WS000620.JPG](https://qiita-image-store.s3.amazonaws.com/0/188268/f4081bba-66c4-72db-2236-733626366fae.jpeg)
Automaticだとこうなりますよね。左と右で繋がってない。

![WS000622.JPG](https://qiita-image-store.s3.amazonaws.com/0/188268/72f8ceb8-1ac6-caf6-4015-ac5da38c22a8.jpeg)
こうしたい。

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

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

```C#: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/
こちらのサイト様の解説を見ると大体仕組みがわかるかと思います。