diff --git a/Assets/Bundles/Prefabs/ProductSlot.prefab b/Assets/Bundles/Prefabs/ProductSlot.prefab index df43fda..a86a8ba 100644 --- a/Assets/Bundles/Prefabs/ProductSlot.prefab +++ b/Assets/Bundles/Prefabs/ProductSlot.prefab @@ -653,7 +653,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &6292328828743219470 RectTransform: m_ObjectHideFlags: 0 @@ -704,7 +704,7 @@ MonoBehaviour: m_PersistentCalls: m_Calls: [] m_Sprite: {fileID: 21300000, guid: 6facc842ead05744184e7db7ba064b48, type: 3} - m_Type: 0 + m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 @@ -946,7 +946,7 @@ MonoBehaviour: m_PersistentCalls: m_Calls: [] m_Sprite: {fileID: 21300000, guid: 6facc842ead05744184e7db7ba064b48, type: 3} - m_Type: 0 + m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 @@ -1002,7 +1002,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &3190770213717081060 RectTransform: m_ObjectHideFlags: 0 @@ -1054,7 +1054,7 @@ MonoBehaviour: m_PersistentCalls: m_Calls: [] m_Sprite: {fileID: 21300000, guid: 6facc842ead05744184e7db7ba064b48, type: 3} - m_Type: 0 + m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 @@ -1412,7 +1412,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: -52, y: 0} + m_AnchoredPosition: {x: -76.9, y: 0} m_SizeDelta: {x: 64, y: 64} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &1864243643522392499 @@ -2016,7 +2016,7 @@ MonoBehaviour: m_PersistentCalls: m_Calls: [] m_Sprite: {fileID: 21300000, guid: 6facc842ead05744184e7db7ba064b48, type: 3} - m_Type: 0 + m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity index 7ca0fdd..bdd532f 100644 --- a/Assets/Scenes/Main.unity +++ b/Assets/Scenes/Main.unity @@ -38628,7 +38628,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &559934552 RectTransform: m_ObjectHideFlags: 0 @@ -64996,9 +64996,9 @@ RectTransform: m_Father: {fileID: 1166114708} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} + m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 179.21582} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &922729938 MonoBehaviour: @@ -74713,7 +74713,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &1166114708 RectTransform: m_ObjectHideFlags: 0 diff --git a/Assets/Scenes/Title.unity b/Assets/Scenes/Title.unity index a8c25a0..bc409c5 100644 --- a/Assets/Scenes/Title.unity +++ b/Assets/Scenes/Title.unity @@ -6449,6 +6449,50 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1690578740} m_CullTransparentMesh: 1 +--- !u!1 &1711243444 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1711243446} + - component: {fileID: 1711243445} + m_Layer: 0 + m_Name: Time + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1711243445 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1711243444} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e806c67b86b115d458fefce3031e094c, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &1711243446 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1711243444} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.43922746, y: -0.03640896, z: -0.03968414} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1732641636 GameObject: m_ObjectHideFlags: 0 @@ -6682,3 +6726,4 @@ SceneRoots: - {fileID: 1494210000} - {fileID: 106099445} - {fileID: 984795659} + - {fileID: 1711243446} diff --git a/Assets/Scripts/My/InternetTime.cs b/Assets/Scripts/My/InternetTime.cs new file mode 100644 index 0000000..5e1eacd --- /dev/null +++ b/Assets/Scripts/My/InternetTime.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections; +using System.Globalization; +using UnityEngine; +using UnityEngine.Networking; + +public class InternetTime : MonoBehaviour +{ + public static InternetTime Ins; + private void Awake() { Ins = this; DontDestroyOnLoad(gameObject); } + + public DateTime Time { get; private set; } + + // 한국 표준시 = UTC+9 + private static readonly TimeSpan KSTOffset = TimeSpan.FromHours(9); + + public void Start() + { + StartCoroutine(GetKSTTime()); + } + + IEnumerator Co_1Sec() + { + while ( true) + { + yield return new WaitForSeconds(1f); + Time = Time.AddSeconds(1f); + } + } + + IEnumerator GetKSTTime() + { + Time = DateTime.Now; + using (UnityWebRequest req = UnityWebRequest.Get("https://google.com")) + { + yield return req.SendWebRequest(); + + if (req.result == UnityWebRequest.Result.ConnectionError || + req.result == UnityWebRequest.Result.ProtocolError) + { + Time = DateTime.Now; + } + else + { + string dateHeader = req.GetResponseHeader("date"); + if (!string.IsNullOrEmpty(dateHeader)) + { + // 서버가 준 시간은 UTC 기준 + DateTime utcTime = DateTime.ParseExact( + dateHeader, + "ddd, dd MMM yyyy HH:mm:ss 'GMT'", + CultureInfo.InvariantCulture.DateTimeFormat, + DateTimeStyles.AssumeUniversal + ); + + Time = utcTime.ToUniversalTime() + KSTOffset; + } + } + + StartCoroutine(Co_1Sec()); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/My/InternetTime.cs.meta b/Assets/Scripts/My/InternetTime.cs.meta new file mode 100644 index 0000000..7463719 --- /dev/null +++ b/Assets/Scripts/My/InternetTime.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e806c67b86b115d458fefce3031e094c \ No newline at end of file diff --git a/Assets/Scripts/SingletonManagers/Managers/ADSManager.cs b/Assets/Scripts/SingletonManagers/Managers/ADSManager.cs index 48c6c03..16ac956 100644 --- a/Assets/Scripts/SingletonManagers/Managers/ADSManager.cs +++ b/Assets/Scripts/SingletonManagers/Managers/ADSManager.cs @@ -49,6 +49,8 @@ public class ADSManager : MonoBehaviour { // This callback is called once the MobileAds SDK is initialized. + adDictionary.Clear(); + if (GameManager.DB.IsRemoveADS == false) { adDictionary.Add("Game_Interstitial", new InterstitialAd("ca-app-pub-6390804219581974/4957790852", "Game_Interstitial")); diff --git a/Assets/Scripts/SingletonManagers/Managers/DBManager.cs b/Assets/Scripts/SingletonManagers/Managers/DBManager.cs index 350414b..269cfcb 100644 --- a/Assets/Scripts/SingletonManagers/Managers/DBManager.cs +++ b/Assets/Scripts/SingletonManagers/Managers/DBManager.cs @@ -197,7 +197,7 @@ namespace CodeJay { public const int AI_IMAGE_NUMBER = 100; - public const int ADS_TIMER_COUNT = 180; + public const int ADS_TIMER_COUNT = 3600; public const int ADS_REWARD_COUNT = 3; @@ -881,7 +881,7 @@ public partial class DBManager : MonoBehaviour return; } - DateTime now = DateTime.Now; + DateTime now = InternetTime.Ins.Time; DateTime midnightToday = DateTime.Today.AddDays(1).AddTicks(-1); if (now.Hour == 23 && now.Minute >= 30) { diff --git a/Assets/Scripts/SingletonManagers/Managers/TimerManager.cs b/Assets/Scripts/SingletonManagers/Managers/TimerManager.cs index 30a5ebf..a254ba7 100644 --- a/Assets/Scripts/SingletonManagers/Managers/TimerManager.cs +++ b/Assets/Scripts/SingletonManagers/Managers/TimerManager.cs @@ -34,7 +34,7 @@ public class TimerManager : MonoBehaviour { public int time = 0; public int limiteTimerCount = 0; - public DateTime saveTimeData = DateTime.Now; + public DateTime saveTimeData = InternetTime.Ins.Time; public UnityAction OnPassedTime; protected TimerType timerType = TimerType.None; @@ -162,7 +162,7 @@ public class TimerManager : MonoBehaviour SimpleTimerInfo info = timerInfoDictionary[dic.Key] as SimpleTimerInfo; if (info != null) { - info.saveTimeData = DateTime.Now; + info.saveTimeData = InternetTime.Ins.Time; ES3.Save(sb.ToString(), info, "TimerData.json"); } } @@ -178,7 +178,7 @@ public class TimerManager : MonoBehaviour HierarchyTimerInfo info = timerInfoDictionary[dic.Key] as HierarchyTimerInfo; if (info != null) { - info.saveTimeData = DateTime.Now; + info.saveTimeData = InternetTime.Ins.Time; ES3.Save(sb.ToString(), info, "TimerData.json"); } } @@ -263,7 +263,7 @@ public class TimerManager : MonoBehaviour { if (timerInfoDictionary[ownerName].saveTimeData != null && timerInfoDictionary[ownerName].saveTimeData.Year != 1) { - double passedTimeSecond = (DateTime.Now - timerInfoDictionary[ownerName].saveTimeData).TotalSeconds; + double passedTimeSecond = (InternetTime.Ins.Time - timerInfoDictionary[ownerName].saveTimeData).TotalSeconds; int totalPassedTimeSecond = (limiteTimerCount - timerInfoDictionary[ownerName].time) + (Int32)passedTimeSecond; if (totalPassedTimeSecond >= 0) @@ -271,10 +271,10 @@ public class TimerManager : MonoBehaviour timerCount = limiteTimerCount - totalPassedTimeSecond; } } - // Ÿ̸Ӹ ؾ Ѵ. + // 새로 타이머를 시작해야 한다. if (IsStartedTimer() == false) { - // ϴ Ÿ̸Ӱ ٸ Ÿ̸Ӹ Ѵ. + // 기존에 시작하는 타이머가 없다면 타이머를 시작한다. StartTimer(); } @@ -317,7 +317,7 @@ public class TimerManager : MonoBehaviour { if (timerInfoDictionary[ownerName].saveTimeData != null && timerInfoDictionary[ownerName].saveTimeData.Year != 1) { - double passedTimeSecond = (DateTime.Now - timerInfoDictionary[ownerName].saveTimeData).TotalSeconds; + double passedTimeSecond = (InternetTime.Ins.Time - timerInfoDictionary[ownerName].saveTimeData).TotalSeconds; int totalPassedTimeSecond = (limiteTimerCount - timerInfoDictionary[ownerName].time) + (Int32)passedTimeSecond; if (totalPassedTimeSecond >= 0) @@ -328,13 +328,13 @@ public class TimerManager : MonoBehaviour } else { - timerInfoDictionary.Add(ownerName, new SimpleTimerInfo(ownerName, timerCount, DateTime.Now, OnStartTimer, OnPauseTimer, OnStopTimer, OnPassedTime)); + timerInfoDictionary.Add(ownerName, new SimpleTimerInfo(ownerName, timerCount, InternetTime.Ins.Time, OnStartTimer, OnPauseTimer, OnStopTimer, OnPassedTime)); } - // Ÿ̸Ӹ ؾ Ѵ. + // 새로 타이머를 시작해야 한다. if (IsStartedTimer() == false) { - // ϴ Ÿ̸Ӱ ٸ Ÿ̸Ӹ Ѵ. + // 기존에 시작하는 타이머가 없다면 타이머를 시작한다. StartTimer(); } @@ -375,12 +375,12 @@ public class TimerManager : MonoBehaviour LoadHierarchyTimerInfo(ownerName); if (timerInfoDictionary.ContainsKey(ownerName) == true) { - // ε ۵ Ÿ̸Ӱ ϴ - // Ÿ̸ ؾ Ѵ. + // 로드 한 정보가 있으면 작동 중인 타이머가 존재 하는 것 + // 타이머 계산을 해야 한다. if (timerInfoDictionary[ownerName].saveTimeData != null && timerInfoDictionary[ownerName].saveTimeData.Year != 1) { - double passedTimeSecond = (DateTime.Now - timerInfoDictionary[ownerName].saveTimeData).TotalSeconds; + double passedTimeSecond = (InternetTime.Ins.Time - timerInfoDictionary[ownerName].saveTimeData).TotalSeconds; int totalPassedTimeSecond = (limiteTimerCount - timerInfoDictionary[ownerName].time) + (Int32)passedTimeSecond; if (totalPassedTimeSecond >= 0) @@ -394,20 +394,20 @@ public class TimerManager : MonoBehaviour } } - // ε Ÿ̸Ӱ ٲ Ѵ. + // 로드 된 정보에 따라 타이머가 바뀌어야 한다. } else { - // ε ۵ Ÿ̸Ӱ + // 로드 한 정보가 없으면 작동 중인 타이머가 없는 것 - // Ÿ̸ ؾ Ѵ. - timerInfoDictionary.Add(ownerName, new HierarchyTimerInfo(ownerName, timerCount, DateTime.Now, OnStartTimer, OnPauseTimer, OnStopTimer, OnPassedTime)); + // 새로 시작한 타이머의 정보를 등록해야 한다. + timerInfoDictionary.Add(ownerName, new HierarchyTimerInfo(ownerName, timerCount, InternetTime.Ins.Time, OnStartTimer, OnPauseTimer, OnStopTimer, OnPassedTime)); } - // Ÿ̸Ӹ ؾ Ѵ. + // 새로 타이머를 시작해야 한다. if (IsStartedTimer() == false) { - // ϴ Ÿ̸Ӱ ٸ Ÿ̸Ӹ Ѵ. + // 기존에 시작하는 타이머가 없다면 타이머를 시작한다. StartTimer(); } @@ -570,7 +570,7 @@ public class TimerManager : MonoBehaviour File.Delete(fileName); } - string jsonFile = JsonConvert.SerializeObject(DateTime.Now); + string jsonFile = JsonConvert.SerializeObject(InternetTime.Ins.Time); File.WriteAllText(fileName, jsonFile); } @@ -584,7 +584,7 @@ public class TimerManager : MonoBehaviour if (File.Exists(fileName) == false) { SaveTime(); - loadTime = DateTime.Now; + loadTime = InternetTime.Ins.Time; return loadTime; } @@ -624,7 +624,7 @@ public class TimerManager : MonoBehaviour { if (simpleTimerInfo.saveTimeData != null && simpleTimerInfo.saveTimeData.Year != 1) { - double passedTimeSecond = (DateTime.Now - simpleTimerInfo.saveTimeData).TotalSeconds; + double passedTimeSecond = (InternetTime.Ins.Time - simpleTimerInfo.saveTimeData).TotalSeconds; int totalPassedTimeSecond = (simpleTimerInfo.limiteTimerCount - simpleTimerInfo.time) + (Int32)passedTimeSecond; if (totalPassedTimeSecond >= 0) @@ -643,7 +643,7 @@ public class TimerManager : MonoBehaviour if (hierarchyTimerInfo.saveTimeData != null && hierarchyTimerInfo.saveTimeData.Year != 1) { - double passedTimeSecond = (DateTime.Now - hierarchyTimerInfo.saveTimeData).TotalSeconds; + double passedTimeSecond = (InternetTime.Ins.Time - hierarchyTimerInfo.saveTimeData).TotalSeconds; int totalPassedTimeSecond = (hierarchyTimerInfo.limiteTimerCount - hierarchyTimerInfo.time) + (Int32)passedTimeSecond; if (totalPassedTimeSecond >= 0) @@ -694,7 +694,7 @@ public class TimerManager : MonoBehaviour { if (simpleTimerInfo.saveTimeData != null && simpleTimerInfo.saveTimeData.Year != 1) { - double passedTimeSecond = (DateTime.Now - simpleTimerInfo.saveTimeData).TotalSeconds; + double passedTimeSecond = (InternetTime.Ins.Time - simpleTimerInfo.saveTimeData).TotalSeconds; int totalPassedTimeSecond = (simpleTimerInfo.limiteTimerCount - simpleTimerInfo.time) + (Int32)passedTimeSecond; if (totalPassedTimeSecond >= 0) @@ -713,7 +713,7 @@ public class TimerManager : MonoBehaviour if (hierarchyTimerInfo.saveTimeData != null && hierarchyTimerInfo.saveTimeData.Year != 1) { - double passedTimeSecond = (DateTime.Now - hierarchyTimerInfo.saveTimeData).TotalSeconds; + double passedTimeSecond = (InternetTime.Ins.Time - hierarchyTimerInfo.saveTimeData).TotalSeconds; int totalPassedTimeSecond = (hierarchyTimerInfo.limiteTimerCount - hierarchyTimerInfo.time) + (Int32)passedTimeSecond; if (totalPassedTimeSecond >= 0) diff --git a/Assets/Scripts/UI/ProductSlot.cs b/Assets/Scripts/UI/ProductSlot.cs index a101f3d..dcc866f 100644 --- a/Assets/Scripts/UI/ProductSlot.cs +++ b/Assets/Scripts/UI/ProductSlot.cs @@ -559,8 +559,9 @@ public class ProductSlot : CardBase { if (isCompleted) { - GameManager.DB.AddHeart(1, this.name); + GameManager.DB.AddHeart(_data.rewardAmount, this.name); GameManager.DB.MinProductAdWatchedNumber(1); + SetData(_data); if (GameManager.DB.ProductAdWatchedNumber <= 0 && AdButton != null) { @@ -569,7 +570,7 @@ public class ProductSlot : CardBase AdButton.GetComponent().color = c; } - if (GameManager.DB.ProductAdWatchedNumber > 0) + if (GameManager.DB.ProductAdWatchedNumber == 0) { GameManager.Timer.ActivateSimpleTimer(name, Constants.ADS_TIMER_COUNT, OnStartTimer, OnPauseTimer, OnStopTimer, OnPassedTime); } diff --git a/Assets/Scripts/UI/StorePanel.cs b/Assets/Scripts/UI/StorePanel.cs index 8f05a04..b61ba1e 100644 --- a/Assets/Scripts/UI/StorePanel.cs +++ b/Assets/Scripts/UI/StorePanel.cs @@ -54,12 +54,12 @@ public class StorePanel : MonoBehaviour list_item.Add(new ProductData("heart_cash", EProductType.Gold, "하트 10개", "다이아로 하트 구매", 300, sprites[0], EProductReward.Heart, 10)); list_item.Add(new ProductData("cash_heart", EProductType.Gold, "다이아 100개", "하트로 다이아 구매", 10, sprites[0], EProductReward.Key, 100)); - list_item.Add(new ProductData("com.fgb.cash500", EProductType.IAP, "다이아 500", "", 1000, sprites[5], EProductReward.Key, 500)); - list_item.Add(new ProductData("com.fgb.cash2000", EProductType.IAP, "다이아 2000", "", 6450, sprites[6], EProductReward.Key, 2000)); - list_item.Add(new ProductData("com.fgb.cash7500", EProductType.IAP, "다이아 7500", "", 11000, sprites[7], EProductReward.Key, 7500)); - list_item.Add(new ProductData("com.fgb.heart20", EProductType.IAP, "하트 20개", "", 1100, sprites[9], EProductReward.Heart, 20)); - list_item.Add(new ProductData("com.fgb.heart150", EProductType.IAP, "하트 150개", "", 7700, sprites[10], EProductReward.Heart, 150)); - list_item.Add(new ProductData("com.fgb.heart500", EProductType.IAP, "하트 500개", "", 22000, sprites[11], EProductReward.Heart, 500)); + list_item.Add(new ProductData("com.fgb.cash500", EProductType.IAP, "다이아 500", "보너스 없음", 1100, sprites[5], EProductReward.Key, 500)); + list_item.Add(new ProductData("com.fgb.cash1800", EProductType.IAP, "다이아 1800", "16% 보너스", 3300, sprites[6], EProductReward.Key, 1800)); + list_item.Add(new ProductData("com.fgb.cash7500", EProductType.IAP, "다이아 7500", "33% 보너스", 11000, sprites[7], EProductReward.Key, 7500)); + list_item.Add(new ProductData("com.fgb.heart20", EProductType.IAP, "하트 20개", "보너스 없음", 1100, sprites[9], EProductReward.Heart, 20)); + list_item.Add(new ProductData("com.fgb.heart150", EProductType.IAP, "하트 150개", "6.7% 보너스", 7700, sprites[10], EProductReward.Heart, 150)); + list_item.Add(new ProductData("com.fgb.heart500", EProductType.IAP, "하트 500개", "20% 보너스", 22000, sprites[11], EProductReward.Heart, 500)); } return; diff --git a/Assets/UI/Image/Popup/btn 1.png.meta b/Assets/UI/Image/Popup/btn 1.png.meta index d003835..bd05509 100644 --- a/Assets/UI/Image/Popup/btn 1.png.meta +++ b/Assets/UI/Image/Popup/btn 1.png.meta @@ -52,7 +52,7 @@ TextureImporter: alignment: 0 spritePivot: {x: 0.5, y: 0.5} spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteBorder: {x: 89, y: 0, z: 88, w: 0} spriteGenerateFallbackPhysicsShape: 1 alphaUsage: 1 alphaIsTransparency: 1 @@ -121,7 +121,7 @@ TextureImporter: width: 177 height: 73 alignment: 0 - pivot: {x: 0, y: 0} + pivot: {x: 0.5, y: 0.5} border: {x: 0, y: 0, z: 0, w: 0} customData: outline: [] @@ -139,7 +139,7 @@ TextureImporter: physicsShape: [] bones: [] spriteID: 5e97eb03825dee720800000000000000 - internalID: 0 + internalID: 1537655665 vertices: [] indices: edges: []