首先大家好。我正在尝试在我的统一游戏中保存上次播放日期和当前日期。如果它们不相等,我将填写试用计数。我正在从互联网上获取日期,这样玩家就无法通过在手机上更改日期来作弊。我可以带上日期并可以在控制台中看到它。我在比较日期后保存那个日期。使用控制台调试变量保存相同的变量,但这个东西不能保存它。请帮忙...这是我的代码。
using System;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using UnityEngine.Advertisements;
using System.Collections;
public class GameManager : MonoBehaviour, IUnityAdsLoadListener, IUnityAdsShowListener
{
public int maxPlayCount = 5;
public int currentPlayCount;
public int dailyReward = 5;
public TMPro.TextMeshProUGUI playCountText;
public TMPro.TextMeshProUGUI rewardText;
private DateTime lastPlayDate;
private DateTime dateTime;
private DateTime timeData;
private string apiEndpoint = "https://timeapi.io/api/Time/current/zone?timeZone=Europe/Istanbul";
private string dateTimeStr;
private string lastPlayDateStr;
private bool isAdAvailable = false;
string _adUnitId = null;
[SerializeField] string _androidAdUnitId = "Rewarded_Android";
[SerializeField] string _iOSAdUnitId = "Rewarded_iOS";
[Serializable]
public class TimeData
{
public int year;
public int month;
public int day;
public int hour;
public int minute;
public int seconds;
public int milliSeconds;
public string dateTime;
public string date;
public string time;
public string timeZone;
public string dayOfWeek;
public bool dstActive;
}
void Awake()
{
#if UNITY_IOS
_adUnitId = _iOSAdUnitId;
#elif UNITY_ANDROID
_adUnitId = _androidAdUnitId;
#endif
}
void Start()
{
// Tarih bilgisini güncelliyoruz.
StartCoroutine(GetCurrentTime());
if (!PlayerPrefs.HasKey("LastPlayDateStr"))
{
// İlk kez oyun açıldığında tarih bilgisini kaydediyoruz.
SavePlayDate();
}
else
{
// Daha önce kaydedilen son oynama tarihini alıyoruz.
string lastPlayDateStr = PlayerPrefs.GetString("LastPlayDateStr");
Debug.Log("Son Oynama Tarihi: " + lastPlayDateStr);
if (lastPlayDateStr == dateTimeStr)
{
// Son oynama tarihi bugün ise, mevcut oynama hakkını yüklüyoruz.
currentPlayCount = PlayerPrefs.GetInt("CurrentPlayCount");
Debug.Log("Son oynama tarihi bugün. Mevcut oynama hakkı yüklendi.");
}
else
{
//Son oynama tarihi bugün değil ise oynama hakkını güncelliyoruz.
currentPlayCount = maxPlayCount;
SavePlayDate();
Debug.Log("Son oynama tarihi bugün değil. Oynama hakkı güncellendi.");
}
}
UpdateUI();
}
IEnumerator GetCurrentTime()
{
// Tarih bilgisini almak için sunucuya bağlantı isteği gönderiyoruz.
UnityWebRequest webRequest = UnityWebRequest.Get(apiEndpoint);
{
yield return webRequest.SendWebRequest();
if (webRequest.result != UnityWebRequest.Result.ConnectionError || webRequest.result == UnityWebRequest.Result.ProtocolError)
{
// Sunucudan gelen tarih bilgisini alıyoruz.
string jsonResult = webRequest.downloadHandler.text;
TimeData timeData = JsonUtility.FromJson<TimeData>(jsonResult);
string dateTimeStr = timeData.date;
Debug.Log("Bugünün tarihi: " + dateTimeStr);
}
else
{
Debug.Log("Error while fetching date from server: " + webRequest.error);
yield break;
}
}
}
void SavePlayDate()
{
// Son oynama tarihini kaydediyoruz.
PlayerPrefs.SetString("LastPlayDateStr", dateTimeStr);
PlayerPrefs.SetInt("CurrentPlayCount", maxPlayCount);
currentPlayCount = maxPlayCount;
UpdateUI();
}
void UpdateUI()
{
// UI elemanlarını güncelliyoruz.
playCountText.text = "Kalan Enerji: " + currentPlayCount;
rewardText.text = "Ödül: " + dailyReward;
}
public void PlayGame()
{
if (currentPlayCount > 0)
{
currentPlayCount--;
PlayerPrefs.SetInt("CurrentPlayCount", currentPlayCount);
UpdateUI();
Debug.Log("Starting game...");
}
else
{
Debug.Log("You have no play count left. Watch an ad to get a play count.");
ShowAd();
}
}
public void OnUnityAdsAdLoaded(string _adUnitId)
{
Debug.Log("Ad loaded: " + _adUnitId);
isAdAvailable = true;
}
public void OnUnityAdsFailedToLoad(string _adUnitId, UnityAdsLoadError error, string message)
{
Debug.LogWarning("Ad failed to load: " + _adUnitId + " - Error: " + error.ToString() + " - Message: " + message);
isAdAvailable = false;
}
public void OnUnityAdsShowFailure(string _adUnitId, UnityAdsShowError error, string message)
{
Debug.LogWarning("Ad failed to show: " + _adUnitId + " - Error: " + error.ToString() + " - Message: " + message);
}
public void OnUnityAdsShowStart(string _adUnitId)
{
Debug.Log("Ad started: " + _adUnitId);
}
public void OnUnityAdsShowClick(string _adUnitId)
{
Debug.Log("Ad clicked: " + _adUnitId);
}
public void OnUnityAdsShowComplete(string _adUnitId, UnityAdsShowCompletionState showCompletionState)
{
Debug.Log("Ad completed: " + _adUnitId + " - Completion state: " + showCompletionState.ToString());
// Reklam kapatıldıktan sonra oynama hakkını yüklüyoruz.
currentPlayCount++;
PlayerPrefs.SetInt("CurrentPlayCount", currentPlayCount);
UpdateUI();
}
public void OnUnityAdsDidError(string message)
{
Debug.LogError("Ad error: " + message);
}
public void ShowAd()
{
// Reklam göstermek için uygun mu diye kontrol ediyoruz.
if (isAdAvailable)
{
// Reklamı gösteriyoruz ve uygun listener'ları atıyoruz.
Advertisement.Show(_adUnitId, this);
isAdAvailable = false;
}
else
{
// Reklam yüklenmediyse yeniden yüklüyoruz.
Advertisement.Load(_adUnitId, this);
}
}
public void OnAdClosed()
{
// Reklam kapatıldıktan sonra oynama hakkını yüklüyoruz.
UpdateUI();
}
void Update()
{
}
}
我试着把所有的东西都变成字符串,但没有成功。还尝试使所有 DateTime 开始覆盖所有带有错误消息的控制台。
更新: 感谢@yeis-gallegos 和@derHugo 的所有帮助。我修复了我的代码,它现在运行得非常好。
这是为遇到相同问题或正在寻找示例代码以用于系统日期证明每日奖励系统的人工作的。
using System;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using UnityEngine.Advertisements;
using System.Collections;
public class GameManager : MonoBehaviour, IUnityAdsLoadListener, IUnityAdsShowListener
{
public int maxPlayCount = 5;
public int currentPlayCount;
public int dailyReward = 5;
public TMPro.TextMeshProUGUI playCountText;
public TMPro.TextMeshProUGUI rewardText;
private string dateTimeStr;
private DateTime lastPlayDate;
private DateTime dateTime;
private DateTime timeData;
private string apiEndpoint = "https://timeapi.io/api/Time/current/zone?timeZone=Europe/Istanbul";
private string lastPlayDateStr;
private bool isAdAvailable = false;
string _adUnitId = null;
[SerializeField] string _androidAdUnitId = "Rewarded_Android";
[SerializeField] string _iOSAdUnitId = "Rewarded_iOS";
[Serializable]
public class TimeData
{
public int year;
public int month;
public int day;
public int hour;
public int minute;
public int seconds;
public int milliSeconds;
public string dateTime;
public string date;
public string time;
public string timeZone;
public string dayOfWeek;
public bool dstActive;
}
void Awake()
{
#if UNITY_IOS
_adUnitId = _iOSAdUnitId;
#elif UNITY_ANDROID
_adUnitId = _androidAdUnitId;
#endif
}
private IEnumerator Start()
{
IEnumerator GetCurrentTime()
{
// Tarih bilgisini almak için sunucuya bağlantı isteği gönderiyoruz.
UnityWebRequest webRequest = UnityWebRequest.Get(apiEndpoint);
yield return webRequest.SendWebRequest();
if (webRequest.result == UnityWebRequest.Result.Success)
{
// Sunucudan gelen tarih bilgisini alıyoruz.
string jsonResult = webRequest.downloadHandler.text;
TimeData timeData = JsonUtility.FromJson<TimeData>(jsonResult);
dateTimeStr = timeData.date;
Debug.Log("Bugünün tarihi: " + dateTimeStr);
}
else
{
Debug.Log("Error while fetching date from server: " + webRequest.error);
yield break;
}
}
// GetCurrentTime() fonksiyonunu çağırıyoruz.
yield return GetCurrentTime();
if (!PlayerPrefs.HasKey("LastPlayDateStr"))
{
// İlk kez oyun açıldığında tarih bilgisini kaydediyoruz.
SavePlayDate();
}
else
{
// Daha önce kaydedilen son oynama tarihini alıyoruz.
string lastPlayDateStr = PlayerPrefs.GetString("LastPlayDateStr");
Debug.Log("Son Oynama Tarihi: " + lastPlayDateStr);
if (lastPlayDateStr == dateTimeStr)
{
// Son oynama tarihi bugün ise, mevcut oynama hakkını yüklüyoruz.
currentPlayCount = PlayerPrefs.GetInt("CurrentPlayCount");
Debug.Log("Son oynama tarihi bugün. Mevcut oynama hakkı yüklendi.");
}
else
{
//Son oynama tarihi bugün değil ise oynama hakkını güncelliyoruz.
currentPlayCount = maxPlayCount;
SavePlayDate();
Debug.Log("Son oynama tarihi bugün değil. Oynama hakkı güncellendi.");
}
}
UpdateUI();
}
void SavePlayDate()
{
// Son oynama tarihini kaydediyoruz.
PlayerPrefs.SetString("LastPlayDateStr", dateTimeStr);
PlayerPrefs.SetInt("CurrentPlayCount", maxPlayCount);
currentPlayCount = maxPlayCount;
UpdateUI();
}
void UpdateUI()
{
// UI elemanlarını güncelliyoruz.
playCountText.text = "Kalan Enerji: " + currentPlayCount;
rewardText.text = "Ödül: " + dailyReward;
}
public void PlayGame()
{
if (currentPlayCount > 0)
{
currentPlayCount--;
PlayerPrefs.SetInt("CurrentPlayCount", currentPlayCount);
UpdateUI();
Debug.Log("Starting game...");
}
else
{
Debug.Log("You have no play count left. Watch an ad to get a play count.");
ShowAd();
}
}
public void OnUnityAdsAdLoaded(string _adUnitId)
{
Debug.Log("Ad loaded: " + _adUnitId);
isAdAvailable = true;
}
public void OnUnityAdsFailedToLoad(string _adUnitId, UnityAdsLoadError error, string message)
{
Debug.LogWarning("Ad failed to load: " + _adUnitId + " - Error: " + error.ToString() + " - Message: " + message);
isAdAvailable = false;
}
public void OnUnityAdsShowFailure(string _adUnitId, UnityAdsShowError error, string message)
{
Debug.LogWarning("Ad failed to show: " + _adUnitId + " - Error: " + error.ToString() + " - Message: " + message);
}
public void OnUnityAdsShowStart(string _adUnitId)
{
Debug.Log("Ad started: " + _adUnitId);
}
public void OnUnityAdsShowClick(string _adUnitId)
{
Debug.Log("Ad clicked: " + _adUnitId);
}
public void OnUnityAdsShowComplete(string _adUnitId, UnityAdsShowCompletionState showCompletionState)
{
Debug.Log("Ad completed: " + _adUnitId + " - Completion state: " + showCompletionState.ToString());
// Reklam kapatıldıktan sonra oynama hakkını yüklüyoruz.
currentPlayCount++;
PlayerPrefs.SetInt("CurrentPlayCount", currentPlayCount);
UpdateUI();
}
public void OnUnityAdsDidError(string message)
{
Debug.LogError("Ad error: " + message);
}
public void ShowAd()
{
// Reklam göstermek için uygun mu diye kontrol ediyoruz.
if (isAdAvailable)
{
// Reklamı gösteriyoruz ve uygun listener'ları atıyoruz.
Advertisement.Show(_adUnitId, this);
isAdAvailable = false;
}
else
{
// Reklam yüklenmediyse yeniden yüklüyoruz.
Advertisement.Load(_adUnitId, this);
}
}
public void OnAdClosed()
{
// Reklam kapatıldıktan sonra oynama hakkını yüklüyoruz.
UpdateUI();
}
void Update()
{
}
}