茫茫網海中的冷日 - 對這文章發表回應
茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1675127 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00015.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2015/1/20 9:19:48
C# countdown timer

I'm trying to create a c# countdown timer for my level which should also be displayed in the GUI. The player needs to destroy certain items to get extra time. If the player runs out of time it's game over. It the player destroyed all the items they are presented with the time left and then can play again to see if they can finish the level faster with more time remaining.
I'm not sure what the script is to initiate a timer and then count down with seconds. The initial time should obviously be a public parameter you can tweak from inside the editor.
Running out of time should run an if statement to initiate a game over screen for losing. Destroying all the objects should stop the timer and record the remaining time to display in the winning game over screen.
Destroying certain objects will add time to the timer in seconds or fractions of seconds.
So I know what I want to do, but the Syntax is giving me nightmares. :-O Any help will be appreciated.

You could create a script that keeps track of how much time is left.
That object's update loop can subtract Time.deltaTime from that value, and check if it's below zero:
var timeLeft = 30;
    function Update()
    {
    timeLeft -= Time.deltaTime;
    if ( timeLeft < 0 )
    {
    GameOver();
    }
    }

Other objects could access that value, to display it in the GUI or add to it as needed.

Translated to C# it would be
    float timeLeft = 30.0f;
    void Update()
    {
    timeLeft -= Time.deltaTime;
    if(timeLeft < 0)
    {
    GameOver();
    }
    }


Michael,
That's quite a request, but I like a challenge, so here we go.
Firstly, the structure that probably best suits this is: - Game Controller (in charge of game win/loss and messaging) - Timer (GuiText object that displays the time left on screen. It is VERY important that Timer is a child of the Game Controller gameobject) - Items (the onscreen, destructable items you mentioned. These must also be child objects of the Game Controller)
The Game Controller would look something like this:
    using UnityEngine;
    using System.Collections;
    public float timeIncrease = 2;
    public bool timeElapsed = false;
    public int items;
    void Start()
    {
    //Gather how many items are remaining
    GameObject[] items = GameObject.FindObjectsWithTag("items") as GameObject[];
    itemsRemaining = items.length;
    //The timer, as a child of this gameobject, receive this and start the countdown using the timeRemaining variable
    BroadcastMessage("Start Timer", timeRemaining);
    }
    void Update()
    {
    if (itemsRemaining == 0)
    {
    //You win!
    }
    if (timeElapsed)
    {
    //You lose!
    }
    }
    //If the game controller receives this signal from the timer, it will end the game
    void timeHasElapsed()
    {
    timeElapsed = true;
    }
    //If the Game Controller receives this signal from a destroyed item,
    // it sends a message to the time object to increase the time left
    void itemDestroyed()
    {
    increaseTime();
    }
    void increaseTime()
    {
    broadcastMessage("timeIncrease", timeIncrease)
    }
    //I've included this dead function because I can't test the code myself right now and I don't want to leave
    // you with errors. IT may or may not be needed, though.
    void timeIncrease
    {}

The purpose of the Game Controller would be to receive the happenings of both the items and timers and pass the appropriate responses back and forth, as well as handle the win/lose condition.
Then, you would have this script attached to your timer object:
    using UnityEngine;
    using System.Collections;
    public float timeRemaining = 60f;
    void Start()
    {
    InvokeRepeating("decreaseTimeRemaining", 1.0, 1.0)
    }
    void Update()
    {
    if (timeRemaining == 0)
    {
    sendMessageUpward("timeElapsed");
    }
    GuiText.text = timeRemaining + " Seconds remaining!";
    }
    void decreaseTimeRemaining()
    {
    timeRemaining --;
    }
    //may not be needed, left it in there
    void timeElapsed()
    {}

And, in the script for your onscreen items, you would include this:
    void OnDestroy()
    {
    SendMessageUpwards("itemDestroyed")
    }
    void itemDestroyed()
    {}

I have to apologise in advance, though, I have no ability to test this code right now and I had to crank it out quickly, so it will have errors, but remember, Game Controller is the parent to the timer and items, as they will have to send messages back and forth and, in this code, the game controller will handle that.


原文出處:C# countdown timer - Unity Answers
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|