unity中差值函數(shù)
在做攝像機(jī)移動時候,在網(wǎng)上查看代碼,發(fā)現(xiàn)有兩個類似的函數(shù)
Lerp()函數(shù)
SmoothDamp()函數(shù)
兩個差值函數(shù)都可以在攝像機(jī)平滑移動或者顏色漸變上使用。下邊就簡單介紹一下兩個函數(shù)。
學(xué)習(xí)這兩個函數(shù)主要是來自博主@巨龍餓了:https://www.jianshu.com/p/650e5ff6402c的兩篇文章。
1.Lerp
unity常見的API中Vector3.Lerp Mathf.Lerp等是較為常用
//a:變化的起始值
//b:變化的目標(biāo)值
//t:本次調(diào)用返回值所占b和a的差值的比例
/
/返回值為一個float類型
public static float Lerp(float a, float b, float t);
這種差值在最初的使用,是放在update中進(jìn)行每幀運(yùn)行
這里舉一個例子,如果x從0到10進(jìn)行移動:

第一幀:移動到當(dāng)前位置(0,0,0)到(10,0,0)的十分之一,也就是(1,0,0)
第二幀:移動到當(dāng)前位置(1,0,0)到(10,0,0)的十分之一,也就是(1.9,0,0)
第二幀:移動到當(dāng)前位置(1.9,0,0)到(10,0,0)的十分之一,也就是(2.71,0,0)
后面以此類推...
在自己親自嘗試之后,發(fā)現(xiàn)lerp的用法會使值無限接近目標(biāo),但不等于目標(biāo)。
當(dāng)然也可以通過每一幀去改變第三個參數(shù)的值,讓第三個值從0逐漸變化到1,也就可以實(shí)現(xiàn)平滑,并且可以準(zhǔn)確的知道變化結(jié)束的那一刻了。

2.SmoothDamp
SmoothDamp的效果類似于Lerp的第一種用法所產(chǎn)生的效果,如果是作用在位移上,表現(xiàn)為慢慢減速到達(dá)目標(biāo)位置,見名思意Damp(阻尼)就像是受到了阻力而減速,而這個函數(shù)和Lerp不同的地方則在于他的Smooth(平滑),因?yàn)槠鋬?nèi)部實(shí)現(xiàn)是遭輪子大佬調(diào)整過無數(shù)次參數(shù)得到的值,相比起Lerp簡單粗暴的插值,在表現(xiàn)上看起來會優(yōu)秀不少,所以一般如果用于攝像機(jī)平滑,都會使用SmoothDamp的。
//current:需要改變的參數(shù)的當(dāng)前值,一般放在update中將每一幀的當(dāng)前值傳入
//target:目標(biāo)值
//currentVelocity:函數(shù)所作用目標(biāo)移動的最大速度,這個所謂的速度,表征的是該物體每秒移動Unity內(nèi)多少個單位。
(需要注意的是:首先在傳參時記得加上
的內(nèi)部會更新這個值并且傳遞出來,其次,這個傳入的參數(shù)的生命周期需要比SmoothDamp長,因?yàn)镾moothDamp內(nèi)部會根據(jù)上一次計(jì)算得到的速度,去更新下一次的位置,簡單的方法就是把這個傳入的參數(shù)設(shè)為全局變量)ref
關(guān)鍵字,因?yàn)?code>SmoothDamp
//smoothTime:平滑的時間,但是經(jīng)過我的實(shí)測這個時間并不準(zhǔn)確有點(diǎn)小坑,希望有大神可以解答一下這個問題。
//maxSpeed:作用物體的最大速度。
public?static?float?SmoothDamp(float?current,?float?target,?ref float currentVelocity, float smoothTime, float maxSpeed);
使用方法與Lerp的第二種使用方法類似,在Update中去調(diào)用就可以了,不過需要注意需要將當(dāng)前值傳入current,而不應(yīng)該傳進(jìn)一個恒定的值。
