卡组优化(分帧加载)

This commit is contained in:
YiHan0621
2025-10-15 20:04:17 +08:00
parent f357a9c3a1
commit c8f1e585bf
18 changed files with 579 additions and 181 deletions

View File

@@ -0,0 +1,92 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace TcgEngine.UI
{
/// <summary>
/// 卡组分帧加载器
/// </summary>
public class CardUILoading : MonoBehaviour
{
public CardGrid grid_content;
public GameObject card_prefab;
private List<CollectionCard> all_list = new List<CollectionCard>();
private bool spawned = false;
// 分帧加载
private Coroutine spawnRoutine;
private static CardUILoading instance;
protected void Awake()
{
instance = this;
}
private void Start()
{
grid_content = CollectionPanel.Get().grid_content;
card_prefab = CollectionPanel.Get().card_prefab;
if (!spawned)
{
if (spawnRoutine != null)
StopCoroutine(spawnRoutine);
spawnRoutine = StartCoroutine(SpawnCardsCoroutine());
}
}
private IEnumerator SpawnCardsCoroutine()
{
spawned = true;
foreach (CollectionCard card in all_list)
Destroy(card.gameObject);
all_list.Clear();
// 首帧压力大,先让出 帧
for (int i = 0; i < 5; i++)
yield return null;
int batchSize = 15; // 每帧生成
int counter = 0;
List<VariantData> variants = VariantData.GetAll();
List<CardData> cards = CardData.GetAll();
foreach (VariantData variant in variants)
{
foreach (CardData card in cards)
{
GameObject nCard = Instantiate(card_prefab, grid_content.transform);
CollectionCard dCard = nCard.GetComponent<CollectionCard>();
dCard.SetCard(card, variant, 0);
all_list.Add(dCard);
nCard.SetActive(false);
counter++;
if (counter % batchSize == 0)
{
yield return null;
}
}
}
}
public List<CollectionCard> CardList()
{
return all_list;
}
public static CardUILoading Get()
{
return instance;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: cc0d0b1b62a7edd4db4ec80f2267f324
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -25,11 +25,8 @@ namespace TcgEngine.UI
private void Start()
{
if (card_ui.GetCard().isOnline)
{
card_ui.onClick += onClick;
card_ui.onClickRight += onClickRight;
}
card_ui.onClick += onClick;
card_ui.onClickRight += onClickRight;
}
public void SetCard(CardData card, VariantData variant, int quantity)

View File

@@ -68,8 +68,12 @@ namespace TcgEngine.UI
private bool editing_deck = false;
private bool saving = false;
private bool spawned = false;
private bool update_grid = false;
private float update_grid_timer = 0f;
// 分帧加载
private Coroutine spawnRoutine;
private List<UserCardData> deck_cards = new List<UserCardData>();
@@ -139,17 +143,40 @@ namespace TcgEngine.UI
}
}
}
private void SpawnCards()
public void SpawnCards()
{
spawned = true;
all_list = CardUILoading.Get().CardList();
foreach (CollectionCard dCard in all_list)
{
dCard.onClick += OnClickCard;
dCard.onClickRight += OnClickCardRight;
}
// if (spawnRoutine != null)
// StopCoroutine(spawnRoutine);
// spawnRoutine = StartCoroutine(SpawnCardsCoroutine());
}
private IEnumerator SpawnCardsCoroutine()
{
spawned = true;
foreach (CollectionCard card in all_list)
Destroy(card.gameObject);
all_list.Clear();
foreach (VariantData variant in VariantData.GetAll())
int batchSize = 2; // 每帧生成2张卡
int counter = 0;
List<VariantData> variants = VariantData.GetAll();
List<CardData> cards = CardData.GetAll();
foreach (VariantData variant in variants)
{
foreach (CardData card in CardData.GetAll())
foreach (CardData card in cards)
{
GameObject nCard = Instantiate(card_prefab, grid_content.transform);
CollectionCard dCard = nCard.GetComponent<CollectionCard>();
@@ -159,9 +186,49 @@ namespace TcgEngine.UI
all_list.Add(dCard);
nCard.SetActive(false);
counter++;
if (counter % batchSize == 0)
yield return null; // 每 batchSize 张卡让出一帧
}
}
}
// private IEnumerator SpawnCardsCoroutine()
// {
// spawned = true;
// foreach (CollectionCard card in all_list)
// Destroy(card.gameObject);
// all_list.Clear();
//
// int batchSize = 2; // 每帧生成2张卡
// int counter = 0;
//
// List<VariantData> variants = VariantData.GetAll();
// List<CardData> cards = CardData.GetAll();
//
// foreach (VariantData variant in variants)
// {
// foreach (CardData card in cards)
// {
// GameObject nCard = Instantiate(card_prefab, grid_content.transform);
// CollectionCard dCard = nCard.GetComponent<CollectionCard>();
// dCard.SetCard(card, variant, 0);
// dCard.onClick += OnClickCard;
// dCard.onClickRight += OnClickCardRight;
//
// all_list.Add(dCard);
// nCard.SetActive(false);
//
// counter++;
// if (counter % batchSize == 0)
// yield return null; // 每 batchSize 张卡让出一帧
// }
// }
//
// isLoaded = true;
// Hide();
// }
//----- Reload User Data ---------------
@@ -261,14 +328,30 @@ namespace TcgEngine.UI
all_cards.Add(card);
}
if (filter_dropdown == 0) //Name
all_cards.Sort((CardDataQ a, CardDataQ b) => { return a.card.title.CompareTo(b.card.title); });
if (filter_dropdown == 1) //Attack
all_cards.Sort((CardDataQ a, CardDataQ b) => { return b.card.attack == a.card.attack ? b.card.hp.CompareTo(a.card.hp) : b.card.attack.CompareTo(a.card.attack); });
if (filter_dropdown == 2) //hp
all_cards.Sort((CardDataQ a, CardDataQ b) => { return b.card.hp == a.card.hp ? b.card.attack.CompareTo(a.card.attack) : b.card.hp.CompareTo(a.card.hp); });
if (filter_dropdown == 3) //Cost
all_cards.Sort((CardDataQ a, CardDataQ b) => { return b.card.mana == a.card.mana ? a.card.title.CompareTo(b.card.title) : a.card.mana.CompareTo(b.card.mana); });
// 统一的基础排序逻辑
all_cards.Sort((CardDataQ a, CardDataQ b) =>
{
// 第一级排序isOnlinefalse 的永远在最下面)
bool aOnline = a.card.isOnline;
bool bOnline = b.card.isOnline;
if (aOnline != bOnline)
return bOnline.CompareTo(aOnline); // true在前 false在后
// 第二级排序:根据 dropdown 决定方式
switch (filter_dropdown)
{
case 0: // Name
return a.card.title.CompareTo(b.card.title);
case 1: // Attack
return b.card.attack == a.card.attack ? b.card.hp.CompareTo(a.card.hp) : b.card.attack.CompareTo(a.card.attack);
case 2: // HP
return b.card.hp == a.card.hp ? b.card.attack.CompareTo(a.card.attack) : b.card.hp.CompareTo(a.card.hp);
case 3: // Mana Cost
return b.card.mana == a.card.mana ? a.card.title.CompareTo(b.card.title) : a.card.mana.CompareTo(b.card.mana);
default:
return a.card.title.CompareTo(b.card.title);
}
});
foreach (CardDataQ card in all_cards)
{
@@ -845,6 +928,11 @@ namespace TcgEngine.UI
ShowDeckList();
}
public override void Hide(bool instant = false)
{
base.Hide(instant);
}
public static CollectionPanel Get()
{
return instance;