Browse Source

Added Steam Stats functionality

James Peret 2 years ago
parent
commit
eb51128539

+ 16 - 2
Runtime/SteamModule.cs

@@ -14,6 +14,11 @@ namespace KairoEngine.SteamIntegration
 
         [LabelText("Steamworks App ID")] public uint appId = 0000000;
         public bool showDebug = false;
+        public bool useSteamStats = true;
+        public bool useSteamAchievements = true;
+
+        [NonSerialized, ShowInInspector, InlineEditor(InlineEditorObjectFieldModes.Boxed), PropertySpace(4,0), ShowIf("@useSteamStats")] 
+        public SteamworksStatLibrary steamStats;
 
         public SteamModule(GameConfig config) : base(config)
         {
@@ -29,6 +34,9 @@ namespace KairoEngine.SteamIntegration
             SteamworksManager steamworksManager = obj.AddComponent<SteamworksManager>();
             steamworksManager.appId = appId;
             steamworksManager.ShowDebug(showDebug);
+            steamworksManager.useStats = useSteamStats;
+            if(useSteamStats && steamStats != null) steamworksManager.steamStatsLibray = steamStats;
+            steamworksManager.useAchievements = useSteamAchievements;
         }
 
         public override void Start() { }
@@ -50,8 +58,14 @@ namespace KairoEngine.SteamIntegration
             }
         }
 
-        public override void OnBeforeSerialize(ObjectSerializer serializer) { }
+        public override void OnBeforeSerialize(ObjectSerializer serializer) 
+        { 
+            if(steamStats != null) serializer.AddScriptableObject("SteamIntegration_statsLibrary", steamStats);
+        }
 
-        public override void OnBeforeDeserialize(ObjectSerializer serializer) { }
+        public override void OnBeforeDeserialize(ObjectSerializer serializer) 
+        { 
+            steamStats = (SteamworksStatLibrary)serializer.GetScriptableObject("SteamIntegration_statsLibrary");
+        }
     }
 }

+ 2 - 1
Runtime/SteamworksManager.cs

@@ -25,6 +25,7 @@ namespace KairoEngine.SteamIntegration
         [FoldoutGroup("Achievements"), InlineProperty, HideLabel, ShowIf("@useAchievements && useStats")] 
         public SteamworksAchievements achievements = new SteamworksAchievements();
 
+        [HideInInspector] public SteamworksStatLibrary steamStatsLibray;
         public static bool hasInitialized = false;
         private string playerName;
 
@@ -51,7 +52,7 @@ namespace KairoEngine.SteamIntegration
                 playerName = Steamworks.SteamClient.Name;
                 var playerSteamId = Steamworks.SteamClient.SteamId;
                 if(showDebug)  Debug.Log($"{playerName} ({playerSteamId})");
-                if(useStats) stats.Start();
+                if(useStats) stats.Start(steamStatsLibray);
                 if(useAchievements) achievements.Start();
                 RefreshStats();
                 //PrintFriendsList();

+ 24 - 0
Runtime/SteamworksStatData.cs

@@ -0,0 +1,24 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using Sirenix.OdinInspector;
+
+namespace KairoEngine.SteamIntegration
+{
+    [System.Serializable]
+    public class SteamworksStatData
+    {
+        [HorizontalGroup("line", 0.7f), HideLabel] public string name;
+        [HorizontalGroup("line", 0.3f), HideLabel] public SteamStatType statType = SteamStatType.Integer;
+
+        // [HorizontalGroup("line", 0.2f), HideLabel, ShowIf("@statType == SteamStatType.Integer"), ReadOnly] public int integerValue = 0;
+        // [HorizontalGroup("line", 0.2f), HideLabel, ShowIf("@statType == SteamStatType.Float"), ReadOnly] public float floatValue = 0f;
+        
+    }
+
+    public enum SteamStatType
+    {
+        Integer,
+        Float
+    }
+}

+ 11 - 0
Runtime/SteamworksStatData.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: edeee310114d4e945a6bfa8e62bb1a31
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 14 - 0
Runtime/SteamworksStatLibrary.cs

@@ -0,0 +1,14 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using Sirenix.OdinInspector;
+
+namespace KairoEngine.SteamIntegration
+{
+    [HideMonoScript]
+    [CreateAssetMenu(menuName = "KairoEngine/Steam Stats Library", fileName = "Steam Stat Library", order = 10)]
+    public class SteamworksStatLibrary : ScriptableObject
+    {
+        public List<SteamworksStatData> library = new List<SteamworksStatData>();
+    }
+}

+ 11 - 0
Runtime/SteamworksStatLibrary.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a7e59c8695d75bf4d9694eb356b85e43
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 99 - 2
Runtime/SteamworksStats.cs

@@ -1,6 +1,7 @@
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
+using KairoEngine.Core;
 using Sirenix.OdinInspector;
 
 namespace KairoEngine.SteamIntegration
@@ -8,8 +9,104 @@ namespace KairoEngine.SteamIntegration
     [System.Serializable]
     public class SteamworksStats
     {
-        public void Start() { }
-        public void Stop() { }
+        public bool broadcastStatsOnStart = true;
+        public string statisticsBroadcastEvent = "SetStatisticData";
+        public bool listenForStatisticsEvents = true;
+        public string statisticsEvent = "StatisticDataChanged";
+
+        [InlineEditor(InlineEditorObjectFieldModes.Boxed), PropertySpace(4,0)]
+        public SteamworksStatLibrary steamStats;
+
+        public void Start(SteamworksStatLibrary steamStatsLibrary) 
+        { 
+            if(steamStats == null) steamStats = steamStatsLibrary;
+            if(broadcastStatsOnStart) BroadcastStats();
+            if(listenForStatisticsEvents)
+            {
+                for (int i = 0; i < steamStats.library.Count; i++)
+                {
+                    var stat = steamStats.library[i];
+                    if(stat.statType == SteamStatType.Integer) GenericEvents.StartListening($"{statisticsEvent}", SetStatInt);
+                    else if(stat.statType == SteamStatType.Float) GenericEvents.StartListeningForStringFloat($"{statisticsEvent}", SetStatFloat);
+                }
+            }
+            
+        }
+
+        public void Stop() 
+        { 
+            Steamworks.SteamUserStats.StoreStats();
+            if(listenForStatisticsEvents)
+            {
+                for (int i = 0; i < steamStats.library.Count; i++)
+                {
+                    var stat = steamStats.library[i];
+                    if(stat.statType == SteamStatType.Integer) GenericEvents.StopListening($"{statisticsEvent}", SetStatInt);
+                    else if(stat.statType == SteamStatType.Float) GenericEvents.StopListeningForStringFloat($"{statisticsEvent}", SetStatFloat);
+                }
+            }
+            
+        }
+
+        public SteamworksStatData GetSteamStatData(string statName)
+        {
+            for (int i = 0; i < steamStats.library.Count; i++)
+            {
+                if(steamStats.library[i].name == statName) return steamStats.library[i];
+            }
+            Debug.LogWarning($"Could not find stat with name \"{statName}\" in SteamStatLibrary");
+            return null;
+        }
+
+        [Button("Print Stat")]
+        public void PrintStat(string statName)
+        {
+            SteamworksStatData statData = GetSteamStatData(statName);
+            if(statData == null) return;
+            string value = "";
+            if(statData.statType == SteamStatType.Integer) value += Steamworks.SteamUserStats.GetStatInt(statData.name);
+            else if(statData.statType == SteamStatType.Float) value += Steamworks.SteamUserStats.GetStatFloat(statData.name);
+            Debug.Log($"{statData.name}: {value}");
+        }
         
+        [Button("Set Stat Integer")]
+        public void SetStatInt(string statName, int newValue)
+        {
+            SteamworksStatData statData = GetSteamStatData(statName);
+            if (statData == null) return;
+            if (statData.statType != SteamStatType.Integer) return;
+            Steamworks.SteamUserStats.SetStat(statName, newValue);
+            if(Steamworks.SteamUserStats.GetStatInt(statName) != newValue) Debug.LogWarning($"Stat \"{statName}\" does not exist on Steamworks");
+            else Steamworks.SteamUserStats.StoreStats();
+        }
+
+        [Button("Set Stat Float")]
+        public void SetStatFloat(string statName, float newFloatValue)
+        {
+            SteamworksStatData statData = GetSteamStatData(statName);
+            if (statData == null) return;
+            if (statData.statType != SteamStatType.Float) return;
+            Steamworks.SteamUserStats.SetStat(statName, newFloatValue);
+            if(Steamworks.SteamUserStats.GetStatFloat(statName) != newFloatValue) Debug.LogWarning($"Stat \"{statName}\" does not exist on Steamworks");
+            else Steamworks.SteamUserStats.StoreStats();
+        }
+
+        public void BroadcastStats()
+        {
+            for (int i = 0; i < steamStats.library.Count; i++)
+            {
+                var stat = steamStats.library[i];
+                if(stat.statType == SteamStatType.Integer) 
+                {
+                    int value = Steamworks.SteamUserStats.GetStatInt(stat.name);
+                    GenericEvents.Trigger(statisticsBroadcastEvent, stat.name, value);
+                }
+                else if(stat.statType == SteamStatType.Float) 
+                {
+                    float value = Steamworks.SteamUserStats.GetStatFloat(stat.name);
+                    GenericEvents.Trigger(statisticsBroadcastEvent, stat.name, value);
+                }
+            }
+        }
     }
 }