213 lines
239 KiB
C#
213 lines
239 KiB
C#
|
|
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;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|