CapabilitySystem/Packages/AutoUI/Editor/SubscribeWindow.cs

213 lines
239 KiB
C#
Raw Permalink Normal View History

2026-04-15 19:47:09 +08:00
using UnityEngine;
using UnityEditor;
using UnityEngine.UIElements;
namespace AutoUI
{
/// <summary>
/// 订阅弹窗 - 显示价格信息和二维码
/// </summary>
public class SubscribeWindow : EditorWindow
{
// 二维码图片的 base64 数据(与 Cocos 插件保持一致)
private const string QR_CODE_BASE64 = "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAO2BFQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKbuo3UAOopu6loAWiiikAUUUUwCiiikAUUUUwCiiikAUUUUwCiiikAUUUUwCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooATcKaZFVck4FJu79q+fP2hP2nYPhmw0XQhDe683Mu85S3XOOcdW9ulDaW552PzChltF18Q7JH0HvA6nFG4eo/Ovy/1r43+PNd1B7y48W6vHKwwRZ3T26D6JGVX8xVH/hbHjX/AKHHxB/4NJ//AIusvawPzqXiDg1Kyoyt8j9Ttw9RSh19RX5X/wDC1vGv/Q46/wD+DSf/AOLo/wCFreNf+hx1/wD8Gk//AMXS9tAn/iIWE/58s/VHev8AeFG9f7wr8rv+FreNf+hx1/8A8Gk//wAXR/wtbxr/ANDjr/8A4NJ//i6n2kQ/4iFhP+fLP1R8xfWjzF9a/K7/AIWt41/6HHX/APwaT/8AxdH/AAtbxr/0OOv/APg0n/8Ai6v2sQ/4iFhP+fLP1R3r/eFG9f7wr8rv+FreNf8Aocdf/wDBpP8A/F0f8LW8a/8AQ46//wCDSf8A+LqPaRD/AIiFhP8Anyz9UfMX1o8xfWvyu/4Wt41/6HHX/wDwaT//ABdH/C1vGv8A0OOv/wDg0n/+Lq/axD/iIWE/58s/VDzB6ijzB6ivyv8A+Fq+NP8AocNf/wDBpP8A/F0f8LV8af8AQ4a//wCDSf8A+LqPaRD/AIiFg/8AnzI/VDzB6ijzB6ivyv8A+FreNP8AocNf/wDBpP8A/F0n/C1fG3/Q46//AODSf/4uq9rAP+IhYP8A58v7z9UfNX1pPNHFfmj4M/aG8feDdQ8+38RXmpIxXfb6nK1wpA7ZckjP+zivtj4FfHPTfjFov8NlrtsoF5YZ6H++nqh/ToaIyjJ2R9Jk/FWBzifsYe7Ps+voz1qiiitLn2gUUUVQBRRRQAUUUUAFFFFACZpu/PTmlNeffE/40eGvhPbwPrdy3m3BxHDAu+Rh/ex2Huaehz18RSwtN1K0rJHoG/NKZAvBNfPa/ttfD4Abl1TPta//AGVem/DX4reHvinpsl7oVwZFjbbJDMoSWM+4FK66HBh82wOKmqdGrFyfS+ux3NFJRQeuFN3+vFV9Q1K30qylurqVYIIl3PI5wqj1Jrwm5/bS+HlrczRbtSlMb7PMitdyN7j5ulDaW552KzHCYOSjiKii33dj37zF9cGnBga8O8LftceAvFWtwaZDc3VnNOdqPeQ+XHu9N2ePxr25GJ57UaPY0wuNw+NTlh5qSW9iSiiig7QooooAKKKKAEDA0m8UmMVmeIPEFh4X0u41LUrqO0sbdd0kr9BTM5zVOLnJ2SNTePWgMDzXz037avw/zuH9pj/Z+y//AGVdH4D/AGn/AAT8QNeTR7C7ntbuRcxC7iEayEfwA5IzSvE8WnnmXVZ+zjXje9t0eyUUinIGKWg94KKKKAEzRkUnvUU11FawSTSuscSAlnY4AA6kmgTdldkpkApPMzXguq/tlfD7S764sxPfXRhfyzLb2+5G91O7NWNB/bA8A69qlpp6XF5aSXL+Wk11AFjDejHdSuu54X9u5a5cirxv6o90zS1FDPHNEskbbkYAhh3B6VIDTPdTvqgzTd/X2orzj4pfHTwv8Jmt49buXNxMcJb26CSX/ex6c0HNiMTSwsPaVpcqPRzJil3j149a+e/+G2vh9uPy6p/4C/8A2VepfDn4m6J8T9F/tLQ7nzolbbJG42yRn0Ze3ShNPRM4sPm2Cxc1SoVVJu/U7SikFLQeuFFFFABRRRQAUUUUAFFFFABRRRQAm4UbhnFJWJ4o8Uad4P0W51XV7tbSyt0LM7nH5DqT9KOl2RKcacXObskbe6jcK+fW/bY+HzdDqf8A4Cf/AGVdP8Of2kvBvxG1o6Vpl3LDeMm5I7uLyvM5xgetSpJuyPGp55ltWoqUK8W3puj12ikpao9wQHNN85Bj5uvT3qG8vYLC0kubiVYYI13PI52hR6knpXxZ8Zv2wNYu9ZutL8FzxWWmQkxnUWj3STN/FgHhVOeD97jqKmUlHc8LNs6wmT0vaYh6vZdWfbPmD1FHmD1FflhN8VvG0nXxnr//AAHU5x/J6h/4Wt41/wChx8Qf+DSf/wCLqfaRPg/+IhYT/nzL
private static SubscribeWindow _instance;
private Texture2D _qrCodeTexture;
public static void ShowWindow()
{
if (_instance != null)
{
_instance.Focus();
return;
}
_instance = CreateInstance<SubscribeWindow>();
_instance.titleContent = new GUIContent("订阅说明");
_instance.minSize = new Vector2(400, 500);
_instance.maxSize = new Vector2(400, 500);
_instance.position = new Rect(Screen.width / 2 - 200, Screen.height / 2 - 250, 400, 500);
_instance.ShowUtility();
}
private void CreateGUI()
{
// 加载二维码图片
LoadQRCodeTexture();
var root = rootVisualElement;
root.style.backgroundColor = new Color(0.22f, 0.22f, 0.22f);
root.style.paddingLeft = 20;
root.style.paddingRight = 20;
root.style.paddingTop = 15;
root.style.paddingBottom = 15;
// 标题
var title = new Label("订阅说明");
title.style.fontSize = 18;
title.style.color = Color.white;
title.style.marginBottom = 20;
title.style.alignSelf = Align.Center;
root.Add(title);
// 套餐卡片容器
var plansContainer = new VisualElement();
plansContainer.style.marginBottom = 20;
root.Add(plansContainer);
// 畅享版(与 Cocos 插件保持一致)
CreatePlanCard(plansContainer, "畅享版", "¥39", "/月", "100次/月", new Color(0.95f, 0.6f, 0.1f));
// 分隔线
var separator = new VisualElement();
separator.style.height = 1;
separator.style.backgroundColor = new Color(0.4f, 0.4f, 0.4f);
separator.style.marginTop = 10;
separator.style.marginBottom = 15;
root.Add(separator);
// 联系客服区域
var contactSection = new VisualElement();
root.Add(contactSection);
var contactTitle = new Label("扫码添加客服微信购买");
contactTitle.style.fontSize = 14;
contactTitle.style.color = Color.white;
contactTitle.style.marginBottom = 15;
contactTitle.style.alignSelf = Align.Center;
contactSection.Add(contactTitle);
// 二维码图片
if (_qrCodeTexture != null)
{
var qrCodeImage = new Image();
qrCodeImage.image = _qrCodeTexture;
qrCodeImage.style.width = 150;
qrCodeImage.style.height = 150;
qrCodeImage.style.alignSelf = Align.Center;
qrCodeImage.style.marginBottom = 15;
contactSection.Add(qrCodeImage);
}
var contactHint = new Label("添加微信后发送您的邮箱账号,客服会为您开通相应权限");
contactHint.style.fontSize = 12;
contactHint.style.color = new Color(0.7f, 0.7f, 0.7f);
contactHint.style.alignSelf = Align.Center;
contactSection.Add(contactHint);
// 底部按钮
var spacer = new VisualElement();
spacer.style.height = 20;
root.Add(spacer);
var closeBtn = new Button(() => Close());
closeBtn.text = "我知道了";
closeBtn.style.width = 200;
closeBtn.style.height = 36;
closeBtn.style.fontSize = 14;
closeBtn.style.alignSelf = Align.Center;
closeBtn.style.backgroundColor = new Color(0.2f, 0.5f, 0.8f);
closeBtn.style.color = Color.white;
closeBtn.style.borderTopLeftRadius = 6;
closeBtn.style.borderTopRightRadius = 6;
closeBtn.style.borderBottomLeftRadius = 6;
closeBtn.style.borderBottomRightRadius = 6;
root.Add(closeBtn);
}
private void CreatePlanCard(VisualElement container, string planName, string price, string period, string quota, Color accentColor)
{
var card = new VisualElement();
card.style.backgroundColor = new Color(0.28f, 0.28f, 0.28f);
card.style.borderTopLeftRadius = 8;
card.style.borderTopRightRadius = 8;
card.style.borderBottomLeftRadius = 8;
card.style.borderBottomRightRadius = 8;
card.style.paddingTop = 12;
card.style.paddingBottom = 12;
card.style.paddingLeft = 15;
card.style.paddingRight = 15;
card.style.marginBottom = 10;
card.style.flexDirection = FlexDirection.Row;
card.style.justifyContent = Justify.SpaceBetween;
card.style.alignItems = Align.Center;
container.Add(card);
// 左侧:套餐名称
var nameContainer = new VisualElement();
nameContainer.style.flexDirection = FlexDirection.Row;
nameContainer.style.alignItems = Align.Center;
// 名称前面的彩色条
var colorBar = new VisualElement();
colorBar.style.width = 4;
colorBar.style.height = 20;
colorBar.style.backgroundColor = accentColor;
colorBar.style.marginRight = 10;
colorBar.style.borderTopLeftRadius = 2;
colorBar.style.borderTopRightRadius = 2;
colorBar.style.borderBottomLeftRadius = 2;
colorBar.style.borderBottomRightRadius = 2;
nameContainer.Add(colorBar);
var nameLabel = new Label(planName);
nameLabel.style.fontSize = 14;
nameLabel.style.color = Color.white;
nameContainer.Add(nameLabel);
card.Add(nameContainer);
// 中间:额度
var quotaLabel = new Label(quota);
quotaLabel.style.fontSize = 12;
quotaLabel.style.color = new Color(0.7f, 0.7f, 0.7f);
card.Add(quotaLabel);
// 右侧:价格
var priceContainer = new VisualElement();
priceContainer.style.flexDirection = FlexDirection.Row;
priceContainer.style.alignItems = Align.FlexEnd;
var priceLabel = new Label(price);
priceLabel.style.fontSize = 18;
priceLabel.style.color = accentColor;
priceContainer.Add(priceLabel);
var periodLabel = new Label(period);
periodLabel.style.fontSize = 11;
periodLabel.style.color = new Color(0.7f, 0.7f, 0.7f);
periodLabel.style.marginBottom = 2;
priceContainer.Add(periodLabel);
card.Add(priceContainer);
}
private void LoadQRCodeTexture()
{
if (_qrCodeTexture != null) return;
try
{
byte[] imageBytes = System.Convert.FromBase64String(QR_CODE_BASE64);
_qrCodeTexture = new Texture2D(1, 1);
_qrCodeTexture.LoadImage(imageBytes);
}
catch (System.Exception e)
{
Debug.LogError($"[SubscribeWindow] 加载二维码失败: {e.Message}");
}
}
private void OnDestroy()
{
_instance = null;
if (_qrCodeTexture != null)
{
DestroyImmediate(_qrCodeTexture);
_qrCodeTexture = null;
}
}
}
}