powerfun-unity/Assets/Scripts/Scenes/Ride/Competiton/CompetitionRankingFactory.cs

182 lines
7.8 KiB
C#
Raw Permalink Normal View History

using Assets.Scenes.Ride.Scripts.Model;
using Assets.Scenes.Ride.Scripts.Model.CyclingModels;
2021-08-11 16:56:17 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace Assets.Scenes.Ride.Scripts
{
public class CompetitionRankingFactory : BaseListFactory
{
public bool isInit = false;
2021-07-09 18:16:50 +08:00
private bool isnext = false;
private List<CompetitionRankingSortModel> rankingList {get;set;}
private AbstractPlayer currentPlayer { get; set; }
private Text Title { get; set; }
private Text OnlineUserNum { get; set; }
private Text Rank { get; set; }
private GameObject PreBtn { get; set; }
private GameObject NextBtn { get; set; }
protected override void Awake()
{
//base.Awake();
#if UNITY_IOS || UNITY_ANDROID
pageSize = 7;
#else
2021-09-17 18:31:00 +08:00
pageSize = 5;
#endif
scroll = transform.Find("List").gameObject;
if (scroll != null)
{
UIManager.AddEvent(scroll, UnityEngine.EventSystems.EventTriggerType.EndDrag, OnEndDrag);
}
parent = scroll.transform.Find("Viewport/Content");
cyclingController = FindObjectOfType<CyclingController>();
playerController = FindObjectOfType<PlayerController>();
currentPlayer = cyclingController.currentPlayer;
2021-09-03 13:06:26 +08:00
#if UNITY_IOS || UNITY_ANDROID
nearByItem = Resources.Load<GameObject>("UI/Prefab/Match/Mobile/CompetitionRankingItem");
nearByMajorItem = Resources.Load<GameObject>("UI/Prefab/Match/Mobile/CompetitionRankingMajorItem");
#else
nearByItem = Resources.Load<GameObject>("UI/Prefab/Match/CompetitionRankingItem");
nearByMajorItem = Resources.Load<GameObject>("UI/Prefab/Match/CompetitionRankingMajorItem");
2021-09-03 13:06:26 +08:00
#endif
Title = transform.Find("Title").GetComponent<Text>();
OnlineUserNum = transform.Find("Head/OnlineUserNum").GetComponent<Text>();
PreBtn = transform.Find("Pre").gameObject;//上一页
NextBtn = transform.Find("Next").gameObject;//下一页
Rank = transform.Find("Rank").GetComponent<Text>();
UIManager.AddEvent(PreBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, PrePage);
UIManager.AddEvent(NextBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, NextPage);
}
private void PrePage(BaseEventData baseEventData)
{
SetPreIndex();
isInit = true;
2021-07-09 18:16:50 +08:00
isnext = false;
CreateList();
}
private void NextPage(BaseEventData baseEventData)
{
SetNextIndex();
isInit = true;
2021-07-09 18:16:50 +08:00
isnext = true;
CreateList();
}
2021-09-17 22:20:05 +08:00
int index = 0;
protected override void CreateList()
{
CompetitionModel s = cyclingController.cyclingController as CompetitionModel;
var ss = s?.competitionRankingModel;
rankingList = ss?.Sorts;
if (rankingList == null) return;
2021-08-10 16:36:13 +08:00
rankingList = rankingList.OrderByDescending(u => u.IsCompleted).ThenBy(d => d.CreateTime).ThenByDescending(d => d.EndDistance).ToList();
2021-09-17 22:20:05 +08:00
#if UNITY_IOS || UNITY_ANDROID
rankingList = rankingList.Where(c=>!c.IsCompleted).OrderByDescending(d => d.EndDistance).ToList();
#else
rankingList = rankingList.OrderByDescending(u => u.IsCompleted).ThenBy(d => d.CreateTime).ThenByDescending(d => d.EndDistance).ToList();
#endif
//当前参赛总人数
var totalCount = rankingList.Count();
2021-07-30 15:38:40 +08:00
OnlineUserNum.text = " "+totalCount.ToString();
2021-09-03 13:06:26 +08:00
LayoutRebuilder.ForceRebuildLayoutImmediate(OnlineUserNum.rectTransform);
//当前用户排名
var currentIndex = rankingList.Where(c => c.UserId == cyclingController.currentPlayer.UserId).FirstOrDefault()?.Index ?? 0;
totalPages = (pageSize>0?totalCount / pageSize:0) + (totalCount % pageSize> 0? 1:0);
if (!isInit)
{
//当前用户在第几页
pageIndex = (pageSize > 0 ? currentIndex / pageSize : 1) + (currentIndex % pageSize > 0 ? 1 : 0);
}
var p = pageIndex > 0 ? pageIndex : 1;
index = (p - 1) * pageSize;
Rank.text = $"{pageIndex}/{totalPages}";
var pagedList = rankingList.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
2021-07-09 18:16:50 +08:00
//删除
var currentList = FindObjectsOfType<CompetitionRankingItem>();
foreach (var item in currentList)
{
var e = pagedList.Where(c => c.UserId == item.UserId).FirstOrDefault();
if (e == null)
{
item.transform.gameObject.SetActive(false);//TODO这里暂时不删除删除对应的图片和脚本依赖这个对象脚本提供一个dispose
bufferSize--;
}
}
2021-08-12 13:24:00 +08:00
var list = FindObjectsOfType<CompetitionRankingItem>();
foreach (var o in list)
{
o.transform.SetAsFirstSibling();
}
2021-09-17 22:20:05 +08:00
2021-07-09 18:16:50 +08:00
//创建或者新增
for (int i = 0; i < pagedList.Count(); i++)
{
2021-09-17 22:20:05 +08:00
index++;
CreateOrUpdate(pagedList[i]);
}
2021-07-09 18:16:50 +08:00
}
private void CreateOrUpdate(CompetitionRankingSortModel item)
{
var rankingList = FindObjectsOfType<CompetitionRankingItem>();
2021-08-12 13:24:00 +08:00
var competitionRankingItem = rankingList.Where(c => c.UserId == item.UserId).FirstOrDefault();
//如果当前有这个用户则更新没有则创建并setslibingindex
if (competitionRankingItem == null)
{
//创建
if (bufferSize < pageSize)
{
//情况一还有足够的buffer,直接创建
GameObject prefabItem = item.IsSelf ? nearByMajorItem : nearByItem;
GameObject newObj = (GameObject)Instantiate(prefabItem, parent);
competitionRankingItem = newObj.GetComponent<CompetitionRankingItem>();
bufferSize++;
}
else
{
//情况二没有足够的buffer找到要被淘汰的buffer()最后一名
2021-07-09 18:16:50 +08:00
if (isnext) {
competitionRankingItem = rankingList.OrderBy(c => c.rank).FirstOrDefault();
}
else
{
competitionRankingItem = rankingList.OrderByDescending(c => c.rank).FirstOrDefault();
}
}
}
competitionRankingItem.setUserId(item.UserId);
2021-09-17 22:20:05 +08:00
#if UNITY_IOS || UNITY_ANDROID
competitionRankingItem.SetRank(index);
#else
competitionRankingItem.SetRank(item.Index);
2021-09-17 22:20:05 +08:00
#endif
competitionRankingItem.setName(item.Name);
competitionRankingItem.setRatio(item.KGWeight + "W/KG");
competitionRankingItem.setSpeed(item.Speed.ToString() + "KM/H");
competitionRankingItem.setHead(item.Headimage);
var countryTexture = cyclingController.GetCountryImageByName(item.CountryImg);
competitionRankingItem.setCountry(countryTexture);
2021-08-11 16:56:17 +08:00
var near = Math.Round((item.EndDistance - cyclingController.currentPlayer.TotalDistance)*1000);
competitionRankingItem.setDistance(cyclingController.currentPlayer.UserId == item.UserId?"0M": near.ToString() + "M");
2021-09-17 22:20:05 +08:00
#if UNITY_IOS || UNITY_ANDROID
competitionRankingItem.transform.SetSiblingIndex(index);
#else
competitionRankingItem.transform.SetSiblingIndex(item.Index);
2021-09-17 22:20:05 +08:00
#endif
}
}
}