powerfun-unity/Assets/BannerController.cs

259 lines
9.1 KiB
C#
Raw Normal View History

2021-12-27 09:39:07 +08:00
using Assets.Scripts;
using Assets.Scripts.Apis.Models;
using DG.Tweening;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
2021-12-28 11:25:09 +08:00
using UnityEngine.UI;
2021-12-27 09:39:07 +08:00
public class BannerController : MonoBehaviour
{
// Start is called before the first frame update
private List<CanvasGroup> itemList;
private List<Vector3> standardPositions;
private List<Recommand> list;
2021-12-27 09:39:07 +08:00
private int currentIndex = 1;
void Awake()
{
itemList = new List<CanvasGroup>
{
transform.Find("1").GetComponent<CanvasGroup>(),
transform.Find("2").GetComponent<CanvasGroup>(),
transform.Find("3").GetComponent<CanvasGroup>()
};
standardPositions = new List<Vector3>
{
transform.Find("1").localPosition,transform.Find("2").localPosition,transform.Find("3").localPosition
};
AddTouchEvent();
2021-12-28 11:25:09 +08:00
2021-12-27 09:39:07 +08:00
Debug.Log(standardPositions[0]);
Debug.Log(standardPositions[1]);
Debug.Log(standardPositions[2]);
}
TKPanRecognizer pan;
private void AddTouchEvent()
{
pan = new TKPanRecognizer();
var panList = new List<CanvasGroup>();
pan.gestureRecognizedEvent += (r) =>
{
if (!App.currentPageIsHome) return;
int center = GetCenterIndex(),
left = GetSideIndex(true),
right = GetSideIndex(false);
if (!(center == -1 || left == -1 || right == -1) && panList.Count == 0)
{
panList.Add(itemList[left]);
panList.Add(itemList[center]);
panList.Add(itemList[right]);
}
if (panList.Count == 0) return;
var startPoint = r.startTouchLocation();
if (((RectTransform)transform).isPointInTransfrom(startPoint))
{
foreach (var item in panList)
{
item.GetComponent<Button>().onClick.RemoveAllListeners();
}
var offset = pan.deltaTranslation;
if (panList[1].transform.localPosition.x == 0)
{
panList[1].transform.DOScale(0.8f, 0.5f);
}
if (offset.x > 0)
{
//-43 0 43
//后面的 如果往左,需要回到-43再往右
panList[0].transform.localPosition += new Vector3(1, 0, 0);
panList[1].transform.localPosition += new Vector3(1, 0, 0);
panList[2].transform.localPosition += new Vector3(-1, 0, 0);
}
else if (offset.x < 0)
{
panList[0].transform.localPosition += new Vector3(1, 0, 0);
panList[1].transform.localPosition += new Vector3(-1, 0, 0);
//后面的 如果往右需要回到43再往左
panList[2].transform.localPosition += new Vector3(-1, 0, 0);
}
}
else
{
panList.Clear();
}
};
pan.gestureCompleteEvent += (r) =>
{
if (!App.currentPageIsHome) return;
if (panList.Count == 0) return;
if (panList[1].transform.localPosition.x < 0)
{
DOLeft(panList[0], panList[1], panList[2]);
}
else
{
DORight(panList[0], panList[1], panList[2]);
}
panList.Clear();
};
TouchKit.addGestureRecognizer(pan);
}
2021-12-28 11:25:09 +08:00
private void Start()
{
GetList();
}
2021-12-27 09:39:07 +08:00
async void GetList()
{
var res = await ConfigHelper.mapApi.GetRecommendList();
2021-12-27 09:39:07 +08:00
if (res.result)
{
2021-12-29 14:23:37 +08:00
if (res.data.Count >= 3)
{
Initial(res.data);
gameObject.SetActive(true);
}
else
{
gameObject.SetActive(false);
}
2021-12-27 09:39:07 +08:00
}
}
public void Initial(List<Recommand> list)
2021-12-27 09:39:07 +08:00
{
int index = 0;
foreach (CanvasGroup c in itemList)
{
2021-12-28 11:25:09 +08:00
var area = list[index++];
c.GetComponent<RecommendController>().Initial(area);
c.GetComponent<Button>().onClick.RemoveAllListeners();
2021-12-28 11:25:09 +08:00
if (c.alpha != 1)
{
if (c.transform.localPosition.x < 0)
{
c.GetComponent<Button>().onClick.AddListener(Right);
}
else
{
c.GetComponent<Button>().onClick.AddListener(Left);
}
}
else
{
c.GetComponent<Button>().onClick.AddListener(()=>GoDetail(c));
}
2021-12-27 09:39:07 +08:00
}
currentIndex = 1;
this.list = list;
}
private void Right()
{
int center = GetCenterIndex(),
left = GetSideIndex(true),
right = GetSideIndex(false);
2021-12-27 09:39:07 +08:00
if (center == -1 || left == -1 || right == -1) return;
DOTween.CompleteAll();
DORight(itemList[left], itemList[center], itemList[right]);
}
void DORight(CanvasGroup left, CanvasGroup center, CanvasGroup right)
{
Sequence se = DOTween.Sequence();
2022-01-05 17:40:12 +08:00
se.Join(center.DOFade(0.5f, 0.3f));
se.Join(center.GetComponent<RectTransform>().DOScale(Vector3.one * 0.8f, 0.3f));
se.Join(center.GetComponent<RectTransform>().DOLocalMoveX(43, 0.3f));
se.Join(right.GetComponent<RectTransform>().DOLocalMoveX(-43, 0.3f));
2021-12-28 11:25:09 +08:00
var area = list[((currentIndex++) + list.Count) % list.Count];
right.GetComponent<RecommendController>().Initial(area);
2021-12-27 09:39:07 +08:00
if (currentIndex >= list.Count) currentIndex = 0;
2022-01-05 17:40:12 +08:00
se.Join(left.DOFade(1, 0.3f));
se.Join(left.GetComponent<RectTransform>().DOScale(Vector3.one, 0.3f));
se.Join(left.GetComponent<RectTransform>().DOLocalMoveX(0, 0.3f));
se.Play();
left.transform.SetAsLastSibling();
2021-12-28 11:25:09 +08:00
//事件改变
left.GetComponent<Button>().onClick.RemoveAllListeners();
left.GetComponent<Button>().onClick.AddListener(() => GoDetail(left));
center.GetComponent<Button>().onClick.RemoveAllListeners();
center.GetComponent<Button>().onClick.AddListener(Left);
right.GetComponent<Button>().onClick.RemoveAllListeners();
right.GetComponent<Button>().onClick.AddListener(Right);
2021-12-27 09:39:07 +08:00
}
private void Left()
{
int center = GetCenterIndex(),
left = GetSideIndex(true),
right = GetSideIndex(false);
2021-12-27 09:39:07 +08:00
if (center == -1 || left == -1 || right == -1) return;
DOTween.CompleteAll();
DOLeft(itemList[left], itemList[center], itemList[right]);
}
void DOLeft(CanvasGroup left, CanvasGroup center, CanvasGroup right)
{
Sequence se = DOTween.Sequence();
2022-01-05 17:40:12 +08:00
se.Join(center.DOFade(0.5f, 0.3f));
se.Join(center.GetComponent<RectTransform>().DOScale(Vector3.one * 0.8f, 0.3f));
se.Join(center.GetComponent<RectTransform>().DOLocalMoveX(-43, 0.3f));
se.Join(left.GetComponent<RectTransform>().DOLocalMoveX(43, 0.3f));
2021-12-28 11:25:09 +08:00
var area = list[((currentIndex--) + list.Count) % list.Count];
var centerArea = list[currentIndex + 1];
left.GetComponent<RecommendController>().Initial(area);
2021-12-27 09:39:07 +08:00
if (currentIndex < 0) currentIndex = list.Count - 1;
2022-01-05 17:40:12 +08:00
se.Join(right.DOFade(1, 0.3f));
se.Join(right.GetComponent<RectTransform>().DOScale(Vector3.one, 0.3f));
se.Join(right.GetComponent<RectTransform>().DOLocalMoveX(0, 0.3f));
se.Play();
right.transform.SetAsLastSibling();
2021-12-28 11:25:09 +08:00
//事件改变
right.GetComponent<Button>().onClick.RemoveAllListeners();
right.GetComponent<Button>().onClick.AddListener(() => GoDetail(right));
center.GetComponent<Button>().onClick.RemoveAllListeners();
center.GetComponent<Button>().onClick.AddListener(Right);
left.GetComponent<Button>().onClick.RemoveAllListeners();
left.GetComponent<Button>().onClick.AddListener(Left);
2021-12-27 09:39:07 +08:00
}
int GetCenterIndex()
{
return itemList.FindIndex(x => x.transform.localPosition.x == 0);
}
int GetSideIndex(bool left)
{
return itemList.FindIndex(x => left ? x.transform.localPosition.x < 0 : x.transform.localPosition.x > 0);
}
void GoDetail(CanvasGroup c)
{
if (c.transform.localPosition.x == 0)
{
var se = DOTween.Sequence();
se.Append(c.transform.DOScale(1.05f * Vector3.one, 0.15f));
se.Append(c.transform.DOScale(1f * Vector3.one, 0.15f));
se.Play().onComplete = ()=>
{
c.GetComponent<RecommendController>().DoWithType();
};
}
}
float autoTime = 5;
2021-12-27 09:39:07 +08:00
// Update is called once per frame
void Update()
{
autoTime -= Time.deltaTime;
if (autoTime < 0)
{
Left();
autoTime += 5;
}
}
private void OnDestroy()
{
Debug.Log(248+"毁灭");
TouchKit.removeGestureRecognizer(pan);
2021-12-27 09:39:07 +08:00
}
}