close

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。

 

2.如何让游戏中某个游戏对象不受Time.timeScale影响。

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;
if(onComplete!=null)
{
onComplete();
}
}
else
{
animation.Play(clipName);
}
}

轉貼自:http://www.xuanyusong.com/archives/2956

 

arrow
arrow
    全站熱搜

    GABY 發表在 痞客邦 留言(0) 人氣()