Tanoda
FancyGridView.cs
Go to the documentation of this file.
1
3
4using System;
5using System.Collections.Generic;
6using System.Linq;
8
10{
19 public abstract class FancyGridView<TItemData, TContext> : FancyScrollRect<TItemData[], TContext>
20 where TContext : class, IFancyGridViewContext, new()
21 {
25 protected abstract class DefaultCellGroup : FancyCellGroup<TItemData, TContext> { }
26
30 [SerializeField] protected float startAxisSpacing = 0f;
31
35 [SerializeField] protected int startAxisCellCount = 4;
36
40 [SerializeField] protected Vector2 cellSize = new Vector2(100f, 100f);
41
49 protected sealed override GameObject CellPrefab => cellGroupTemplate;
50
52 protected override float CellSize => Scroller.ScrollDirection == ScrollDirection.Horizontal
53 ? cellSize.x
54 : cellSize.y;
55
59 public int DataCount { get; private set; }
60
61 GameObject cellGroupTemplate;
62
64 protected override void Initialize()
65 {
66 base.Initialize();
67
68 Debug.Assert(startAxisCellCount > 0);
69
70 Context.ScrollDirection = Scroller.ScrollDirection;
71 Context.GetGroupCount = () => startAxisCellCount;
72 Context.GetStartAxisSpacing = () => startAxisSpacing;
73 Context.GetCellSize = () => Scroller.ScrollDirection == ScrollDirection.Horizontal
74 ? cellSize.y
75 : cellSize.x;
76
78 }
79
99 protected abstract void SetupCellTemplate();
100
106 protected virtual void Setup<TGroup>(FancyCell<TItemData, TContext> cellTemplate)
108 {
109 Context.CellTemplate = cellTemplate.gameObject;
110
111 cellGroupTemplate = new GameObject("Group").AddComponent<TGroup>().gameObject;
112 cellGroupTemplate.transform.SetParent(cellContainer, false);
113 cellGroupTemplate.SetActive(false);
114 }
115
120 public virtual void UpdateContents(IList<TItemData> items)
121 {
122 DataCount = items.Count;
123
124 var itemGroups = items
125 .Select((item, index) => (item, index))
126 .GroupBy(
127 x => x.index / startAxisCellCount,
128 x => x.item)
129 .Select(group => group.ToArray())
130 .ToArray();
131
132 UpdateContents(itemGroups);
133 }
134
140 protected override void JumpTo(int itemIndex, float alignment = 0.5f)
141 {
142 var groupIndex = itemIndex / startAxisCellCount;
143 base.JumpTo(groupIndex, alignment);
144 }
145
153 protected override void ScrollTo(int itemIndex, float duration, float alignment = 0.5f, Action onComplete = null)
154 {
155 var groupIndex = itemIndex / startAxisCellCount;
156 base.ScrollTo(groupIndex, duration, alignment, onComplete);
157 }
158
167 protected override void ScrollTo(int itemIndex, float duration, Ease easing, float alignment = 0.5f, Action onComplete = null)
168 {
169 var groupIndex = itemIndex / startAxisCellCount;
170 base.ScrollTo(groupIndex, duration, easing, alignment, onComplete);
171 }
172 }
173
180 public abstract class FancyGridView<TItemData> : FancyGridView<TItemData, FancyGridViewContext> { }
181}
UnityEngine.Debug Debug
Definition: TanodaServer.cs:19
複数の FancyCell<TItemData, TContext> を持つセルグループ実装するための抽象基底クラス.
デフォルトのセルグループクラス.
グリッドレイアウトのスクロールビューを実装するための抽象基底クラス. 無限スクロールおよびスナップには対応していません. FancyScrollView<TItemData,...
float startAxisSpacing
最初にセルを配置する軸方向のセル同士の余白.
virtual void Setup< TGroup >(FancyCell< TItemData, TContext > cellTemplate)
セルテンプレートのセットアップを行います.
virtual void UpdateContents(IList< TItemData > items)
渡されたアイテム一覧に基づいて表示内容を更新します.
override void JumpTo(int itemIndex, float alignment=0.5f)
指定したアイテムの位置までジャンプします.
abstract void SetupCellTemplate()
最初にセルが生成される直前に呼び出されます. Setup<TGroup>(FancyCell<TItemData, TContext>) メソッドを使用してセルテンプレートのセットアップを行ってください...
int DataCount
アイテムの総数.
Vector2 cellSize
セルのサイズ.
int startAxisCellCount
最初にセルを配置する軸方向のセル数.
override void ScrollTo(int itemIndex, float duration, Ease easing, float alignment=0.5f, Action onComplete=null)
指定したアイテムの位置まで移動します.
sealed override GameObject CellPrefab
セルのグループ Prefab.
override void ScrollTo(int itemIndex, float duration, float alignment=0.5f, Action onComplete=null)
指定したアイテムの位置まで移動します.
スクロール位置の制御を行うコンポーネント.
Definition: Scroller.cs:14
ScrollDirection ScrollDirection
スクロール方向.
Definition: Scroller.cs:29
Credit Erdener Gonenc - @PixelEnvision.