Unity 2D:当玩家失去所有生命时,如何启动计时器

本文关键字:何启动 启动 计时器 2D 玩家 失去 有生命 Unity | 更新日期: 2023-09-27 17:59:02

我想在玩家当前生命值达到0时开始计时器倒计时。到目前为止,我的计时器连接到我的游戏面板上,当玩家失去所有的心(生命)时,面板会向下滑动。当我玩应用程序(游戏)时,计时器会自动启动,当我的游戏控制面板滑下时,计时器就会停止。这不是我想要的。我想做的是,当玩家失去所有的心(生命),游戏面板滑下时,计时器开始计时。

这是我的玩家的健康脚本:

public int curHealth;
public int maxHealth = 3;
Vector3 startPosition;
public PlayerHealth playerhealthRef;
float counter;
public Animator anima; // drag the panel in here again
private UI_ManagerScripts UIM;
private PandaScript ps;
DateTime currentDate;
DateTime oldDate;

void Start ()
{
    curHealth = maxHealth;
    startPosition = transform.position;
    ps = GameObject.FindGameObjectWithTag("PandaScript").GetComponent <PandaScript> ();
    currentDate = System.DateTime.Now;      
}

void Update ()
{
    if (curHealth > maxHealth) {
        curHealth = maxHealth;
    }
    if (curHealth <= 0) {
        Die ();
    }
}
void Awake()
{
    UIM = GameObject.Find ("UIManager").GetComponent<UI_ManagerScripts> ();
}
void Die(){
    if (PlayerPrefs.HasKey ("Highscore")) {
        if (PlayerPrefs.GetInt ("Highscore") < ps.Score) {
            PlayerPrefs.SetInt ("Highscore", ps.Score);
        }
    } else 
    {
        PlayerPrefs.SetInt ("Highscore", ps.Score);
    }
    UIM.EnableBoolAnimator(anima);
    PlayerPrefs.SetInt("RemainingLives", curHealth);
    print("Remanining Lives: " + curHealth);
    PlayerPrefs.Save();
}
void OnApplicationQuit()
{
    PlayerPrefs.SetString("sysString", System.DateTime.Now.ToBinary().ToString());
    print("Saving this date to prefs: " + System.DateTime.Now);
}
void LoadSaveData()
{
    PlayerPrefs.GetInt ("RemainingLives",0);
    OnApplicationQuit ();
}
public void Damage(int dmg)
{
    curHealth -= dmg;
    Reset();
}
void Reset ()
{
    transform.position = startPosition;
    GotoMouse.target = startPosition;
}   
}

这是我的计时器脚本:

public Text timer;
int minutes = 1;
int seconds = 0;
float miliseconds = 0;
public int curHealth;
public int maxHealth = 3;
[Range(1, 59)]
public int defaultStartMinutes = 1;
public bool allowTimerRestart = false;
public bool useElapsedTime = true;
private int savedSeconds;
private bool resetTimer = false;
private DateTime centuryBegin = new DateTime(2001, 1, 1);
void Start ()
{
    curHealth = maxHealth;
}
void Awake ()
{
    minutes = defaultStartMinutes;
    if (PlayerPrefs.HasKey("TimeOnExit"))
    {
        miliseconds = PlayerPrefs.GetFloat("TimeOnExit");
        savedSeconds = (int)miliseconds;
        if (useElapsedTime && PlayerPrefs.HasKey("CurrentTime"))
        {
            int elapsedTicks = (int)(DateTime.Now.Ticks / 10000000);
            int ct = PlayerPrefs.GetInt("CurrentTime", elapsedTicks);
            PlayerPrefs.DeleteKey("CurrentTime");
            elapsedTicks -= ct;
            if (elapsedTicks < miliseconds)
            {
                miliseconds -= elapsedTicks;
            }
            else
            {
                miliseconds = 0;
            }
        }
        minutes = (int)miliseconds / 60;
        miliseconds -= (minutes * 60);
        seconds = (int)miliseconds;
        miliseconds -= seconds;
        PlayerPrefs.DeleteKey("TimeOnExit");
    }
    savedSeconds = 0;
}
public void Update()
{
    // count down in seconds
    miliseconds += Time.deltaTime;
    if (resetTimer)
    {
        ResetTime();
    }
    if (miliseconds >= 1.0f)
    {
        miliseconds -= 1.0f;
        if ((seconds > 0) || (minutes > 0))
        {
            seconds--;
            if (seconds < 0)
            {
                seconds = 59;
                minutes--;
            }
        }
        else
        {
            resetTimer = allowTimerRestart;
        }
    }
    if (seconds != savedSeconds)
    {
        //  Show current time
        timer.text = string.Format("{0}:{1:D2}", minutes, seconds);
        savedSeconds = seconds;
    }
}
void ResetTime()
{
    minutes = defaultStartMinutes;
    seconds = 0;
    savedSeconds = 0;
    miliseconds = 1.0f - Time.deltaTime;
    resetTimer = false;
}
private void OnApplicationQuit()
{
    int numSeconds = ((minutes * 60) + seconds);
    if (numSeconds > 0)
    {
        miliseconds += numSeconds;
        PlayerPrefs.SetFloat("TimeOnExit", miliseconds);
        if (useElapsedTime)
        {
            int elapsedTicks = (int)(DateTime.Now.Ticks / 10000000);
            PlayerPrefs.SetInt("CurrentTime", elapsedTicks);
        }
    }
}
}

Unity 2D:当玩家失去所有生命时,如何启动计时器

使用此免费且非常有用的资产:https://www.assetstore.unity3d.com/en/#/内容/17276

然后写这样的东西:

Observable.EveryUpdate()
    .Where(_ => currentHealth <= 0)
    .Subscribe(_ =>
    {
        //Do something...
        //Ex. Die();
    });

订阅中的所有内容都将在条件为true时执行。在Start()而不是Update()中使用此选项。

哦。。。如果你想要一些简单的定时器,可以写例如:

Observable.Timer(TimeSpan.FromMilliseconds(1000))
    .Subscribe(_ =>
    {
    });

您在Awake()和Update()方法中有代码,但我看不到任何东西告诉它在玩家输了时等待。当您希望计时器开始时,您可以设置标志或启用计时器脚本。

似乎你也在使用PlayerPrefs来做一些不一定需要的事情。除非你想在游戏退出并重新启动后跟踪剩余的生命(这甚至没有多大意义),否则最好使用一个实例,甚至类变量。