說(shuō)做網(wǎng)站被收債正規(guī)淘寶代運(yùn)營(yíng)去哪里找
問(wèn)題描述
游戲暫停的功能是通過(guò)設(shè)置timeScale=0實(shí)現(xiàn)的,不過(guò)在暫停游戲的時(shí)候,需要對(duì)角色進(jìn)行預(yù)覽和設(shè)置,為了實(shí)現(xiàn)這個(gè)功能,是通過(guò)鼠標(biāo)控制相機(jī)的操作,為了使相機(jī)的操作絲滑,獲取鼠標(biāo)操作系數(shù)乘以Time.deltaTime 了,同時(shí)對(duì)數(shù)值進(jìn)行了平滑操作(Mathf.SmoothDamp和Mathf.SmoothDampAngle),采用了具體代碼可以參考https://blog.csdn.net/qq_33789001/article/details/120551521。
代碼片段如下:
//根據(jù)鼠標(biāo)系數(shù)獲取距離目標(biāo)值
tdis -= Input.GetAxis("Mouse ScrollWheel") * disMoveSpd * Time.deltaTime;
//平滑處理距離值
dis = Mathf.SmoothDamp(dis, tdis, ref zVel, 0.5f);//根據(jù)鼠標(biāo)系數(shù)獲取旋轉(zhuǎn)目標(biāo)值
troty = troty + Input.GetAxis("Mouse X") * XSens * Time.deltaTime;
trotx = trotx + Input.GetAxis("Mouse Y") * YSens * Time.deltaTime;
//平滑處理旋轉(zhuǎn)值
rotx = Mathf.SmoothDampAngle(rotx, trotx, ref RxVel, 0.3f);
roty = Mathf.SmoothDampAngle(roty, troty, ref RyVel, 0.3f);
當(dāng)游戲暫停后(timeScale=0),Time.deltaTime的數(shù)值都變成0了。
解決辦法
解決的思路就是在暫停時(shí)不用Time.deltaTime,而是通過(guò)固定幀率計(jì)算出這個(gè)值。比如假設(shè)游戲是60幀,那么數(shù)值就是1/60 = 0.0167f,這個(gè)數(shù)值是根據(jù)幀率越大,而值越小的,120幀就是0.008333。那么我就按60幀手動(dòng)賦值0.0167f。代碼修改如下:
//根據(jù)鼠標(biāo)系數(shù)獲取距離目標(biāo)值
tdis -= Input.GetAxis("Mouse ScrollWheel") * disMoveSpd * 0.0167f;
//根據(jù)鼠標(biāo)系數(shù)獲取旋轉(zhuǎn)目標(biāo)值
troty = troty + Input.GetAxis("Mouse X") * XSens * 0.0167f;
trotx = trotx + Input.GetAxis("Mouse Y") * YSens * 0.0167f;
這樣能解決Time.deltaTime為0,鼠標(biāo)的操作都失效的問(wèn)題。
然而,運(yùn)行后發(fā)現(xiàn)部分操作還是會(huì)失效,而且操作過(guò)程中會(huì)出現(xiàn)這樣的報(bào)錯(cuò):
is not valid. Input position is { NaN, NaN, NaN }.
經(jīng)過(guò)研究發(fā)現(xiàn) Mathf.SmoothDampAngle和Mathf.SmoothDamp兩個(gè)函數(shù)與Time.deltaTime仍有關(guān)聯(lián),他們的說(shuō)明如下
它們都有deltaTime參數(shù),這個(gè)時(shí)間是上次調(diào)用這個(gè)函數(shù)的到這次調(diào)用的間隔時(shí)間,默認(rèn)為T(mén)ime.deltaTime。因?yàn)橹罢{(diào)用這兩個(gè)函數(shù)都沒(méi)有進(jìn)行這個(gè)傳參默認(rèn)是Time.deltaTime這種情況下為0。所以在這種情況下還需要傳入maxSpeed和deltaTime參數(shù)。經(jīng)過(guò)修改如下:
//平滑處理距離值
dis = Mathf.SmoothDamp(dis, tdis, ref zVel, 0.5f, 2, 0.0167f);//平滑處理旋轉(zhuǎn)值
rotx = Mathf.SmoothDampAngle(rotx, trotx, ref RxVel, 0.3f, 2, 0.0167f);
roty = Mathf.SmoothDampAngle(roty, troty, ref RyVel, 0.3f, 2, 0.0167f);
做了上述修改可以正常操作: