You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/GleyPlugins/About/Editor/GleyAboutWindow.cs

349 lines
15 KiB
C#

2 months ago
namespace Gley.About
{
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;
public class GleyAboutWindow : EditorWindow
{
struct ContactButton
{
public GUIContent guiContent;
public string url;
public ContactButton(GUIContent guiContent, string url)
{
this.guiContent = guiContent;
this.url = url;
}
}
private const string FOLDER_NAME = "About";
private static string PARENT_FOLDER = "GleyPlugins";
private static string rootFolder;
static GleyAboutWindow window;
static IconReferences iconReferences;
private ContactButton[] contactButtons;
private EditorFileLoaded fileLoader;
private AssetVersions allAssetsVersion;
private Vector2 scrollPosition;
private string updateResult;
private int nrOfUpdates;
private bool updateCheck;
private bool mobileToolsAvailable;
static AssetStorePackage[] assetStorePackages;
string[] packagesInsideMobileTools = {
"Ads",
"EasyIAP",
"Notifications",
"GameServices",
"RateGame",
"CrossPromo",
"AllPlatformsSave",
"Localization",
"DailyRewards"
};
[MenuItem("Window/Gley/About Gley", false, 0)]
private static void Init()
{
if (!LoadRootFolder())
return;
LoadIcons();
LoadAssetStorePackages();
window = (GleyAboutWindow)GetWindow(typeof(GleyAboutWindow));
window.minSize = new Vector2(600, 520);
window.titleContent = new GUIContent(" About v2.0", iconReferences.gleyLogo);
window.Show();
}
static void LoadAssetStorePackages()
{
assetStorePackages = new AssetStorePackage[]
{
new AssetStorePackage("TrafficSystem", "Traffic System", iconReferences.trafficSystemIcon, "Highly performant and easy to use traffic system that can make any driving game more fun to play in just a few clicks.", "https://assetstore.unity.com/packages/slug/194888?aid=1011l8QY4"),
new AssetStorePackage("JumpyCompleteGame", "Mobile Tools", iconReferences.mobileToolsIcon, "All you need to publish your finished game on the store and BONUS a free game with all of them already integrated", "https://assetstore.unity.com/packages/tools/integration/mobile-tools-complete-game-132284?aid=1011l8QY4"),
new AssetStorePackage("Ads", "Mobile Ads", iconReferences.mobileAdsIcon, "Show ads inside your game with this easy to use, multiple advertisers support tool.", "https://assetstore.unity.com/packages/tools/integration/mobile-ads-gdpr-compliant-102892?aid=1011l8QY4"),
new AssetStorePackage("EasyIAP", "Easy IAP", iconReferences.easyIAPIcon, "Sell In App products inside your game with minimal setup and very little programming knowledge.", "https://assetstore.unity.com/packages/tools/integration/easy-iap-in-app-purchase-128902?aid=1011l8QY4"),
new AssetStorePackage("Localization", "Localization (Multi-Language)", iconReferences.localizationIcon, "Make your app international and reach a greater audience by translating your app in multiple languages.", "https://assetstore.unity.com/packages/tools/integration/localization-multi-language-161885?aid=1011l8QY4"),
new AssetStorePackage("DailyRewards", "Daily (Time Based) Rewards", iconReferences.dailyRewardsIcon, "Increase the retention of your game by using Daily Rewards and Time Based rewards.", "https://assetstore.unity.com/packages/tools/integration/daily-time-based-rewards-161112?aid=1011l8QY4"),
new AssetStorePackage("Notifications", "Mobile Push Notifications",iconReferences.notificationsIcon, "Send scheduled offline notifications to your users and keep them engaged.", "https://assetstore.unity.com/packages/tools/integration/mobile-push-notifications-156905?aid=1011l8QY4"),
new AssetStorePackage("GameServices", "Easy Achievements and Leaderboards", iconReferences.achievementsIcon, "Submit achievements and scores with minimal setup and increase competition between your users.", "https://assetstore.unity.com/packages/tools/integration/easy-achievements-and-leaderboards-118119?aid=1011l8QY4"),
new AssetStorePackage("RateGame", "Rate Game Popup", iconReferences.rateGameIcon, "Increase the number of game ratings by encouraging users to rate your game.", "https://assetstore.unity.com/packages/tools/integration/rate-game-popup-android-ios-139131?aid=1011l8QY4"),
new AssetStorePackage("CrossPromo", "Mobile Cross Promo", iconReferences.crossPromoIcon, "Easily cross promote and increase popularity for all of your published games.", "https://assetstore.unity.com/packages/tools/integration/mobile-cross-promo-148024?aid=1011l8QY4"),
new AssetStorePackage("AllPlatformsSave", "All Platforms Save", iconReferences.saveIcon, "Easy to use: same line of code to save or load game data on all supported Unity platforms.", "https://assetstore.unity.com/packages/tools/integration/all-platforms-save-115960?aid=1011l8QY4"),
new AssetStorePackage("DeliveryVehiclesPack", "Delivery Vehicles Pack", iconReferences.vehiclesIcon, "Delivery Vehicles Pack contains 3 low poly, textured vehicles: Scooter, Three Wheeler, Minivan", "https://assetstore.unity.com/packages/3d/vehicles/land/delivery-vehicles-pack-55528?aid=1011l8QY4")
};
}
static void LoadIcons()
{
Object assetToLoad = AssetDatabase.LoadAssetAtPath($"{rootFolder}/Editor/IconReferences.asset", typeof(IconReferences));
iconReferences = (IconReferences)assetToLoad;
}
static bool LoadRootFolder()
{
rootFolder = Common.EditorUtilities.FindFolder(FOLDER_NAME, PARENT_FOLDER);
if (rootFolder == null)
{
Debug.LogError($"Folder Not Found: '{PARENT_FOLDER}/{FOLDER_NAME}'");
PARENT_FOLDER = "Assets";
rootFolder = Common.EditorUtilities.FindFolder(FOLDER_NAME, PARENT_FOLDER);
if (rootFolder == null)
{
Debug.LogError($"Folder Not Found: '{PARENT_FOLDER}/{FOLDER_NAME}'");
return false;
}
}
return true;
}
void OnEnable()
{
if (!LoadRootFolder())
return;
if (iconReferences == null)
{
LoadIcons();
}
if (assetStorePackages == null)
{
LoadAssetStorePackages();
}
contactButtons = new ContactButton[]
{
new ContactButton(new GUIContent(" Website", iconReferences.websiteIcon),"https://gleygames.com"),
new ContactButton(new GUIContent(" Youtube", iconReferences.youtubeIcon),"https://www.youtube.com/c/gleygames"),
new ContactButton(new GUIContent(" Discord", iconReferences.discordIcon),"https://discord.gg/7eSvKKW"),
new ContactButton(new GUIContent(" Twitter", iconReferences.twitterIcon),"https://twitter.com/GleyGames"),
new ContactButton(new GUIContent(" Facebook", iconReferences.facebookIcon),"https://www.youtube.com/c/gleygames"),
new ContactButton(new GUIContent(" Instagram", iconReferences.instagramIcon),"https://www.instagram.com/gleygames/")
};
RefreshState();
mobileToolsAvailable = (assetStorePackages[1].assetState != AssetState.NotDownloaded);
}
void RefreshState()
{
nrOfUpdates = 0;
for (int i = 0; i < assetStorePackages.Length; i++)
{
assetStorePackages[i].assetState = GetAssetState(assetStorePackages[i].folderName);
}
if (nrOfUpdates != 0)
{
updateResult = nrOfUpdates + " updates available";
}
else
{
updateResult = "No updates available";
}
}
void OnGUI()
{
GUIStyle labelStyle = new GUIStyle(GUI.skin.label);
labelStyle.alignment = TextAnchor.UpperCenter;
EditorGUILayout.Space();
GUILayout.Label(iconReferences.gleyCover, labelStyle);
labelStyle.fontStyle = FontStyle.Bold;
GUILayout.Label("Professional assets made easy to use for everyone", labelStyle);
EditorGUILayout.Space();
GUILayout.Label("Connect with us:", labelStyle);
EditorGUILayout.SelectableLabel("gley.assets@gmail.com", labelStyle);
EditorGUILayout.BeginHorizontal();
for (int i = 0; i < contactButtons.Length; i++)
{
if (GUILayout.Button(contactButtons[i].guiContent))
{
Application.OpenURL(contactButtons[i].url);
}
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
if (GUILayout.Button("Open Asset Store Publisher Page"))
{
Application.OpenURL("https://assetstore.unity.com/publishers/19336");
}
EditorGUILayout.Space();
if (updateCheck == false)
{
if (GUILayout.Button("Check for Updates"))
{
updateCheck = true;
LoadFile();
}
}
else
{
GUILayout.Label(updateResult, labelStyle);
}
EditorGUILayout.Space();
scrollPosition = GUILayout.BeginScrollView(scrollPosition, false, false, GUILayout.Width(position.width), GUILayout.Height(position.height - 250));
DrawPackages();
GUILayout.EndScrollView();
}
void DrawPackages()
{
for (int i = 0; i < assetStorePackages.Length; i++)
{
if (mobileToolsAvailable)
{
if (!packagesInsideMobileTools.Contains(assetStorePackages[i].folderName))
{
DrawPack(assetStorePackages[i]);
}
}
else
{
DrawPack(assetStorePackages[i]);
}
}
}
AssetState GetAssetState(string folderName)
{
AssetState result = AssetState.InProject;
string path = Common.EditorUtilities.FindFolder("Scripts", folderName);
if (path == null)
{
return AssetState.NotDownloaded;
}
if (!File.Exists($"{Application.dataPath}/{path.Replace("Assets/", "")}/Version.txt"))
{
nrOfUpdates++;
return AssetState.UpdateAvailable;
}
if (allAssetsVersion != null)
{
if (AssetNeedsUpdate(path,folderName))
{
nrOfUpdates++;
return AssetState.UpdateAvailable;
}
}
return result;
}
private bool AssetNeedsUpdate(string path, string folderName)
{
if (allAssetsVersion.assetsVersion.Count == 0)
return false;
string filePath = $"{path}/Version.txt";
StreamReader reader = new StreamReader(filePath);
int localVersion = JsonUtility.FromJson<Common.AssetVersion>(reader.ReadToEnd()).shortVersion;
int serverVersion = allAssetsVersion.assetsVersion.First(cond => cond.folderName == folderName).shortVersion;
reader.Close();
if (localVersion < serverVersion)
{
return true;
}
return false;
}
void DrawPack(AssetStorePackage pack)
{
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal(EditorStyles.helpBox);
EditorGUILayout.Space();
GUIStyle style = new GUIStyle(GUI.skin.label);
style.fontSize = 18;
style.alignment = TextAnchor.MiddleLeft;
GUILayout.Label(pack.texture, style);
EditorGUILayout.Space();
EditorGUILayout.BeginVertical();
GUILayout.Label(pack.name, style);
style.fontSize = 12;
style.wordWrap = true;
//style.normal.background = downloadColor;
GUILayout.Label(pack.description, style);
EditorGUILayout.EndVertical();
var oldColor = GUI.backgroundColor;
string buttonText = "";
switch (pack.assetState)
{
case AssetState.ComingSoon:
GUI.backgroundColor = new Color32(190, 190, 190, 255);
buttonText = "Coming Soon";
break;
case AssetState.InProject:
GUI.backgroundColor = new Color32(253, 195, 71, 255);
buttonText = "Owned";
break;
case AssetState.NotDownloaded:
GUI.backgroundColor = new Color32(42, 180, 240, 255);
buttonText = "Download";
break;
case AssetState.UpdateAvailable:
GUI.backgroundColor = new Color32(76, 229, 89, 255);
buttonText = "Update Available";
break;
}
if (GUILayout.Button(buttonText, GUILayout.Width(130), GUILayout.Height(64)))
{
updateCheck = false;
Application.OpenURL(pack.url);
}
GUI.backgroundColor = oldColor;
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
}
private void LoadFile()
{
updateResult = "Connecting to server";
fileLoader = new EditorFileLoaded();
string url = "https://gleygames.com/versions/AssetVersions-2.txt";
fileLoader.LoadFile(url);
EditorApplication.update = MyUpdate;
}
private void MyUpdate()
{
if (fileLoader.IsDone())
{
EditorApplication.update = null;
LoadCompleted();
}
}
private void LoadCompleted()
{
allAssetsVersion = JsonUtility.FromJson<AssetVersions>(fileLoader.GetResult());
RefreshState();
}
}
}