2019. 7. 26. 18:14ㆍ무한 스크롤 뷰
드래그 작업
드래그 시 [드래그의 최종 영역 설정], [단순 드래그], [순간 드래그]를 고려해야 합니다. 단순 드래그의 경우 가볍게 드래그를 하는 정도이며, 순간 드래그는 드래그를 강하게 함으로써 머신 슬롯처럼 여러 개의 항목을 지속적으로 갱신시켜주는 드래그를 말합니다. 둘을 구분하는 이유는 처리 방식이 다른 점이 있기 때문입니다. 지금부터 설명하는 스크롤 뷰의 방향은 Vertical이며 드래그 방식은 Top & Bottom입니다.
드래그의 최종 영역 설정
아이템 개수를 통하여 행 수와 열 수를 구한 다음 드래그 Bounds를 설정합니다.
단순 드래그
드래그를 하면 드래그 좌표가 행 하단 좌표보다 클 경우 다음과 같은 진행이 이루어집니다.
InLine1이 범위에서 보여지는 범위에서 벋어 납니다.
InLine1 |
In아이템1 |
In아이템2 |
In아이템3 |
In아이템4 |
InLine2 |
In아이템1 |
In아이템2 |
In아이템3 |
In아이템4 |
InLine3 |
In아이템1 |
In아이템2 |
In아이템3 |
In아이템4 |
InLine1은 InLine3의 밑으로 이동하고 Line4의 정보로 초기화합니다.
InLine2 |
In아이템1 |
In아이템2 |
In아이템3 |
In아이템4 |
InLine3 |
In아이템1 |
In아이템2 |
In아이템3 |
In아이템4 |
OutLine4 |
Out아이템1 |
Out아이템2 |
Out아이템3 |
Out아이템4 |
위와 같은 과정을 Top, Bottom 방향으로 드래그할 때 계속해서 반복합니다.
순간 드래그
기본적인 원리는 단순 드래그와 비슷합니다. 하지만 순간적으로 주는 강도가 사용자마다 다르며 deltaTime 역시 기기마다 다르기 때문에 Update 문에서 스크롤 뷰의 좌표가 일정하지 않습니다. 따라서 스크롤 뷰가 이동 중일 때 좌표를 가지고 와서 해당 좌표가 어떤 Line 인지 계산하여 해당 라인의 모든 아이템을 갱신하도록 합니다.
후 처리 상속받은 Grid의 Reposition
Grid의 Reposition 함수를 호출하면 아이템이 재배치가 되는데 위의 방식으로 스크롤 뷰를 변경하다 보니 Grid 역시 상속받은 후 재정의를 하였습니다. 재정의 후 재배치를 적용시켰으나 다음과 같은 문제가 발생했습니다.
최초 시작 라인들 |
|
마지막 라인들 |
|
Reposition함수 실행 |
InLine1 |
|
OutLineN – 2(^^b) |
|
OutLineN - 2 |
InLine2 |
=> |
OutLineN – 1 |
=> |
OutLineN – 1 |
OutLine3 |
|
OutLineN |
|
OutLineN(-_-??????) |
마지막 라인들에서 Reposition을 실행하면 마지막 라인인데 대비용 라인을 하나 생성하게 됩니다. 따라서 if문을 사용하여 마지막 라인일 경우 보이지 않는 라인에 대해 예외처리를 합니다.
public class StrategyMoveField
{
public void MoveFieldToLast(UIEndlessScrollView view, int fieldIndex, EndlessToken token)
{
UIEndlessField field = null;
Vector3 movePos = Vector3.zero;
int from = 0;
int to = 0;
if (token.CurFieldIndex < fieldIndex)
{
from = 0;
to = view.Fields.Count;
movePos = view.Fields[to - 1].GetPosition(Space.Self) + view.Batch.GetDirection(true, token);
field = view.Fields[from];
field.Index = view.Fields[to - 1].Index + 1;
}
else
{
from = view.Fields.Count;
to = 0;
movePos = view.Fields[to].GetPosition(Space.Self) + view.Batch.GetDirection(false, token);
field = view.Fields[from - 1];
field.Index = view.Fields[to].Index - 1;
}
field.SetPosition(movePos, Space.Self);
view.Fields.Insert(to, field);
view.Fields.RemoveAt(from);
}
}
|