我最近开始使用Unity3D并进行了一些设置。
我现在唯一的问题是如何获得现场柜台?
因此,当我的角色被某物击中时,我的角色就会死亡。
我希望角色最多获得3条生命,而当他击中该物体时获得-1条生命。
而且它可以在他死后保留数据,因此,如果重新启动该应用程序,您将无法获得生命。
几分钟后,他获得+1直播。
谢谢:)
答案 0 :(得分:1)
运行游戏时。只需创建一个变量counterTime来计数时间,每当counterTime经过一定时间后,您都希望将counterTime重置为0并增加寿命。 当用户退出您的应用程序时,将上次保存到PlayerPref中,例如:
PlayerPref.SaveString("LastTime", DateTime.Now);
当用户进行反击游戏时,只需检查上次到现在之间的持续时间即可计算需要增加的总寿命。例如:
DateTime lastTime = DateTime.Parse(PlayerPref.GetString("LastTime"));
TimeSpan timeDif= DateTime.Now - lastTime;
int duration = timeDif.TotalSeconds;
答案 1 :(得分:0)
您可以使用PlayerPrefs.SetInt,PlayerPrefs.GetInt在文件存储中存储和读取播放器的hp。在此处阅读有关此内容的更多信息:
https://docs.unity3d.com/ScriptReference/PlayerPrefs.html
至于在几分钟后为玩家提供+1马力,您可以将DateTime.Now存储在PlayerPrefs变量中,只要您为玩家提供一些马力并使用TimeSpan和TotalMinutesPassed:
TimeSpan passedTime = DateTime.Now - lastStoredDateTime;
int totalMinutesPassed = passedTime.TotalMinutes;
我想应该是这样(不要测试此代码只是显示一个大致的想法):
void SetPlayerLives(int lives)
{
playerLives = lives;
PlayerPrefs.SetInt("player-lives",playerLives);
}
//TODO: also sth like => int GetPlayerLives() function
void CheckLiveRegen() //call this function whenever you want to check live regen:
{
int LIVE_REGEN_MINUTES = 5; //regen 1 live every 5 minutes
DateTime lastStoredDateTime = DateTime.Parse(PlayerPrefs.GetString("last-live-regen", DateTime.Now.ToString()));
TimeSpan passedTime = DateTime.Now - lastStoredDateTime;
double totalMinutesPassed = passedTime.TotalMinutes;
if(totalMinutesPassed >= LIVE_REGEN_MINUTES)
{
int val = (int) totalMinutesPassed / LIVE_REGEN_MINUTES;
// Add val to your player lives! + store new lives value
SetPlayerLives(playerLives+val);
//update last-live-regen value:
PlayerPrefs.SetString("last-live-regen", DateTime.Now.ToString());
}
}
注意:DateTime和TimeSpan类在2017.4(LTS)之前的版本中存在一些bug(特别是在android平台中)请确保您记录值并检查函数是否正常运行。 https://forum.unity.com/threads/android-datetime-now-is-wrong.488380/
答案 2 :(得分:0)
查看以下链接以了解如何统一创建生命计数器 http://codesaying.com/life-counter-in-unity/
为了计算自从上次关闭游戏以来经过的时间,应将上次的玩家偏好保存在OnApplicationPause函数中,并计算唤醒功能中的经过时间。
void Awake () {
if(!PlayerPrefs.HasKey("Lives")){
PlayerPrefs.SetString("LifeUpdateTime", DateTime.Now.ToString());
}
lives = PlayerPrefs.GetInt("Lives", maxLives);
//update life counter only if lives are less than maxLives
if (lives < maxLives)
{
float timerToAdd = (float)(System.DateTime.Now - Convert.ToDateTime(PlayerPrefs.GetString("LifeUpdateTime"))).TotalSeconds;
UpdateLives(timerToAdd);
}
}
void UpdateLives(double timerToAdd ){
if (lives < maxLives)
{
int livesToAdd = Mathf.FloorToInt((float)timerToAdd / lifeReplenishTime);
timerForLife = (float)timerToAdd % lifeReplenishTime;
lives += livesToAdd;
if (lives > maxLives)
{
lives = maxLives;
timerForLife = 0;
}
PlayerPrefs.SetString("LifeUpdateTime", DateTime.Now.AddSeconds(-timerForLife).ToString());
}else{
PlayerPrefs.SetString("LifeUpdateTime", DateTime.Now.ToString());
}
}
void OnApplicationPause(bool isPause)
{
if (isPause)
{
timeOfPause = System.DateTime.Now;
}
else
{
if(timeOfPause == default(DateTime)){
timeOfPause = System.DateTime.Now;
}
float timerToAdd = (float)(System.DateTime.Now - timeOfPause).TotalSeconds;
timerForLife += timerToAdd;
UpdateLives(timerForLife);
}
}
}