切换牌组封面

This commit is contained in:
YiHan0621
2025-10-13 18:30:07 +08:00
parent f14b8d6ac6
commit e84768d8fb
8 changed files with 230 additions and 35 deletions

View File

@@ -128,6 +128,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
cover: {fileID: 2493374532469886071}
currentCover: {fileID: 9089188273504675539}
coverName:
--- !u!1 &7551866968519781467
GameObject:
@@ -140,6 +141,7 @@ GameObject:
- component: {fileID: 7904478404613084626}
- component: {fileID: 6541233294276703343}
- component: {fileID: 2493374532469886071}
- component: {fileID: 2155988268365146913}
m_Layer: 5
m_Name: Cover
m_TagString: Untagged
@@ -205,3 +207,47 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &2155988268365146913
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7551866968519781467}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 2493374532469886071}
m_OnClick:
m_PersistentCalls:
m_Calls: []

View File

@@ -678,14 +678,14 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: a983e14bd852ed04c8139d01f5db1451, type: 3}
m_Name:
m_EditorClassIdentifier:
image: {fileID: 0}
image: {fileID: 1528609386195773855}
frame: {fileID: 0}
title: {fileID: 158878364}
value: {fileID: 1226868306}
cost: {fileID: 0}
delete_btn: {fileID: 2044069777743292366}
changeCover_btn: {fileID: 8443272443930128952}
click_audio: {fileID: 8300000, guid: ee596874b52e5a0419b0953e40365942, type: 3}
click_audio: {fileID: 0}
disabled_mat: {fileID: 0}
default_mat: {fileID: 0}
--- !u!1 &7544422736791466863
@@ -727,7 +727,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 46.09, y: -23.3}
m_AnchoredPosition: {x: 46.089996, y: -23.3}
m_SizeDelta: {x: 92.17, y: 34.65}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1353208218199476232

View File

@@ -6403,7 +6403,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -321.14996, y: -60.669006}
m_AnchoredPosition: {x: -321.1499, y: -60.668945}
m_SizeDelta: {x: 642.33, y: 95.84}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &260969709
@@ -14025,7 +14025,7 @@ CanvasGroup:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 706214460}
m_Enabled: 1
m_Alpha: 1
m_Alpha: 0
m_Interactable: 1
m_BlocksRaycasts: 1
m_IgnoreParentGroups: 0
@@ -14459,6 +14459,82 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 721100471}
m_CullTransparentMesh: 1
--- !u!1 &721971466
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 721971469}
- component: {fileID: 721971468}
- component: {fileID: 721971467}
m_Layer: 5
m_Name: ClickBlocker
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &721971467
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 721971466}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &721971468
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 721971466}
m_CullTransparentMesh: 1
--- !u!224 &721971469
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 721971466}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2036228772}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &723885554
GameObject:
m_ObjectHideFlags: 0
@@ -34515,11 +34591,6 @@ PrefabInstance:
m_Modification:
m_TransformParent: {fileID: 396921783056413286}
m_Modifications:
- target: {fileID: 5314986856841044077, guid: 34ad38a1f19e9cb4ca76806cc3001cbe,
type: 3}
propertyPath: m_AnchoredPosition.x
value: 46.089996
objectReference: {fileID: 0}
- target: {fileID: 7172856987813669151, guid: 34ad38a1f19e9cb4ca76806cc3001cbe,
type: 3}
propertyPath: m_Name
@@ -40695,13 +40766,14 @@ RectTransform:
m_Children:
- {fileID: 565252715}
- {fileID: 535771638}
- {fileID: 721971469}
m_Father: {fileID: 396921783062070325}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: -256, y: 0}
m_SizeDelta: {x: 512, y: 1080}
m_AnchoredPosition: {x: -254.16, y: 0}
m_SizeDelta: {x: 508.32, y: 1080}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &2036228773
MonoBehaviour:
@@ -40720,6 +40792,16 @@ MonoBehaviour:
content: {fileID: 894615851}
coverPrefab: {fileID: 6063977752708943095, guid: 210bbc8613da67c40b6e8abe757bf0a0,
type: 3}
clickBlocker: {fileID: 721971467}
udeck:
tid:
title:
cover:
hero:
tid:
variant:
quantity: 1
cards: []
--- !u!225 &2036228774
CanvasGroup:
m_ObjectHideFlags: 0
@@ -45201,7 +45283,7 @@ CanvasGroup:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 396921782448154705}
m_Enabled: 1
m_Alpha: 0
m_Alpha: 1
m_Interactable: 1
m_BlocksRaycasts: 1
m_IgnoreParentGroups: 0

View File

@@ -9,10 +9,12 @@ namespace TcgEngine
public class ChangeCoverLine : MonoBehaviour
{
public Image cover;
public Image currentCover;
public string coverName;
private Button cover_settings_btn;
public UnityAction<ChangeCoverLine> OnChangeCover;
/// <summary>
/// 初始化封面显示
/// </summary>
@@ -20,15 +22,33 @@ namespace TcgEngine
{
if (cover != null)
cover.sprite = coverSprite;
coverName = name;
cover_settings_btn = cover.GetComponent<Button>();
cover_settings_btn.onClick.AddListener(OnClickCover);
}
public void RefreshCurrentCover(string coverName)
{
if (currentCover != null)
{
Debug.Log(coverName);
if (this.coverName == coverName)
{
currentCover.color = Color.yellow;
}
else
{
currentCover.color = Color.white;
}
}
}
/// <summary>
/// 点击选择封面
/// </summary>
public void OnClickCover()
private void OnClickCover()
{
Debug.Log(coverName);
OnChangeCover?.Invoke(this);
}
}

View File

@@ -11,6 +11,13 @@ namespace TcgEngine.UI
public Transform content;
public GameObject coverPrefab;
// 防止重复点击
public Image clickBlocker;
public UserDeckData udeck;
private List<ChangeCoverLine> lineList = new List<ChangeCoverLine>();
private bool isInit = false;
private static ChangeCoverPanel instance;
@@ -25,7 +32,6 @@ namespace TcgEngine.UI
protected override void Start()
{
base.Start();
GenerateCardCovers();
}
/// <summary>
@@ -39,25 +45,52 @@ namespace TcgEngine.UI
GameObject cardCover = Instantiate(coverPrefab, content);
var line = cardCover.GetComponent<ChangeCoverLine>();
line.SetCover(cover.GetCardCover(), cover.name);
line.OnChangeCover += SaveCardCover;
lineList.Add(line);
}
isInit = true;
}
private void RefreshPanel()
{
// dsdd
int ss = 0;
foreach (var line in lineList)
{
line.RefreshCurrentCover(udeck.cover);
}
}
public void OpenPanel(DeckLine line)
{
if (!isInit)
{
GenerateCardCovers();
}
Show();
udeck = line.GetUserDeck();
coverNameText.text = udeck.title;
RefreshPanel();
coverNameText.text = line.title.text;
}
public void SaveCardCover(ChangeCoverLine line)
{
UserData udata = Authenticator.Get().UserData;
udeck.cover = line.coverName;
clickBlocker.gameObject.SetActive(true);
// ✅ 立即刷新当前 UI
RefreshPanel(); // 封面变黄
CollectionPanel.Get().RefreshCover(line.cover); // 卡组封面即时更新
CollectionPanel.Get().SaveDeckAPI(udata, udeck);
Hide();
}
public override void Show(bool instant = false)
{
base.Show(instant);
clickBlocker.gameObject.SetActive(false);
}
public static ChangeCoverPanel Get()

View File

@@ -6,8 +6,8 @@ using UnityEngine.UI;
namespace TcgEngine.UI
{
/// <summary>
/// CollectionPanel is the panel where players can see all the cards they own
/// Also the panel where they can use the deckbuilder
/// CollectionPanel 玩家可以看到他们拥有的所有卡片的面板
/// 还有他们可以使用甲板建造者的面板
/// </summary>
public class CollectionPanel : UIPanel
@@ -64,6 +64,7 @@ namespace TcgEngine.UI
private List<DeckLine> deck_card_lines = new List<DeckLine>();
private string current_deck_tid;
private Image current_deck_image;
private bool editing_deck = false;
private bool saving = false;
private bool spawned = false;
@@ -72,8 +73,6 @@ namespace TcgEngine.UI
private List<UserCardData> deck_cards = new List<UserCardData>();
// [SerializeField] private Text cardFragmentsText;
private static CollectionPanel instance;
protected override void Awake()
@@ -122,11 +121,6 @@ namespace TcgEngine.UI
protected override void Update()
{
base.Update();
if (ApiClient.Get() != null)
{
UserData udata = ApiClient.Get().UserData;
// cardFragmentsText.text = udata.cardfragments.ToString();
}
}
private void LateUpdate()
@@ -187,6 +181,11 @@ namespace TcgEngine.UI
RefreshCardsQuantities();
}
public void RefreshCover(Image cover)
{
current_deck_image.sprite = cover.sprite;
}
public async void ReloadUserDecks()
{
await Authenticator.Get().LoadUserData();
@@ -381,7 +380,7 @@ namespace TcgEngine.UI
RefreshCardsQuantities();
}
private void RefreshDeck(UserDeckData deck)
public void RefreshDeck(UserDeckData deck)
{
deck_title.text = "Deck Name";
current_deck_tid = GameTool.GenerateRandomID(7);
@@ -558,8 +557,7 @@ namespace TcgEngine.UI
ShowNotification("卡组数量错误,无法保存。当前总数: " + totalCardCount + ", 需要: " + GameplayData.Get().deck_size);
return;
}
UserData udata = Authenticator.Get().UserData;
UserDeckData udeck = new UserDeckData();
udeck.tid = current_deck_tid;
@@ -568,6 +566,10 @@ namespace TcgEngine.UI
udeck.hero.tid = GetSelectedHeroId();
udeck.hero.variant = VariantData.GetDefault().id;
udeck.cards = deck_cards.ToArray();
if (string.IsNullOrEmpty(udeck.cover))
{
udeck.cover = "wind";
}
saving = true;
if (Authenticator.Get().IsTest())
@@ -586,7 +588,7 @@ namespace TcgEngine.UI
ReloadUserDecks();
}
private async void SaveDeckAPI(UserData udata, UserDeckData udeck)
public async void SaveDeckAPI(UserData udata, UserDeckData udeck)
{
string url = ApiClient.ServerURL + "/users/deck/" + udeck.tid;
string jdata = ApiTool.ToJson(udeck);
@@ -763,6 +765,7 @@ namespace TcgEngine.UI
public void OnChangeCover(DeckLine line)
{
current_deck_image = line.image;
ChangeCoverPanel.Get().OpenPanel(line);
}

View File

@@ -132,7 +132,18 @@ namespace TcgEngine.UI
this.value.enabled = deck.GetQuantity() > 0;
if (this.value != null)
this.value.color = udata.IsDeckValid(deck) ? Color.white : Color.red;
if (this.image != null)
{
Debug.Log($"读取:{deck.cover}");
if (string.IsNullOrEmpty(deck.cover))
{
deck.cover = "fire";
CollectionPanel.Get().SaveDeckAPI(udata, deck);
}
CardCoverData cover = CardCoverData.Get(deck.cover);
this.image.enabled = true;
this.image.sprite = cover.GetCardCover();
}
gameObject.SetActive(true);
}

View File

@@ -69,7 +69,7 @@ namespace TcgEngine.UI
PackPanel.Get()?.ReloadUserPack();
PackPanel.Get()?.RefreshCurrency();
}
if (HandPackArea.Get() != null)
{
HandPackArea.Get().LoadPacks();