一番中央に近いものが自動で真ん中にくるあのUI作ってみた【Unity】
これ作る
一番真ん中に近いものが真ん中にくるアレを実装してみた pic.twitter.com/RPlZdPe23O
— おかえ (@mokapants) September 16, 2019
経緯
UnityでそういうアプリっぽいUI挙動作るの楽しいですよね!!!(てかそれすごい... Qiitaに書いて❤)
— トミー (@Tomy_0331) September 16, 2019
中身は簡単だけど素直に嬉しかったので書きます。
環境
- Unity 2017.4.6f1
インターン中のプロジェクトで開発したので,会社からの制限でバージョン鬼古いですが,たいした機能使ってないので差し支えないと思います。
やり方
まずはScroll View
Horizontalだけにして,Contentには最低でもデバッグできる程度にオブジェクト設置します。
ContentにはContent Size Fitter
とHorizontal Layout Group
をアタッチして適宜設定。
これで横スクロールできているかと思います。できてなかった場合他の方の記事を参考にどうにかこうにか横スクロールができる状態まで作ってください!
一番中央に近いものが真ん中にくるアルゴリズム
手書きの方が説明しやすいので,メイン部分は汚いですが手書きのものをみてください。
このアルゴリズムはプログラム内で,先ほどの画像にあるヒエラルキー上でいうとScrollbar Horizontal
が保持しているScrollbar.value
を直接書き換えて実装してます。
このvalueを計算して求めてあげようという話です。
前提知識として,Scrollbar.value
は0.0f ~ 1.0f
がレンジです。
黄色い枠で書かれた部分がサンプルコードのタッチしたか否かの中にあるif文に反映されてます。 計算量を抑えたり、可読性のために変数に代入してますが,計算の仕組みとしてはかわりません。
書いててよくわからなくなってきたのでサンプルコードと照らし合わせてください。
public class Sample : MonoBehaviour { [SerializeField] Transform content; [SerializeField] Scrollbar scrollbar; float oneEquallyDividedValue; void Start() { oneEquallyDividedValue = 1f / (content.childCount - 1); } void Update() { // 自動で近いものを真ん中に // ユーザーが画面に触ってないか(デバッグ用にマウスも含む) if (0 == Input.touchCount && !Input.GetMouseButton(0)) { float value = scrollbar.value; float remainder = value % oneEquallyDividedValue; if (remainder <= oneEquallyDividedValue / 2) { scrollbar.value -= remainder; } else { scrollbar.value += oneEquallyDividedValue - remainder; } } } }
お詫び
だいぶ雑になっちゃったので需要あればいつか書き直します。