English Documents Available(英語ドキュメント)
Fancy Scroll Viewを使用した、UnityのuGUI用のカルーセルビューです。
- カルーセルビューを数ステップで簡単に作成可能
- 表示に不要なセルが使いまわされるため高パフォーマンス
- 縦/横スクロールに対応
- カルーセルの動き・各パラメータは細かくカスタム可能
- リポジトリをクローンする
- 以下のシーンを開いて再生する
Unity 2019.4 以上
Fancy Carousel Viewは低レイヤー実装としてFancy Scroll Viewを使用しています。
したがってこれら二つをインストールする必要があります。
- Window > Package ManagerからPackage Managerを開く
- 「+」ボタン > Add package from git URL
- 以下を入力してFancy Scroll Viewをインストール
- 以下を入力してFancy Carousel Viewをインストール
あるいはPackages/manifest.jsonを開き、dependenciesブロックに以下を追記します。
{
"dependencies": {
"jp.setchi.fancyscrollview": "https://github.com/setchi/FancyScrollView.git#upm",
"com.harumak.fancycarouselview": "https://github.com/Haruma-K/FancyCarouselView.git?path=/Assets/FancyCarouselView"
}
}
バージョンを指定したい場合には以下のように記述します。
まずカルーセルの要素であるセルごとのデータを作成します。
以下の例では、セルの背景テクスチャを読み込むためのキーとセルに表示する文字列を定義しています。
public class DemoData
{
public string SpriteResourceKey { get; }
public string Text { get; }
public DemoData(string spriteResourceKey, string text)
{
SpriteResourceKey = spriteResourceKey;
Text = text;
}
}
次にセルのビューを作成します。
CarouselCell
クラスを継承し、Refresh
メソッドにビューの更新処理を記述します。
using FancyCarouselView.Runtime.Scripts;
using UnityEngine;
using UnityEngine.UI;
public class DemoCarouselCell : CarouselCell<DemoData, DemoCarouselCell>
{
[SerializeField] private Image _image = default;
[SerializeField] private Text _text = default;
protected override void Refresh(DemoData data)
{
_image.sprite = Resources.Load<Sprite>(data.SpriteResourceKey);
_text.text = data.Text;
}
}
これをGameObjectにアタッチし、セルのPrefabを作成しておきます。
次にカルーセルビューを作成します。
上述のデータとセルのクラスをジェネリックの型に指定したCarouselViewクラスを継承したクラスを作成します。
using FancyCarouselView.Runtime.Scripts;
public class DemoCarouselView : CarouselView<DemoData, DemoCarouselCell>
{
}
これをCanvas配下のGameObjectにアタッチします。
RectTransformの大きさでカルーセルビューの大きさを調整し、CarouselViewのCellSize
プロパティでセル一個あたりの大きさを調整します。
また、Cell Prefab
プロパティには前節で作成したPrefabをアサインします。
ここまでできたら、あとはCarouseView.Setup
メソッドを用いてデータを渡せばカルーセルが表示されます。
using System.Linq;
using UnityEngine;
namespace Demo.Scripts
{
public class Demo : MonoBehaviour
{
[SerializeField] private DemoCarouselView _carouselView = default;
[SerializeField, Range(1, 3)] private int _bannerCount = 3;
private void Start()
{
var items = Enumerable.Range(0, _bannerCount)
.Select(i =>
{
var spriteResourceKey = $"tex_demo_banner_{i:D2}";
var text = $"Demo Banner {i:D2}";
return new DemoData(spriteResourceKey, text);
})
.ToArray();
_carouselView.Setup(items);
}
}
}
Carousel ViewのInspectorで設定できる各プロパティの説明は以下の通りです。
プロパティ名 | 説明 | ||
Cell Container | カルーセルビューの領域を表すRectTransform。 この領域から出たセルは非表示になり、再利用の対象になります。 | ||
Cell Prefab | セルのPrefab。 | ||
Cell Size | セルのサイズ。 | ||
Cell Spacing | セル同士の間隔。 | ||
Snap Animation Durataion | スナップアニメーションの秒数。 | ||
Snap Animation Type | スナップアニメーションのイージングタイプ。 | ||
Auto Scrolling | 一定間隔で自動するクロールするか。 | ||
Interval | 自動スクロールの間隔(秒)。 | ||
Inverse Direction | 自動スクロールの方向を反対するかどうか。 | ||
Scroll Direction | スクロール方向。 | ||
Loop | 両端でループするかどうか。 | ||
Draggable | ドラッグ可能かどうか。 | ||
Progress View | 進捗を表すビュー。詳細は後述。 | ||
Clickable | Progress Viewをクリックした時にそのインデックスにジャンプするか。 |
Fancy Carousel Viewはカルーセルの進捗を表すプログレスビューをサポートしています。
シンプルなドット表示のプログレスビューは以下の手順で使用できます。
pfb_default_carousel_progress_view.prefab
をシーンにインスタンス化- Carousel ViewのProgress Viewプロパティに1.をアサイン
上記のPrefabにはCarouselProgressView
を継承したDotCarouselProgressView
がアタッチされています。
CarouselProgressView
やClickableCarouselProgressView
を継承したクラスを独自で実装すれば、任意の挙動をするプログレスビューを作成できます。
また、DotCarouselProgressView
を使用しつつドットの色やサイズだけを変えたい場合には、
DotCarouselProgressView
のInspectorからProgress Element Prefabだけを差し替えることで実現できます。
CarouselCell.OnPositionUpdated
をオーバーライドするとセルの動きを独自実装できます。
以下はセルの動きを独自実装した例です。
protected override void OnPositionUpdated(float position)
{
base.OnPositionUpdated(position);
var trans = transform;
var pos = position * 2.0f - 1.0f;
var absPos = Mathf.Abs(pos);
var cellPosZ = Mathf.Lerp(0.0f, 120.0f, absPos);
trans.localPosition = new Vector3(trans.localPosition.x, trans.localPosition.y, cellPosZ);
trans.rotation = Quaternion.AngleAxis(pos * -20.0f, Vector3.up);
}
スクロールビューのコンテンツとしてカルーセルビューを使う場合、
Unityの仕様によりカルーセルビューがスクロールビューのドラッグをブロックします。
すなわち、カルーセルビューをドラッグしてもスクロールビューはスクロールしません。
このような場合にはカルーセルビューのGameObjectにScroll Event Propagator
コンポーネントをアタッチします。
このコンポーネントはドラッグイベントを適切に親のScrollRect
に伝播します。
結果として以下のようにスクロールビューとカルーセルビューが適切に動作します。
本ソフトウェアはMITライセンスで公開しています。
ライセンスの範囲内で自由に使っていただいてかまいませんが、
使用の際は以下の著作権表示とライセンス表示が必須となります。
また、本ソフトウェアは以下のソフトウェアがインストールされていることを前提として実装されています(同梱はされていません)。
このソフトウェアのライセンスの詳細については Third Party Notices.md を参照してください。