UnityEngine下Time 类的学习,时间管理器,计时器,时间线,
Time 類用的最多的 應該就是Time.deltime; 第一次接觸Time類的也是 這個屬性,這個就是 上一幀的偏移量,
電腦 完成 上一幀 到現在 這一幀的時間 。
簡單計時器
float Timer=0.0f;float WaitTime=1.0f;Update(){//check inputif (Input.GetKey(KeyCode.Space)){Timer += Time.deltaTime;if (Timer>WaitTime){Timer -= WaitTime;//Do Something Instantiate(Bullect)GameObject bullectGo = Instantiate(Bullect, transform.position transform.rotation);bullectGo.GetComponent<Rigidbody>().AddForce(transform.forward * 1000);}} }上面這個偽代碼就是 每過1秒 做些事情, 如如 按下 space鍵 每秒發射一顆子彈。
這里 比較粗糙,只是說說應用,就是一個簡單 的計時器功能。
FPS游戲 子彈 應該有個 對象池管理,然后子彈身上也應該有自己的數據腳本,它自己的生命周期,速度,傷害,威力,作用對象…等等。
在生命周期函數 update里
因為每個 電腦性能都不一樣,更新的頻率也不一樣,所以偏移量也 會因此不同。
這里如果只是要處理一些簡單的 邏輯 就可以直接 用簡單的計時器,
如果 復雜點的可以 用協同程序來解決
協同程序背后也是一個迭代器機制。用狀態機完成。
使用前 要先Stop下保證單一協同程序執行。因為協同程序 不允許同時出現。
Time.realtimeSinceStartup
游戲開始后開始讀秒,真實時間線
Time.time
游戲(幀)開始的時間
Time.smoothDeltaTime
平滑的Time.DeltaTime 防止幀數波動過大, 不同機器性能不一樣。
Time.frameCount 計算 幀數。 應該就是每次 傳遞的幀的總數了。
這個 可以用來截圖, 因為幀數 是一直增加的,截圖無非就是截下某一幀的畫面。
Unity在 ScreenCapture類 里提供了**CaptureScreenshot()**方法。在指定目錄下生成一張截取游戲屏幕的圖片。
下面是小例子,來自Unity官方。
#region 截圖 captureFramerate的 應用public string folder = "ScreenshotFolder";public int frameRate = 25;#endregionvoid Start(){//設置播放幀數(在此之后,實時將不與游戲時間相關)。Time.captureFramerate = frameRate;//創建目錄System.IO.Directory.CreateDirectory(folder);}private void OnGUI(){#region captureFramerateif (GUILayout.Button(new GUIContent("截圖","截圖工具"))){//將文件名附加到文件夾名(格式為“幀數 shot.png”)string name = string.Format("{0}/{1:D04} shot.png", folder, Time.frameCount);// 在指定 目錄下捕獲 屏幕截圖ScreenCapture.CaptureScreenshot(name);}#endregion}Time.timeSinceLevelLoad
加載關卡以來用的時間
在 加載 新場景的時間 會重置。
Time.timeScale 時間流逝的速率, 影響Time的流逝。0.5是 放慢時間速率 放慢2倍。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class TestTime : MonoBehaviour {// Start is called before the first frame update#region 截圖 captureFramerate的 應用public string folder = "ScreenshotFolder";public int frameRate = 25;public bool isFire=false;#endregionfloat Timer = 0.0f;public float WaitTime = 1.0f;public GameObject Bullect;public float TimeScaleRate=1;void Start(){DontDestroyOnLoad(this);//設置播放幀數(在此之后,實時將不與游戲時間相關)。Time.captureFramerate = frameRate;//創建目錄System.IO.Directory.CreateDirectory(folder);}private void OnGUI(){GUILayout.Space(20);GUILayout.Label("RealTime(游戲開始后開始讀秒,真實時間線):" + Time.realtimeSinceStartup);GUILayout.Label("Time.Time(游戲(幀)開始的時間):" + Time.time);GUILayout.Label("Time.smoothDelaTime:" + Time.smoothDeltaTime);GUILayout.Label("Time.captureFramerate(減慢游戲播放時間,以便在幀之間保存屏幕截圖):" + Time.captureFramerate);GUILayout.Label("Time.timeSinceLevelLoad (加載關卡以來的時間):" + Time.timeSinceLevelLoad);GUILayout.TextArea("renderedFrameCount:" + Time.renderedFrameCount);//GUIStyle slider = new GUIStyle(GUI.skin.horizontalSlider);//GUIStyle sliderThumb = new GUIStyle(GUI.skin.horizontalSliderThumb);//TimeScaleRate= GUI.HorizontalSlider(new Rect(Screen.width / 8, Screen.height / 4, Screen.width - (4 * Screen.width / 8), Screen.height - (2 * Screen.height/ 4)),TimeScaleRate, 0, 10,slider,sliderThumb);//Time.timeScale = TimeScaleRate;//slider.fixedHeight = Screen.height / 32;//slider.fixedWidth = 12*(Screen.width / 200);//sliderThumb.fixedHeight = Screen.height / 8;//sliderThumb.fixedWidth = Screen.width / 8;#region captureFramerateif (GUILayout.Button(new GUIContent("截圖","截圖工具"))){//將文件名附加到文件夾名(格式為“幀數 shot.png”)string name = string.Format("{0}/{1:D04} shot.png", folder, Time.frameCount);// 在指定 目錄下捕獲 屏幕截圖ScreenCapture.CaptureScreenshot(name);}#endregionif (GUILayout.Button("Time.timeSinceLevelLoad")){Debug.Log ("Time.timeSinceLevelLoad:要加載了場景,就會重新計算");SceneManager.LoadScene(0);}if (GUILayout.Button("Fire a bullect per second")){isFire = !isFire;}}// Update is called once per framevoid Update(){if (isFire){if (Input.GetKey(KeyCode.Space)){Timer += Time.deltaTime;if (Timer > WaitTime){Timer -= WaitTime;GameObject bullectGo = Instantiate(Bullect, transform.position ,transform.rotation);bullectGo.GetComponent<Rigidbody>().AddForce(transform.forward * 1000);}}}}} using System.Collections; using System.Collections.Generic; using UnityEngine;public class TimeDealTimeExp : MonoBehaviour {float waitTime = 2.0f;private float timer = 0.0f;float visualTime = 0.0f;int width, height;float value = 10.0f;float scrollBar=1.0f;private void Awake(){width = Screen.width;height = Screen.height;Time.timeScale = scrollBar;Debug.Log((int)5.5f);Debug.Log("Mathf.RoundToInt(10.5f):" + Mathf.RoundToInt(10.5f));Debug.Log("Mathf.RoundToInt(10.6f):" + Mathf.RoundToInt(10.6f));Debug.Log("10.4f:" + Mathf.RoundToInt(10.4f));Debug.Log("-10.5f:" + Mathf.RoundToInt(-10.5f));Debug.Log("-10.4f:" + Mathf.RoundToInt(-10.4f));Debug.Log("-10.6f:" + Mathf.RoundToInt(-10.6f));Debug.Log("Mathf.RoundToInt(-11.5f):" + Mathf.RoundToInt(-11.5f));Debug.Log("-12.5f:" + Mathf.RoundToInt(-12.5f));Debug.Log("f1:"+5.555f.ToString("f1"));Debug.Log("f2:"+5.555f.ToString("f2"));Debug.Log("f3:"+5.5555f.ToString("f3"));Debug.Log("四舍五入,結尾是0.5f ,奇偶 放回偶");} // Update is called once per framevoid Update(){timer += Time.deltaTime;// 檢查是否超過2秒// 到達時間2秒 減去2 會比重置為0精確if (timer>waitTime){visualTime = timer;timer = timer - waitTime;Time.timeScale = scrollBar;}}private void OnGUI(){GUIStyle sliderDetails = new GUIStyle(GUI.skin.GetStyle("horizontalSlider"));GUIStyle sliderThumbDetails = new GUIStyle(GUI.skin.GetStyle("horizontalSliderThumb"));GUIStyle labelDelDetails = new GUIStyle(GUI.skin.GetStyle("laber"));labelDelDetails.fontSize=6*(width/200);sliderDetails.fixedHeight = height / 32;sliderDetails.fontSize = 12 * (width / 200);sliderThumbDetails.fixedHeight = height / 32;sliderThumbDetails.fixedWidth = width / 32;//顯示 滑動條 使比例比需要的尺寸 大10倍value = GUI.HorizontalSlider(new Rect(width / 8, height / 4, width - (4 * width / 8), height - (2 * height / 4)), value, 5.0f, 20.0f, sliderDetails, sliderThumbDetails);//顯示 滑動條的值,從0.5 以此 遞增 0.1 到2.0 顯示float v = ((float)Mathf.RoundToInt(value)) / 10.0f;GUI.Label(new Rect(width / 8, height / 3.25f, width - (2 * width / 8), height - (2 * height / 4)), "time.TimeScale:" + v.ToString("f1"), labelDelDetails);scrollBar = v;//以一定的大小顯示 記錄的時間labelDelDetails.fontSize = 14 * (width / 200);GUI.Label(new Rect(width / 8, height / 2, width - (2 * width / 8), height - (2 * height / 4)), "Timer value is: " + visualTime.ToString("f1") + " seconds.", labelDelDetails);} }總結
以上是生活随笔為你收集整理的UnityEngine下Time 类的学习,时间管理器,计时器,时间线,的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超市买菜系统c语言,买菜就像逛超市,市北
- 下一篇: 设备管理系统软件都有哪些功能?