1. 程式人生 > >轉載 雨鬆MOMO 2014年07月16日 於 雨鬆MOMO程式研究院 發表 Unity3D研究院之Time.timeScale、遊戲暫停(七十四)

轉載 雨鬆MOMO 2014年07月16日 於 雨鬆MOMO程式研究院 發表 Unity3D研究院之Time.timeScale、遊戲暫停(七十四)

專案裡面一直在用Time.timeScale來做遊戲的 1倍 2倍整體加速,今天我仔細看了一下Time.timeScale才發現之前我理解錯了一些東西。

Time.timeScale可以控制Update 和LateUpdate 的執行速度,舉個例子說明一下。

Time.timeScale=1時,Update、LateUpdate、FixedUpdate 都按正常的時間來執行。

Time.timeScale=2時,Update和 LateUpdate的執行速度是之前的2倍,而FixedUpdate還是按正常時間來執行。

Sorry上面紅色這部分確實是寫錯了,感謝網友在留言處給我的指正,謝謝。

正確的應該是timeScale不會影響Update和LateUpdate的執行速度。因為FixedUpdate是根據時間來的,所以timeScale只會影響FixedUpdate的速度。 再次抱歉。。 謝謝熱心網友給我的指正。。 因為我的專案裡在處理戰鬥部分的時候 大量使用 iTween 所以  2  3 倍加速 或者暫停 的功能直接修改timeScale 。 

Time.timeScale也誤導了我很久,為什麼這麼說呢?我原先一直以為Time.timeScale = 0 的話所有的Update都不執行了。今天測試了一下發現原來不是這樣的,無論Time.timeScale 等於多說Update和LateUpdate都會去執行,不信你可以自己做個實驗看看。

Time.timeScale還會影響Time.time的時間,比如Time.timeScale = 2的話,那麼Time.time的增長速度也會變成2倍速度。如果你想取到遊戲的實際時間,那麼使用Time.timeSinceLevelLoad就可以,前提是必須在Awake()方法以後再取,如果在Awake()方法裡面取Time.realtimeSinceStartup會取出一個錯誤的值,在Start方法裡面取的話就正常了。

總之一句話Time.timeScale影響的是Unity的遊戲時間縮放比例。Unity裡面所有跟時間有關係的東西都是根據timeScale來演算的。仔細想想現在的手遊就是個 動畫 和 粒子技能特效 還有UI位移特效,所以改他們的速度直接用Time.timeScale就可以完成。還有一個重要的東西就是人物移動 或者 技能移動的速度了, 根據時間的公式,時間 = 路程\速度 ,比如角色從起點跑到中間的一個預期時間, 或者一個技能的火球從攻擊到打中目標的預期時間。 凡是處理時間的東東全用Time.time 這樣就可以完美讓Time.timeScale控制你的遊戲了。

下面說說兩個大傢伙比較關心的話題。

1.遊戲暫停

設定 Time.timeScale = 0;即可讓遊戲暫停。 其實我們暫停的主要是 人物動畫,還有技能特效,比如一個火球打了一半。UI方面往往我們不希望暫停,比如暫停介面 有一些UI位移動畫或者幀動畫, 或者最起碼要有個“取消暫停的按鈕” 吧。 總不能遊戲暫停了我點選按鈕 按鈕的點選動畫 或者特效也暫停了吧。

所有的動畫都是基於時間來的,因為Time.timeScale = 0了,所以Time.time也就不會在變化了。換句話來說如果遊戲暫停以後想在暫停介面上繼續播放一些不受Time.timeScale 影響的動畫,那麼我們就需要用到Time.realtimeSinceStartup

如果你的專案NGUI的版本還算比較新的話,你會發現在UITweener.cs處理UI動畫的基類裡面已經增加了一個屬性叫public bool ignoreTimeScale = true; 它就是控制控制NGUI 的UI動畫是否受到ignoreTimeScale影響。如下圖所示,你可以看看NGUI在Update裡面的實現,它也是根據時間來判斷的。忽略timescale的話就用真實時間,不忽略的話就用Time.time 和Time.deltaTime。

Unity3D研究院之Time.timeScale、遊戲暫停(七十四) - 雨鬆MOMO程式研究院 - 1

2.如何讓遊戲中某個遊戲物件不受Time.timeScale影響。

動畫不受timeScale影響:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 staticIEnumerator Play(Animation animation,stringclipName,booluseTimeScale,System.Action onComplete) { if(!useTimeScale) { AnimationState _currState=animation[clipName]; boolisPlaying=true; float_startTime=0F; float_progressTime=0F; float_timeAtLastFrame=0F; float_timeAtCurrentFrame=0F; floatdeltaTime=0F; animation.Play(clipName); _timeAtLastFrame=Time.realtimeSinceStartup; while(isPlaying) { _timeAtCurrentFrame=Time.realtimeSinceStartup; deltaTime=_timeAtCurrentFrame-_timeAtLastFrame; _timeAtLastFrame=_timeAtCurrentFrame; _progressTime+=deltaTime; _currState.normalizedTime=_progressTime/_currState.length; animation.Sample(); if(_progressTime>=_currState.length) { if(_currState.wrapMode!=WrapMode.Loop) { isPlaying=false; } else { _progressTime=0.0f; } } yield returnnewWaitForEndOfFrame(); } yield returnnull

相關推薦

轉載 MOMO 20140716 MOMO程式研究院 發表 Unity3D研究院Time.timeScale遊戲暫停

專案裡面一直在用Time.timeScale來做遊戲的 1倍 2倍整體加速,今天我仔細看了一下Time.timeScale才發現之前我理解錯了一些東西。 Time.timeScale可以控制Update 和LateUpdate 的執行速度,舉個例子說明一下。

輸入阿拉伯數字整數,輸出相應的中文美團網2014916筆試題目之中的一個

++i 方式 data ++ name int end == pri 2014年9月16日,美團網南京筆試題之中的一個。原要求是輸入整數的位數最多為四位。這裏擴展為12為,即最高到千億級別。 思路及步驟: 1 判別輸入是否合法,並過濾字符串最前面的‘0’。 2 將字符串

css的div垂直居中的方法,百分比div垂直居中 20141116 19922次瀏覽 前言 我們都知道,固定高寬的div在網頁中垂直居中很簡單,相信大家也很容易的寫出來,但是不是固定高寬的d

前言 我們都知道,固定高寬的div在網頁中垂直居中很簡單,相信大家也很容易的寫出來,但是不是固定高寬的div如何垂直居中呢?我們在網頁佈局,特別是手機等web端網頁經常是不固定高寬的div,那麼這些div如何垂直居中呢?這篇文章,我總結一下。 固定高寬div垂直居中 如上圖,固定高寬的很簡單,寫法如下:

20141016

安裝包安裝apache,包含可能發生的錯誤解決方案  安裝apache 提示APR not found 解決方法  推薦方法,注意版本號。 1.下載apr安裝包: http://labs.mop.com/apache-mirror//apr/apr-1.4

2014 07

銘毅天下 【死磕Elasticsearch知識星球】http://t.cn/RmwM3N9;【Elasticsearch微信公眾號】銘毅天下;【死磕ElasticsearchQQ群】626036393...

從頭到尾徹底理解KMP2014822(轉載)

從頭到尾徹底理解KMP 作者:July 時間:最初寫於2011年12月,2014年7月21日晚10點 全部刪除重寫成此文,隨後的半個多月不斷反覆改進。後收錄於新書《程式設計之法:面試和演算法心得》第4.4節中。

輸出今天的日期,以YYYY-MM-DD的方式,比如今天是2014926,則輸出2014-09-26

獲取 mon div code nth 2014年 cnblogs get 輸出 var d = new Date(); // 獲取年,getFullYear()返回4位的數字 var year = d.getFullYear(); // 獲取月,月份比較特殊,0是1月,

2014825,收藏家和殺手——面向對象的C++和C

creat os x tracking -m end gin 知識 數據 我們 近期事情特別多,睡眠也都非常晚,有點精神和身體混亂的感覺,所以想寫寫技術分析文章。讓兩者的我都調整一下。這篇技術分析文章是一直想寫的,當前僅僅是開篇,有感覺的時候就寫寫,屬於拼湊而成,興

阿里資料分析師實習生筆試題2014329

時間為90分鐘 題型:10道選擇,3道簡答,2道分析題 回憶版 選擇題: 1)若 r=0,則兩者的關係: 我選擇的是  沒有線性關係 2)以下兩種行為分別對應哪種分類演算法的評價標準: 行為1:警察如何判別某人是小偷 行為2:小偷是如何被識別出來(+_+行為

20141205

/etc/security/user  default: 定義預設配置  account_locked = true 鎖定帳號  admin = false 系統管理員  dictionlis

20150721第13天筆記

一、導航控制器連線 從一個TableView控制器到View控制器 1)兩個控制器要有對應的關聯類 2)TableView的cell要設定id,保證在關聯類裡取到它,負責導航連線無效,因為壓根就沒取到它 3)用cell把View控制器push進來 4)再往TableView的導

20150721第12天筆記

零碎知識 1.新建-Other-PCH檔案 2.作用:匯入常用的標頭檔案; 3.亂碼轉中文的檔案類在素材裡 4.關聯PCH:點選專案 Buiset欄 搜header 改寫PCH的路徑(拖到終端得到路徑)這樣寫是全路徑,不能跨平臺 5.另一種方法:隨便輸入一個字元編譯下,然後輸入

20150718第11天筆記

零碎知識 快捷鍵 1.自己百度 2.有多少字典就有多少個模型 3.根型別決定控制器要定義的存資料的型別 4.從檔案獲取資料稱作“解析” 5.匯入標頭檔案的快捷鍵 6.外掛整理程式碼格式 7.pickView的資料來源方法 8.標題forRow,檢視forRow 9.連

20150715第10天筆記

1.螢幕的發展過程導致螢幕適配的技術在更新 1)4S以前螢幕不變,且應用程式沒有橫屏和豎屏都存在的,於是用的是frame技術 2)ipad的出現,1)螢幕改變 2)橫屏和豎屏都存在,於是出現了autoresizing技術:解決父子關係 3)5以後,橫屏和豎屏的應用變的越來越多,要

20150713第九天筆記

QQ好友列表細節歸納 ===在控制器=== 1.將Main.storyboard對應的的控制器換成自定義的控制器 面板設定 2.設定組高:self.tableView.sectionHeaderHeight = 44; 3.根據組模型特點返回對應行數:return group.o

20150711第八天筆記

細節歸納 一、控制器裡的細節 1)是否允許cell被選中 self.tableView.allowSelection = NO; 2) 設定分割線的樣式 self.tableView.separatorStyle = UITableViewCellSeparatorSt

20150709天筆記

團購思路歸納 1.自帶cell -(UITableViewCell *) tableView:(UITableView *)TableView cellforRowAtIndexPath:(NSIndexPath *)indexPath { //定義一個靜態標識(命名和業

20150706第五天筆記

2015年07月06日11:37:04 新知識 1.告訴scrollView控制元件的滾動的範圍 圖片不動的的 self.scrollView.contentSize = [UIImage [email protected]“yidong”].size; 2.在s

20150704天筆記

應用管理 2015年07月04日14:04:52 思路歸納 1.影象變大 1)記錄原來影象的frame,以便在恢復方法裡用 2)計算放大後圖片的位置 要考慮的 動畫的時候 只做改變frame的操作 3)建立並新增一個遮罩層(實際是個按鈕),設定其背景顏色,開始透明度,註

20150703第三天筆記

2015年07月03日12:09:46 細節歸納 1.獲取螢幕的寬度 CGFloat screenW = self.view.frame.size.width; 2.求邊距 (螢幕的寬度-列數*app的寬度)/ (列數+1) 3.用fame初始化一個UIView物件 UI