```
feat(gameplay): 更新单位属性和材质配置 - 调整多个单位的基础生命值和攻击力数值平衡 - 修改CoreBattleGround材质的纹理缩放比例 - 更新地砖材质颜色为白色 - 优化纹理资源设置,调整最大纹理尺寸并添加PlayableAds平台支持 - 修复弓箭手技能目标查找逻辑,改用统一的敌人检测方法 - 为水晶矿添加中立阵营设置和光球视觉效果同步 - 调整预制体中的全局缩放参数 - 为狼人和石巨人添加NavMeshAgent组件支持 - 优化水晶矿血条显示位置计算方式 ```
This commit is contained in:
1 parent
0e7de5f885
commit
53d95802e5
448 files changed
+133333
-472
No files matched your search
@@ -0,0 +1,113 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
/// <summary>
|
||||
/// 拆家版固定八卡组、四张手牌轮转管理器。
|
||||
/// </summary>
|
||||
public class BattleDeckCycle : MonoBehaviour
|
||||
{
|
||||
public static BattleDeckCycle Instance { get; private set; }
|
||||
|
||||
[SerializeField] private Transform cardRoot;
|
||||
[SerializeField] private int visibleSlotCount = 4;
|
||||
[SerializeField] private string[] deckDataNames =
|
||||
{
|
||||
"人类士兵Data", "弓箭手Data", "盾卫Data", "精锐士兵Data",
|
||||
"法师Data", "狂暴狼人Data", "石巨人Data", "弓箭猎人Data"
|
||||
};
|
||||
|
||||
private readonly List<CharacterData> deck = new List<CharacterData>();
|
||||
private readonly List<CharacterData> hand = new List<CharacterData>();
|
||||
private readonly Queue<CharacterData> drawQueue = new Queue<CharacterData>();
|
||||
private SummonCardButton[] buttons;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (Instance != null && Instance != this)
|
||||
{
|
||||
Destroy(gameObject);
|
||||
return;
|
||||
}
|
||||
Instance = this;
|
||||
BuildDeck();
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
if (cardRoot == null)
|
||||
cardRoot = GameObject.Find("角色卡片")?.transform;
|
||||
|
||||
buttons = cardRoot != null
|
||||
? cardRoot.GetComponentsInChildren<SummonCardButton>(true)
|
||||
: FindObjectsOfType<SummonCardButton>(true);
|
||||
|
||||
System.Array.Sort(buttons, (a, b) => a.summonSlot.CompareTo(b.summonSlot));
|
||||
HideExtraSlots();
|
||||
hand.Clear();
|
||||
drawQueue.Clear();
|
||||
|
||||
for (int i = 0; i < visibleSlotCount && i < deck.Count; i++)
|
||||
hand.Add(deck[i]);
|
||||
for (int i = visibleSlotCount; i < deck.Count; i++)
|
||||
drawQueue.Enqueue(deck[i]);
|
||||
|
||||
RefreshAllCards();
|
||||
}
|
||||
|
||||
public CharacterData GetCard(int slot)
|
||||
{
|
||||
int index = slot - 1;
|
||||
return index >= 0 && index < hand.Count ? hand[index] : null;
|
||||
}
|
||||
|
||||
public bool TryPlay(int slot)
|
||||
{
|
||||
CharacterData card = GetCard(slot);
|
||||
if (card == null || card.unitPrefab == null || CastleSpawnManager.Instance == null)
|
||||
return false;
|
||||
|
||||
if (!CastleSpawnManager.Instance.TrySpawn(card, 0))
|
||||
return false;
|
||||
|
||||
int index = slot - 1;
|
||||
CharacterData played = hand[index];
|
||||
hand[index] = drawQueue.Dequeue();
|
||||
drawQueue.Enqueue(played);
|
||||
RefreshAllCards();
|
||||
return true;
|
||||
}
|
||||
|
||||
private void BuildDeck()
|
||||
{
|
||||
deck.Clear();
|
||||
foreach (string dataName in deckDataNames)
|
||||
{
|
||||
CharacterData data = Resources.Load<CharacterData>("Data/" + dataName);
|
||||
if (data == null)
|
||||
{
|
||||
Debug.LogWarning($"卡组缺少角色数据: Resources/Data/{dataName}.asset");
|
||||
continue;
|
||||
}
|
||||
deck.Add(data);
|
||||
}
|
||||
}
|
||||
|
||||
private void HideExtraSlots()
|
||||
{
|
||||
foreach (var button in buttons)
|
||||
{
|
||||
if (button != null && button.summonSlot > visibleSlotCount)
|
||||
button.gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
|
||||
private void RefreshAllCards()
|
||||
{
|
||||
if (buttons == null) return;
|
||||
foreach (var button in buttons)
|
||||
{
|
||||
if (button == null || button.summonSlot > visibleSlotCount) continue;
|
||||
button.SetDeckCharacter(GetCard(button.summonSlot));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user